分享一个简单的按键扫描程序,方便有需要的用户搜索参考。
例程使用定时器分时调度,定时每毫秒检测一次按键状态,有按键时累加计数器,没有按键时清除计数器。
连续计数50次表明按键按下并持续50ms(防抖),设置按键有效状态标志:
- if(!KEY1)
- {
- if(!Key1_Flag)
- {
- Key1_cnt++;
- if(Key1_cnt >= 50) //50ms防抖
- {
- Key1_Flag = 1; //设置按键状态,防止重复触发
- Key1_Function = 1;
- }
- }
- }
- else
- {
- Key1_cnt = 0;
- Key1_Flag = 0;
- }
复制代码
检测连续1s为低电平则判定按键长按有效;连续低电平时间大于50ms并小于1s则判定为按键短按有效:
- if(!KEY2)
- {
- if(!Key2_Flag)
- {
- Key2_cnt++;
- if(Key2_cnt >= 1000) //长按1s
- {
- Key2_Short_Flag = 0; //清除短按标志
- Key2_Long_Flag = 1; //设置长按标志
- Key2_Flag = 1; //设置按键状态,防止重复触发
- Key2_Long_Function = 1;
- }
- else if(Key2_cnt >= 50) //50ms防抖
- {
- Key2_Short_Flag = 1; //设置短按标志
- }
- }
- }
- else
- {
- if(Key2_Short_Flag) //判断是否短按
- {
- Key2_Short_Flag = 0; //清除短按标志
- Key2_Short_Function = 1;
- }
- Key2_cnt = 0;
- Key2_Flag = 0; //按键释放
- }
- }
复制代码
此外,推荐一份社区大神分享的按键扫描方法介绍的帖子:
【分享】按键程序,大道至简,按键扫描 + 累计主循环次数去抖动/不占用定时器
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5936
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区) |