打印

分享战舰院子开发板中遇到的疑难点的理解(每隔2天更新)

[复制链接]
228|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大碴子味|  楼主 | 2018-7-5 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
战舰板子买来有1年多了,刚买时仅仅是看实验例程走一遍,很多东西都是似是而非,很多程序不是彻底明白。
如今毕业工作了,走的硬件研发工程师这条路,工作需要用到32,实习培训三个月后需要用32做个小项目考核,而我把当初32的内容都忘记了
只好重新学习,这次学习我要深刻理解每个教程的语句,理解后自己独立按照理解的内容重新编写.

计划是 把教程走一遍后,用32做各种小设计,由浅入深研究,研究后学做系统。都掌握后经常逛论坛和大家讨论

   以前的我只是享受论坛老人的恩惠,如今虽然我明白的不是很多,可是我能知道新人哪里容易不太懂,把自己对教程中的看法写出来供大家参考,
同时也希望各位前辈指导不足之处。

   念书时 发问题,有时候没有人回答,心里很不好受,如今工作了发现,事情好多呀,没有那么多的时间经常逛论坛,所以那,
对于很多人发的问题没有解决,请你不要生气,因为上班的人真的很忙。
   工作这10多天,培训外,自己把C语言重头系统的看了看,做好笔记,除了结构体那里不是太懂外,其余的可以说了解了。
建议各位亲,磨刀不误砍柴工,系统看看C语言,如果说你是学生,我更是希望你能仔细认真看看研究。
  
  昨天开会,经理说一个经验,就是在工作中遇到的问题和解决的办法用word记录好,以后需要用时查找搜索关键字就行,听了他的话
我有感而发 想把自己遇到的疑难点以及理解记录下来。同时给大家分享

言归正传

        1、关于引脚宏定义中库函数和位操作两种方法


       


         #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//库函数的宏定义


         #define KEY0&nbspEin(4)               //位操作的宏定义


            玩32都是从51等低端单片机过来的,对于这些库操作用的不是很方便熟练,此时由宏定义可知有如上两种简单操作,
通过这两种宏定义后,在主函数中我们就可以向51那种编程思路了,更容易理解。


            考虑到在不同32上的移植性,最好最好用库函数的宏定义


       
                2、按键处理函数
       
       
                //按键处理函数
       
       
                //返回按键值
       
       
                //mode:0,不支持连续按;1,支持连续按;
       
       
                //0,没有任何按键按下
       
       
                //1,KEY0按下
       
       
                //2,KEY1按下
       
       
                //3,KEY2按下
       
       
                //4,KEY3按下 WK_UP
       
       
                //注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
       
       
                u8 KEY_Scan(u8 mode)  //里的u8是返回值
       
       
                {         
       
       
                static u8 key_up=1;//static是静态变量只会程序运行第一次时执行一次
       
       
                //保证在按键全松开的情况下才开始检测
if(mode)key_up=1;  //支持连按
       
       
                /*如果keyup为1,同时key0123中有一个按键被按下,那么if为真,执行取值操作,作为返回值付给主函数的t,
(t是主函数内一个负责取KEY_Scan(u8 mode)得变量)  */
       
       
                if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
       
       
                {
       
       
                delay_ms(10);
       
       
                key_up=0;
       
       
                if(KEY0==0)return KEY_RIGHT;
       
       
                else if(KEY1==0)return KEY_DOWN;
       
       
                else if(KEY2==0)return KEY_LEFT;
       
       
                else if(KEY3==1)return KEY_UP;
       
       
                }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;          
       
       
                //如果上面的if为假,那么如果key0123没有一个被按下,那么keyup置1,
       
       
                         return 0;// 无按键按下
       
       
                }
       
       
                 
       
       
                来说说mode为0,不支持连按的情况。
       
       
                    第一次没有按键按下时,static u8 key_up=1;(此语句仅仅是第一次执行时有用)
       
       
                那么if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))中(KEY0==0||KEY1==0||KEY2==0||KEY3==1)为假不执行内部的语句,
执行下句elseif,表达式(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)的值为1,执行内部的语句,keyup为1,所以没什么用。
(程序执行速度很快,肯定远远大于按键按下速度,这里的第一次,第二次是为了方便理解)
       
       
                 第二次,假设按的是key0,那么if中的表达式为真,执行后面的语句,把keyup置0后,取出按键值,作为函数返回值送会给t。(记住此刻keyup的值是0)
       
       
                 
       
       
                第三次,mode又为0,那么keyup还是0,
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))中的表达式是假(&&后的语句(KEY0==0||KEY1==0||KEY2==0||KEY3==1)不去判断
(不懂请看C语言)),则执行elseif,它的表达式中若果没有按键按下则keyup=1,
如果此时有一个按键是被按下的状态,所以elseif里的keyup=1也不会被执行,因为elseif也是假的。
然后返回值还是0,这就达到了不支持连按的目的。
       
       
                如果此时一个按键是松开,即按下后松手,那么再看,if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这条语句为假应,执行elseif,此时由于没有按按钮,所以会执行keyup=1这条语句,当下次扫描按钮来临时又恢复到了最初的情况。
       
       
                 
       
       
                mode为1时的支持连按的情况
       
       
                static u8 key_up=1;if(mode)key_up=1;这两个语句表明无论何时,key_up的值都是1,
即if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))的表达式仅仅需要判断(KEY0==0||KEY1==0||KEY2==0||KEY3==1)的值是不是1,
是的话执行内部函数,不是的话执行else if后的语句,key_up为1,也可以说else if这个语句在此种形式下没有用处。
       
       
                由此看出在这种情况下仅仅是不断扫描是否有按键按下,有的话就是把返回值送给t,如果是按下没有松手,不断检测到按下状态
,就是一直执行if内的语句,即支持连按。


如果哪里有问题 恳请各位指导

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

372

主题

372

帖子

0

粉丝