战舰板子买来有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内的语句,即支持连按。
如果哪里有问题 恳请各位指导 |