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

2019-07-21 02:15发布

    原子哥的战舰板子买来有1年多了,刚买时仅仅是看实验例程走一遍,很多东西都是似是而非,很多程序不是彻底明白。
如今毕业工作了,走的硬件研发工程师这条路,工作需要用到32,实习培训三个月后需要用32做个小项目考核,而我把当初32的内容都忘记了
只好重新学习,这次学习我要深刻理解每个教程的语句,理解后自己独立按照理解的内容重新编写.

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

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

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

言归正传
1、关于引脚宏定义中库函数和位操作两种方法
 #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//库函数的宏定义  #define KEY0 Ein(4)               //位操作的宏定义     玩32都是从51等低端单片机过来的,对于这些库操作用的不是很方便熟练,此时由宏定义可知有如上两种简单操作,
通过这两种宏定义后,在主函数中我们就可以向
51那种编程思路了,更容易理解。     考虑到在不同32上的移植性,最好最好用库函数的宏定义


2、按键处理函数 //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //0,没有任何按键按下 //1KEY0按下 //2KEY1按下 //3KEY2按下  //4KEY3按下 WK_UP //注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!! u8 KEY_Scan(u8 mode)  //里的u8是返回值 {   static u8 key_up=1;//static是静态变量只会程序运行第一次时执行一次 //保证在按键全松开的情况下才开始检测
if(mode)key_up=1;  //支持连按 /*如果keyup1,同时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没有一个被按下,那么keyup1   return 0;// 无按键按下 }   来说说mode0,不支持连按的情况     第一次没有按键按下时,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中的表达式为真,执行后面的语句,把keyup0后,取出按键值,作为函数返回值送会给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这条语句,当下次扫描按钮来临时又恢复到了最初的情况。   mode1时的支持连按的情况 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_up1,也可以说else if这个语句在此种形式下没有用处。 由此看出在这种情况下仅仅是不断扫描是否有按键按下,有的话就是把返回值送给t,如果是按下没有松手,不断检测到按下状态
,就是一直执行
if内的语句,即支持连按。


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








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
正点原子
1楼-- · 2019-07-21 05:49
不错,希望楼主多发这种帖子啊,呵呵
joe_knight
2楼-- · 2019-07-21 06:10
 精彩回答 2  元偷偷看……
persevere
3楼-- · 2019-07-21 08:55
顶LZ!我也是断断续续过了一半战舰的教程,好多都没有深入,还有很多东西没法理解
逍遥居士_888
4楼-- · 2019-07-21 11:06
回复【2楼】正点原子:
---------------------------------
嘿嘿  会的   原子哥
逍遥居士_888
5楼-- · 2019-07-21 11:09
 精彩回答 2  元偷偷看……
逍遥居士_888
6楼-- · 2019-07-21 16:03
回复【4楼】persevere:
---------------------------------
想精通 必须教程都理解后 做东西

一周热门 更多>