zoukankan      html  css  js  c++  java
  • 原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序

    近身边的很多同学都在学习原子哥的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按下。
    1. static u8 key_up=1;
    2. if(mode==1)   {key_up=1;}    来一个判断语句,如果mode==1 ,那么全程
    key_up=1。
    3.if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) ,由于key_up=1,假设按键key0又按下了。所以if语句成立。执行括号里面的内容。并且返回按键按下的值
    4. 先消抖, 
    key_up=0;  注意注意 重点来  key_up=0;    由于我们前面有一个判断语句 if(mode==1)   {key_up=1;}     所以key_up=0; 之后,瞬间  key_up又等于1了。
    5. 假设此时key0按键按着没有松开,所以KEY0==0,由于第4步所说的,key_up=0之后的瞬间  key_up又等于1了。
    6.所以此时此刻,if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 又成立了,又执行括号里面的内容。并且返回按键按下的值。如此循环下去,达到长按效果。
    7. 假设你此时将按键松开。自己想后面的吧。。。讲得够详细了。。。。。


    假设mode=0,设置成不支持长按。同时假设KEY0按下。
    1. static u8 key_up=1;
    2. if(mode==1)   {key_up=1;}    这句话直接变成没有的语句了。  
    if(0==1)   {key_up=1;}   0怎么可能等于1???
    3.3.if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) ,由于key_up=1,假设按键key0又按下了。所以if语句成立。执行括号里面的内容。并且返回按键按下的值
    4. 先消抖, 
    key_up=0;  接着判断哪个按键按下,返回按键按下的值。
    5.此时如果你还按着按键,也不会有作用了。 
    if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1))   因为此时key_up=0;  if语句不成立了。
    6.当你一松开手,马上进入        else if(KEY0==1&&KEY1==1&&WK_UP==0)   {key_up=1;}    当 按键都没有按下,{key_up=1;}   key_up又被重新刷新了,又等于1了。
    7.当你再次按下按键key0的时候,if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 又成立了。又再次进入循环体。  实现了单次按键的效果







       
     
     
     
     
       

      离线 

    0

    主题

    9

    帖子

    0

    精华

    初级会员

    Rank: 2

    积分
    52
    金钱
    52
    注册时间
    2017-1-24
    在线时间
    7 小时
    推荐
     
     发表于 2017-1-30 21:23:27 | 只看该作者
    本帖最后由 xiaochu312 于 2017-1-30 22:49 编辑

    LZ,支持连续按键的分析不对。

    1. static u8 key_up=1;(mode=1,这句不会运行了
    2. if(mode==1)   {key_up=1;}    来一个判断语句,如果mode==1 ,那么全程key_up=1。(key_up不会全程等于1)
    3.if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) ,由于key_up=1,假设按键key0又按下了。所以if语句成立。执行括号里面的内容。并且返回按键按下的值
    4. 先消抖, 
    key_up=0;  注意注意 重点来  key_up=0;    由于我们前面有一个判断语句 if(mode==1)   {key_up=1;}     所以key_up=0; 之后,瞬间  key_up又等于1了。(这里严重解释错误,应该是:延时消抖后,key_up=0,key_up重新赋值后的确是等于0了,不会发生瞬间  key_up又等于1这样的事情
    5. 假设此时key0按键按着没有松开,所以KEY0==0,由于第4步所说的,key_up=0之后的瞬间  key_up又等于1了。(5.按键按着没有松开,main()程序继续调用KEY_Scan(1)按键扫描程序,由于mode=1,所以if(mode)key_up=1; 

    6.所以此时此刻,if(key_up==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 又成立了,又执行括号里面的内容。并且返回按键按下的值。如此循环下去,达到长按效果。

  • 相关阅读:
    python基础学习1-函数相关
    python基础学习1-SET 集合
    Linux命令学习笔记1
    python基础学习1-字典的使用
    python基础学习1-列表使用
    Jzoj4743 积木
    Jzoj4786 小a的强迫症
    Jzoj4746 树塔狂想曲
    Jzoj5246 Trip
    Jzoj5245 Competing Souls
  • 原文地址:https://www.cnblogs.com/wolf-man/p/6686389.html
Copyright © 2011-2022 走看看