单片机_按键——单击,双击,长按

这篇具有很好参考价值的文章主要介绍了单片机_按键——单击,双击,长按。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

按键



一、等待按键释放

方式1

#define		key		PX.X//定义按键的脚位
//-----------------------------------------
void	Scan_Key0(void)
{
	if(key==0)
	{
		delay(10);//10ms消抖
		if(key==0)
		{
			//Add your code			if(on) on	= 0; else on = 1;
			while(key==0)	//等待按键释放
				nop;
		}
	}
}

方式2

#define		key		PX.X//定义按键的脚位
//--------------------------------------------
void	Scan_Key0(void)
{
	int Icnt = 1000;
	while(1)
	{
		if(!key)
		{
			Icnt--;	//用连续稳定值,去除按键抖动或其他信号干扰(如电源抖动,高频信号干扰)
			if(Icnt==0)
			{
				//User add code			if(on) on	= 0; else on = 1;
				while(key==0)	//等待按键释放
					nop;
				break;
			}
		}
		else
		{
			break;			//有一个点不稳定就放弃
		}
	}
}

方式3

#define		key		PX.X//定义按键的脚位
//-------------------------------------------------
void	Scan_Key0(void)
{
	if(key==0)
	{
		delay(10);//10ms消抖
		int Icnt = 500;
		while(key==0)
		{
			icnt--;
			if(icnt==0)
			{
				//User add code			if(on) on	= 0; else on = 1;
				while(key==0)	//等待按键释放
					nop;
			}
		}
	}
}

二,无需等待按键释放

#define	key		Px.x//定义按键的脚位
int		Key_Sign;	
int 	Key_Icnt;

void	Scankey(void)
{
	if(Key_Sign)
	{
		if(!Key)//判断按键是否按下
		{
			delay(10);//10ms消抖
			Key_Icnt--;
			if(Key_Icnt==0)//判断按键是否真的按下
			{
				Key_Sign = 0;//按键按下,开始进入松开扫描
				//================
				//user code
				//================
			}
		}
		else
		{
			Key_Icnt = 200;
		}
	}
	else
	{
		if(Key)//扫描按键是否松开
		{
			Key_Sign = 1;//按键松开,开始进入按键扫描
			Key_Icnt = 200;
		}
	}
}

三,按键长按或短按

#define		Key		Px.x//定义按键的脚位

int		Work_Off_Sign;
int	    Key_Keep;
int	    Key_Long_Sign;
int		Delay1;
int		Delay0;

void	Scankey(void)
{
	if(Key_Keep==0)
	{
		Delay1 = 100;
		if(Key==0)//判断是否有可能有按键
		{
			delay(10);//10ms消抖
			Delay0--;
			if(Delay0==0)//判断按键是否确定触发
			{
				Key_Keep = 1;
				Key_Long_Sign = 0;
				word Delay_Icnt = 0;
				while(!Key)//等待,判断按键是否有长按
				{
				   delay(10);//10ms消抖
					Delay_Icnt++;
					if(Delay_Icnt >= 500)//大于一定时间确定长按
					{
						Key_Long_Sign = 1;
						break;//确定长按后退出按键扫描进行下面的程序
					}
				}
				if(Key_Long_Sign)//长按
				{
					Work_Off_Sign = 1;
				}
				else//短按
				{
					Work_Off_Sign = 0;
				}
			}
		}
		else
		{
			Delay0 = 100;
		}
	}
	else
	{
		Delay0 = 100;
		if(Key)
		{
			delay(10);//10ms消抖
			Delay1--;
			if(Delay1==0)
			{
				Key_Keep = 0;
			}
		}
		else
		{
			Delay1 = 100;
		}
	}
}

四、单击,双击,长按

#define KEY_DOWN_return           1  //单击
#define KEY_Double_return         2  //双击
#define KEY_Long_return           3  //长按
#define KEY_LONG_FREE_return      6  //长按结束

#define double_time_MIN       80  //双击按键,在这个时间范围内,按下两次则认为有效
#define Long_press_time_MAX   120  //长按,超过这个时间则认为是长按;
#define Dithering_MIN         5  //消抖值
#define UP_KEY_Count        5  //抬起值

#define KEY_UP      1//按键抬起
#define KEY_Down    0//按键按下

