你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于SYSTICK中断的键盘状态机扫描

[复制链接]
wamcncn 发布时间:2015-1-27 20:38
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了
void Key_Scan(void)
{      
    static unsigned int KeyStateTemp = 0;   //初始化键盘状态变量
    static unsigned int KeyTime=0;             //初始化按键时间变量

   
switch(KeyStateTemp)
{
  case StateInit:      
   if(!KEY1_USER)                                              //判断按键是否按下
    KeyStateTemp = StateAffirm;
   break;
  case StateAffirm:     
   if(!KEY1_USER)   
   {
    KeyTime = 0;
    KeyStateTemp = StateSingle;
   }
   else KeyStateTemp = StateInit;  
   break;
  case StateSingle:     
   if(KEY1_USER )   
   {
    KeyStateTemp = StateInit;   
    num++;
                sprintf(buffer,"%-16d",num);                   //把按键次数转换成字符
          display_x(0x98,buffer);                                  //把转换的按键次数显示到液晶上                 
    if(125== num)  num = 0;
   }
   else if(++KeyTime> 50)  //如果按键时间大于50*20MS
   {   
               
                    KeyStateTemp = StateRepeat;
                    KeyTime = 0;
      
            }
   break;
  case StateRepeat:     
   if(KEY1_USER )
    KeyStateTemp = StateInit;
   else if(++KeyTime> 10)   //如果按键时间大于10*20
    {      
                    KeyTime = 0;
                   num++;
                    sprintf(buffer,"%-16d",num);
              display_x(0x98,buffer);  
     if(125== num)  num = 0;
    }
                break;
  
        default: KeyStateTemp = KeyStateTemp = StateInit; break;
}
  
}

中断函数的设置
void SysTick_Handler(void)
{     
   
       systick_num++;
    if(systick_num==20)
   {  
        Key_Scan();
      systick_num =0;           
   }
}


收藏 1 评论17 发布时间:2015-1-27 20:38

举报

17个回答
wamcncn 回答时间:2015-1-31 09:21:34
本帖最后由 wambob 于 2015-1-31 09:32 编辑
holts1 发表于 2015-1-31 09:12
抖动的时候仍会进中断,状态也跟着抖,如何消抖。


抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
wamcncn 回答时间:2015-1-31 09:35:17
holts1 发表于 2015-1-31 09:26
在20MS内会多次触发你的键盘中断,每次进去你的状态机的值都在变,你如何判断哪次是有效的 ? ...

是20MS进入中断检测一下键盘,不是触发键盘中断
holts1 回答时间:2015-1-29 08:10:11
wambob 发表于 2015-1-28 08:53
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉

你的键盘处理也在中断中,这个有点不合理
holts1 回答时间:2015-1-28 08:10:33
为什么放中断里 ?
wamcncn 回答时间:2015-1-28 08:53:02
holts1 发表于 2015-1-28 08:10
为什么放中断里 ?

进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
feel-376797 回答时间:2015-1-28 08:55:49
这办法好,省定时器
拼命三郎 回答时间:2015-1-28 09:26:21
谢谢分享
党国特派员 回答时间:2015-1-28 09:36:11
记得Atmel有硬件消抖。
wyxy163@126.com 回答时间:2015-1-28 15:08:58
提示: 作者被禁止或删除 内容自动屏蔽
holts1 回答时间:2015-1-29 08:11:15
而且你用键盘中断,消抖如何处理 ?
wamcncn 回答时间:2015-1-29 12:11:41
holts1 发表于 2015-1-29 08:11
而且你用键盘中断,消抖如何处理 ?

关于消抖,建议你看看状态机按键原理就明白了
holts1 回答时间:2015-1-30 08:17:28
wambob 发表于 2015-1-29 12:11
关于消抖,建议你看看状态机按键原理就明白了

你在键盘中断中处理按键,状态机原理有冲突啊?
拼命三郎 回答时间:2015-1-30 08:26:16
stm32.jpg
wamcncn 回答时间:2015-1-30 13:11:06
holts1 发表于 2015-1-30 08:17
你在键盘中断中处理按键,状态机原理有冲突啊?

请问冲突在哪
holts1 回答时间:2015-1-31 09:12:30

抖动的时候仍会进中断,状态也跟着抖,如何消抖。
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版