1325986650 发表于 2025-2-14 22:22:29

分享一个自己适用的按键程序 短按 和长按

自己适用编码器,只有一个按键。做了一个短按和长按程序。

首先这个程序放到中断程序中执行(中断定时1毫秒,自己根据定时时间可以调整长按时间)

bit KEYflag,KEYshort_flag,KEYlong_flag; //按键按下标志
u16 KEYdelay;//按键检测延时时间
u8KEY_set;



void keyscan()
{

        if(!KEY)                                                                                                                // 按键按下
          {
                  if(KEYflag == 0)                                                                                        // 当按下标志为0时(系统启动默认就是0)
                  {                                                                                                                                                       
                             KEYdelay++;                                          
                                       KEY_set = 1;                                                                                              
         if(KEYdelay>=2000)                                                                        // 按下时间大于4秒以上表示    长按
                              {
                                          KEYflag = 1;                //防止再次进入此中断循环。
                                          KEYlong_flag = 1;
                                          KEYdelay=0;
                                                  KEY_set = 0;
                             }
              }
          }               
        if(KEY)                           // 按键松开以后根据按键时间判断按键状态
                {
                       if(KEY_set)
                          {
                           if(KEYdelay<=20)    //无效   相当于去抖动
                                     {
                                            KEYflag = 0;
                                            KEYdelay = 0;
                                             KEYlong_flag = 0;
                                             KEYshort_flag =0;
                                             KEY_set = 0;
                                     }
                               if(KEYdelay>40 && KEYdelay<2000)//短按
                                  {
                                                  KEYflag = 0;
                                                KEYdelay = 0;
                                             KEY_set = 0;
                                             KEYshort_flag =1;        //根据这个标志执行自己的程序 执行完后将此标志归0                          
                                  }
                          }
                else//没有按键动作
                             {
                                                      KEYflag = 0;
                                                        KEYdelay = 0;
                                                      KEYlong_flag = 0;
                                             KEYshort_flag =0;
                                     KEY_set = 0;
                             }
                }                       

}


if(KEYshort_flag)   { KEYshort_flag = 0; 执行自己的短按程序 }
if(KEYlong_flag){KEYlong_flag = 0;执行自己的长按程序 }

晓飛飛 发表于 2025-2-15 15:45:03

我也写过类似代码,用定时器中断里面写状态机实现短按 长按 双击等操作,

1325986650 发表于 2025-2-15 22:52:55

这个不使用延时 不拖后腿

angalp 发表于 2025-2-20 13:10:25

{:4_250:}实用

机灵小老鼠 发表于 2025-2-20 15:05:19

优秀
页: [1]
查看完整版本: 分享一个自己适用的按键程序 短按 和长按