#define KEY_Number_MAX  1 //按键个数,开辟多少字节数组

#define KEY1_adder    0 //按键计数数组地址
//#define KEY2_adder   1 //按键计数数组地址
//#define KEY3_adder   2 //按键计数数组地址

#define  Read_Key1_Value    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)//读取按键1的值

unsigned int  KEY_Count_time[KEY_Number_MAX];//按键计时,调用的时候,要填按键地址,避免重复
unsigned char KEY_up_clsse_time[KEY_Number_MAX];//按键抬起取消计时,
unsigned char KEY_Count_down[KEY_Number_MAX];//按键按下次数
unsigned char KEY_Dithering[KEY_Number_MAX];//按键消抖

unsigned char KEY_event[KEY_Number_MAX];//按键的事件
unsigned char KEY_Read[KEY_Number_MAX];//按键读取状态

/*
    * @name   Button_all_state
    * @brief  MUC按键检测
    * @param
    * @retval None
    * othen: 历遍所有的按键
*/
void  Button_all_state()
{

    KEY_Read[KEY1_adder]=Read_Key1_Value;
    //  KEY_event[KEYX_adder]=Read_KeyX_Value;
}
/*
    * @name   KEY_Detect
    * @brief
    * @param
    * @retval None
    * othen:按键检查函数,传递不同的值,实现不同的按键按下
*/
void  KEY_Detect()
{
    unsigned char i=0;
    Button_all_state();//更新按键状态

   for(i=0;i<KEY_Number_MAX;i++) //历遍
   {
       if(KEY_Read[i]==KEY_Down)//按键按下
       {


           if(KEY_Dithering[i] > Dithering_MIN)//消抖值
           {

               if(KEY_Count_time[i] >= Long_press_time_MAX)
               {
                   KEY_event[i] = KEY_Long_return;
               }
               else
               {
                   KEY_Count_time[i]++;
               }
               if(KEY_up_clsse_time[i] != 0)
               {
                   KEY_up_clsse_time[i] =0;
                   KEY_Count_down[i]++;
               }
           }
           else
           {
               KEY_Dithering[i]++;
               KEY_Read[i]=0;//按键刷新
           }

       }
       else//按键松开
       {

           if( ++KEY_up_clsse_time[i] > UP_KEY_Count) {//按键抬起

               if ((KEY_Count_time[i] < double_time_MIN)&& ( KEY_Count_down[i] >= 2) ) { //双击
                     KEY_event[i] =  KEY_Double_return;
                     KEY_up_clsse_time[i] = UP_KEY_Count;
               }
               else if((KEY_Count_time[i] > 1)&&(KEY_Count_time[i] < Long_press_time_MAX)){ //单击
                     KEY_event[i] = KEY_DOWN_return ;
                     KEY_up_clsse_time[i] = UP_KEY_Count;
               }
               else if(KEY_Count_time[i] > Long_press_time_MAX){ //长按抬起
                   KEY_event[i] = KEY_LONG_FREE_return;
                   KEY_up_clsse_time[i] = UP_KEY_Count;
               }
               KEY_up_clsse_time[i] =0;
               KEY_Count_time[i]= 0;//按键计时更新
               KEY_Dithering[i] = 0;//消抖更新
               KEY_Read[i]=0;//按键刷新
               KEY_Count_down[i]=0;
           }

       }

   }
}

调用文章来源地址https://www.toymoban.com/news/detail-603617.html

          KEY_Detect();
          if(KEY_event[KEY1_adder] ==  KEY_DOWN_return )
          {
              printf("单击\r\n");
              KEY_event[KEY1_adder]=0;
          }
          else if(KEY_event[KEY1_adder] ==  KEY_Double_return  )
          {
              printf("双击\r\n");
              KEY_event[KEY1_adder]=0;
          }
          else if(KEY_event[KEY1_adder] ==  KEY_Long_return )
          {
              printf("长按\r\n");
              KEY_event[KEY1_adder]=0;
          }

