找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1258|回复: 4
打印 上一主题 下一主题
收起左侧

单片机按键长按 短按 和连发程序还是有问题,请大家赐教,不胜感激

[复制链接]
跳转到指定楼层
楼主
ID:686513 发表于 2022-12-3 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我需要长按 短按 和连发(连按一直加或减)三个功能,之前发过一        贴,长按后会跟随一次短按,现在我又加了一个状态,现在连短按都不对了,请大师们赐教,不胜感激!               
#define PD 0x22|(P1&0x51)|(P2<<1&0x80)|(P3<<2&0x0c)   //P1.0/P3.0 p3.1/P4.2 p4.3组合5个按键为1个字节数据
单片机源程序如下:
/*******************************************************************************
* 文件名:按键函数
* 描  述: 放入定时器10ms扫描一次
* 功  能:
* 参  数:无
*******************************************************************************/        
void key_scan()
{
        static u8 cnt ;
        static u8 state=S0;
        u8 key;                 
  key = PD&0xFF;                                
  switch(state)   //检测状态                              
   {
        case S0:                                          //状态0
      if(key!= 0xFF) state = S1; break;        //判断输入是否为0,为0转入状态1      
               
   case S1:                                             //状态1
      if(key==0xFF) state = S0;                //判断输入是否为1,为1返回状态0
      else                                              //否则,转入状态2,执行按键程序
        {
         state=S2;
         }
       break;
case S2:                                                 //状态2
        if(key != 0xff)                            //还是按下的状态     
           {
            state = S3;
             }
        else                                        //松开了,短按
             {  

                 switch(key)
                   {
                      case 0x7F:     执行短按任务;          break;                                                                                                        
                      case 0xfe:      执行短按任务;          break;        
                      case 0xFB:     执行短按任务;          break;
                      case 0xBF:     执行短按任务;          break;               
                      case 0xF7:          执行短按任务;          break;                                
                      case 0xEF:          执行短按任务;          break;                                                                        
                         default:break;               
                      }                           
              }                                          
          break;        
                                                
                                                                                
        case S3:    //判断长按短按
               if(key != 0xff)
                {
                if(++cnt > 150)           //1500ms
                   {
                   cnt = 190;
                    state = S4;                                                        
                  }
            }
               
            break;
                                
  case S4:       //长按松手检测
                if(key == 0xff)   //松开了
                   {
                    cnt = 0;                                         
                     switch(key)
                        {         
                          case 0xfe:   此键执行长按任务 ;    break;                                                
                        }                                                
                    }
               else if (++cnt>=200)       //连按
                        {
                            cnt = 190;               //100ms触发一次
                         switch(key)
                           {
                              case 0x7F:     执行连按任务;          break;                             
                              case 0xFB:     执行连按任务;          break;                                                                                       
                          default:break;               
                        }                           
          break;        
                                                                                                
         }
}        

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2022-12-3 20:37 | 只看该作者
给你一个示例参考 4位冒号数码管时钟 单键调时 仿真.rar (129.93 KB, 下载次数: 34)

回复

使用道具 举报

板凳
ID:686513 发表于 2023-1-7 08:27 | 只看该作者
wulin 发表于 2022-12-3 20:37
给你一个示例参考

丰常感谢,但这个键只能识别短按和连按,我想实现一个键有短按,长按和连按的功能,如短按选项,连按连续加1,我还要增加一个长按关机,就不好实现了!
回复

使用道具 举报

地板
ID:130230 发表于 2023-1-9 11:31 | 只看该作者
回复

使用道具 举报

5#
ID:213173 发表于 2023-1-9 14:16 | 只看该作者
zhth1979 发表于 2023-1-7 08:27
丰常感谢,但这个键只能识别短按和连按,我想实现一个键有短按,长按和连按的功能,如短按选项,连按连续 ...

其实所谓连按就是长按,区别就在于长按执行一次任务,连按重复执行相同任务。例如K1短按进入菜单,再次短按选择菜单,......,直到退出。长按关机,K2、K3在菜单界面短按为+/-,长按为+++/---。但要在一个键里实现短按,长按和连按的功能有点麻烦。例如K1长按关机,短按选择菜单。在菜单状态短按为+1,直至允许的最大值后归0,长按为连加+,直至允许的最大值后归0。再次短按切换菜单选项,直至短按退出菜单。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表