写点 u8 KEY_Scan(u8 mode) 按键扫描函数的分析。老鸟就别笑我了

2019-07-20 22:25发布

本帖最后由 若不俗和inide 于 2016-9-2 20:10 编辑

最近身边的很多同学都在学习原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序。由于问的人多,所以我也写了个心得,分享一下,老鸟别喷我哈。先贴上代码吧:

//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!


u8 KEY_Scan(u8 mode)      //mode:0,不支持连续按;   1,支持连续按;
{         
        static u8 key_up=1;//按键按松开标志  //flga
        if(mode==1)   {key_up=1;}     
        if(key_up==1 &&(KEY0==0||KEY1==0||WK_UP==1)) //如果有一个按键按下
        {
                delay_ms(10);//去抖动
                key_up=0;
                if(KEY0==0)     return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(WK_UP==1)return WKUP_PRES;
        }
        else if(KEY0==1&&KEY1==1&&WK_UP==0)
        {key_up=1;}
        return 0;// 无按键按下
}首先必须搞懂static这个关键字,用这个关键字定义的变量,其值会保存,下次再执行这个函数的时候。不会被初始化。也就是说有点类似与全局变量,值是会保存上一次赋值过后的值。
下面我们一句一句来分析代码。
首先我们假设将mode =1,设置成支持连续按下。同时假设KEY0按下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
46条回答
南有乔木
1楼-- · 2019-07-23 18:05
 精彩回答 2  元偷偷看……
lsy3500
2楼-- · 2019-07-23 21:13
非常感谢楼主,这个程序看了半天都是似懂非懂,现在明白了。~~~~
xiaochu312
3楼-- · 2019-07-23 21:29
南有乔木 发表于 2017-2-24 08:46
是不是static关键字主要是作用于mode=0,让key_up=0用于下一次按键检测

不是的,你去看看static关键字的说明,static u8 key_up=1,初始化后 key_up会一直=1,而且只初始化一次,mode=1的话就是一直让key_up==1,有按键按下之后,软件key_up=0;当再次调用扫描函数时,不会再运行static u8 key_up=1,这条语句,你软件仿真一下就明白了
lzyele
4楼-- · 2019-07-23 23:12
xiaochu312 发表于 2017-1-30 21:23
LZ,支持连续按键的分析不对。

1. static u8 key_up=1;(mode=1,这句不会运行 ...

我同意你的观点
lzyele
5楼-- · 2019-07-24 03:57
 精彩回答 2  元偷偷看……
dczjn
6楼-- · 2019-07-24 05:36
本帖最后由 dczjn 于 2017-3-12 11:18 编辑

u8 KEY_Scan(u8 mode)的参数mode,有哪条语句可判断mode是0或1

一周热门 更多>