到了这里,关于单片机_按键——单击,双击,长按的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑

    最近学习了一下Unity InputSystem。该系统可用于实现、管理复杂的操作逻辑,上限很高。但由于它有一定的学习成本,导致一些和我一样的小白一入门时不得要领。之前卡住我的一个需求就是通过InputSystem 实现同一按键单击、双击、长按执行不同逻辑。例如点击单位执行攻击、

    2024年02月05日
    浏览(38)
  • (软件02)单片机按键处理,区分短按与长按

    本文目录     本篇前言     代码思路     实操练习 本篇前言         今天接着上篇与大家继续分享软件方面关于按键事件的处理,上篇软件01篇已提到整个软件框架时基的处理,其中提到了关于按键的处理,这篇将具体地介绍按键处理的思路与实例。         话不

    2024年02月03日
    浏览(29)
  • STM32 -- 实现按键的长按与短按检测(其他单片机可移植)

    目录 资源获取 一 前言 二 思路  三 实现代码 1.主要代码 四 完整代码 Key.h Key.c 该改进版本(1ms太繁琐了,我改成了25ms检测一次)   1.定时器部分 2.按键检测部分  五、参考 欢迎关注微信公众号--星之援工作室 发送(长短按检测) 今天在逛博客的时候,偶然看到了一

    2024年02月12日
    浏览(26)
  • 嵌入式51单片机04-矩阵按键系列

    一、矩阵按键基础知识 矩阵按键工作原理 : 逐行扫描 :通过高四位轮流输出低电平来对矩阵键盘进行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过判断低四位数据中哪一位为零来判断哪一个按键被按下。 逐列扫描 :通过低四位轮流输出低电平来

    2024年02月07日
    浏览(49)
  • 蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    此片文章用于记录蓝桥杯单片机的学习 篮球杯单片机上的矩阵按键原理图如下:   使用矩阵键盘时,要将跳线帽J5跳至KBD模式。   值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。  

    2023年04月10日
    浏览(36)
  • 学习笔记|ADC反推电源电压|扫描按键(长按循环触发)|课设级实战练习|STC32G单片机视频开发教程(冲哥)|第十八集:ADC实战

    19.5.4 利用ADC第15通道(内部1.19V参考信号源)测量外部电压或电池电压 注意:这里的1.19V不是ADC 的基准电压ADC-Vref+,而是ADC15通道的固定输入信号源,1.19V STC32G系列ADC的第15通道用于测量内部参考信号源,由于内部参考信号源很稳定,约为1.19V,且不会随芯片的工作电压的改变而变化

    2024年02月07日
    浏览(33)
  • Unity 单击、双击、长按事件处理

    想要一个工具,能够同时集成单击、双击、长按的功能 通过IPointerDownHandler, IPointerUpHandler, IPointerClickHandler这三个接口就可以监听点击状态,然后再通过不同的点击状态来处理相应的事件 由于可能同时存在多个事件,实际开发过程中会出现多余事件通知,如下: 同时拥有单击

    2024年02月11日
    浏览(37)
  • 【Unity知识点详解】Button点击事件拓展,单击、双击、长按实现

    Button拓展         今天来聊一下关于Button的事件拓展,这里只是拿Button来举例,Unity中其他的UI组件如Toggle、Slider等都也适用。         我们知道在Button中我们可以通过onClick的方式来添加点击事件,但在游戏开发过程中我们往往对Button有着更多的功能需求,比如说双击、

    2024年04月10日
    浏览(31)
  • 「Python|Selenium|场景案例」如何模拟鼠标单击、双击、右击、长按和拖拽等操作?

    本文主要介绍如何在使用selenium进行自动化测试的时候模拟各种鼠标操作。 在进行自动化测试的时候,我们可能会需要需要进行鼠标操作的场景,比如: 测试右击,查看是否网页是否屏蔽了右键菜单 面对滑块式登录验证方式,模拟拖拽 模拟前进或后退等鼠标扩展操作 ……

    2023年04月08日
    浏览(37)
  • 单个按钮实现长按开关机,短按可以当普通按钮控制单片机

    在看郭天祥老师的课程时学到的电路,之后发现这种控制原理很流行。 核心思路有两个: 1、用两个二极管隔离开q1和io_check,两端都可以响应按钮的状态,从而实现按钮复用。 2、用d2和q2,实现了与的功能,两者任意一个对地短路都可以保持mcu供电。 使用步骤: 1、长按sw

    2024年01月18日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包