求教stm32的按键扫描程序

2019-10-15 21:47发布

求教大神一个按键扫描程序的编程思路,按键要实现的功能是按住后松开才算一次触发,目前我设置标志位可以实现一个按键的触发,但在原来基础上加上两个按键按下就没反应了,连原来的第一个按键也没反应,有关部分程序如下:
u8 key_up=1;   //按键标志位,松开1,按下0
#define KEY1  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)//读取按键1


u8 KEY_Scan(void)
{         
        u8 key=0;
        /* 按键1扫描 */
        if(key_up && KEY1==0)
                  {
                          delay_ms(10);
                          key_up=0;
                  }
        else if(key_up==0 && KEY1==1)
                {
                        delay_ms(10);
                        key_up=1;
                        if(KEY1==1 )
                              return key=KEY1_PRES;
                }

       else if(KEY==1)


                 key_up=1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
feilusia
1楼-- · 2019-10-16 21:38
qwerjj 发表于 2016-12-26 16:35
怎么用定时器决定?你的意思是定时器每到一次更新事件才执行按键扫描?

按键分中断和查询两种方式。
其中查询方式的按键又分阻塞方式(例如delay_ms(10);)和非阻塞方式。

非阻塞方式的查询方式,又可以通过轮询方式查询(我博客方式)、通过定时器方式查询(如10ms查询一次是否有按键)。
定时器比较准,但功耗更高。
东北小辉辉
2楼-- · 2019-10-17 00:06
 精彩回答 2  元偷偷看……
feilusia
3楼-- · 2019-10-17 03:26
东北小辉辉 发表于 2016-12-26 16:52
请教一下,为什么说定时器查询的方式功耗更高呢?无论裸机还是操作系统,都是需要一个节拍的,感觉完全是 ...

任何外设都耗电。
你说的是时间误差大不大?有误差,不大。
qwerjj
4楼-- · 2019-10-17 03:36
feilusia 发表于 2016-12-26 16:40
按键分中断和查询两种方式。
其中查询方式的按键又分阻塞方式(例如delay_ms(10);)和非阻塞方式。

原来如此,受教了
东北小辉辉
5楼-- · 2019-10-17 03:55
feilusia 发表于 2016-12-26 17:03
任何外设都耗电。
你说的是时间误差大不大?有误差,不大。

好的,谢谢指教。
yangkefeng
6楼-- · 2019-10-17 06:20
qwerjj 发表于 2016-12-26 16:28
谢谢,问题已解决,额。。我提个疑问,你的程序里while(KEY!=0)这句,如果满足条件也就是松开不就会一直 ...

写错了。。。应该是while(KEY==0)没注意

一周热门 更多>