完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在看郭天祥老师的视频的时候遇到了一个疑问,琢磨半天也没想明白,特来求教
视频:http://v.youku.com/v_show/id_XMjkxMTQ1ODky.html 现象发生时间是:110分10秒左右。 现象描述:按第一排第一个按键的时候,数码管显示0,按道理按第二个按键的时候应该显示1的,但是事实上按了没有反应,必须要重启下单片机,才能按第二个。 P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) //郭老师貌似解释是跳不出这个循环吧,后来听一学生建议,就加了temp=P3 这句 { temp=P3; //就是加了这句,就能在第一行正常工作了,说是加了这句就能跳出上面那个while循环了 switch(temp) { case 0xee:num=1; break; case 0xde:num=2; break; case 0xbe:num=3; break; case 0x7e:num=4; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } 我没明白的就是,为什么加了temp=P3这句,就能跳出小while循环呢?既然能跳出小的while循环,那和它条件一样的大while循环,应该也能跳出啊,最重要的是,为什么加了temp=P3就能跳出去,跳出去的条件是temp=0xf0,但是P3并不等于0xf0啊。 小弟在此实在是想不通了 |
|
相关推荐
12个回答
|
|
|
|
有大神能教下小弟吗。。。
|
|
|
|
本帖最后由 星星ARM 于 2013-2-17 19:18 编辑
这个是我自己写的或许能帮你理解,其实在自己没有注意的时候何不去求解一种简单的解决方法呢,是吧,只要能解决问题,只要是能实现4*4键盘就OK何必计较那么多。 #include unsigned char code table_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table_w[]={0,1,2,3,4,5,6,7}; void delay(unsigned char xms) { unsigned char i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void main() { unsigned char key_l,key_h,key; while(1) { P3=0xf0; key_l=P3; key_l=key_l&0xf0; if(key_l!=0xf0) { delay(50); if(key_l!=0xf0) { key_l=P3&0xf0; //1110 0000 key_l=key_l|0x0f; //1110 1111 P3=key_l; key_h=P3; //1110 1110 key_h=key_h&0x0f; //0000 1110 key_l=key_l&0xf0; //1110 0000 key=key_l+key_h; } } switch (key) { case 0xee: P0=table_d[0]; break; case 0xde: P0=table_d[1]; break; case 0xbe: P0=table_d[2]; break; case 0x7e: P0=table_d[3]; break; case 0xed: P0=table_d[4]; break; case 0xdd: P0=table_d[5]; break; case 0xbd: P0=table_d[6]; break; case 0x7d: P0=table_d[7]; break; case 0xeb: P0=table_d[8]; break; case 0xdb: P0=table_d[9]; break; case 0xbb: P0=table_d[10]; break; case 0x7b: P0=table_d[11]; break; case 0xe7: P0=table_d[12]; break; case 0xd7: P0=table_d[13]; break; case 0xb7: P0=table_d[14]; break; case 0x77: P0=table_d[15]; break; } } } 很清楚了,程序一看就知道是什么意思了吧。。。。。 |
|
|
|
|
|
应该好理解吧。
|
|
|
|
非常感谢,就是那个table_W[]是用来做什么用的?好像没看到提到啊。 另外一个就是。。。我提这个问题,就是想弄明白,为何一句temp=P3就可以解决那个问题,因为我认为需要跳出while(temp!=0xf0)这个循环,就是要temp=0xf0,但是temp=P3的作用不是把P3的值给temp吗?可是P3的值也不是0xf0啊。执行完switch语句之后,当时的temp值应该与P3是一样的,就是0xee(假设按的是第一个按钮),就算当时松手了,P3值为0xfe,也和0xf0不一样,那temp!=0xf0就是成立的,应该依然跳不出循环才对啊。刚刚我脑袋里突然闪出一条灵感,不知道对不对,那就是这程序走到这,根本就没跳出while循环,依然在 while(temp!=0xf0) 这个循环里走,只是因为循环里有temp=P3这条语句,导致P3口的任何变化,直接传给了temp进入switch语句判断,从而解决只能按一次的情况?但是这样的话,之前的消抖就没用了啊。 while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:num=1; break; case 0xde:num=2; break; case 0xbe:num=3; break; case 0x7e:num=4; break; } } |
|
|
|
本帖最后由 x97266067 于 2013-2-17 22:59 编辑
楼主复制的应该是他讲完课的源码吧,讲课时,他想把松手检测加上,但犹豫了,最后只是在switch选择前边加了个temp=P3,正好也可以不停响应按键,(就是发现一次有效按键后就执行一次对num赋值的操作,然后立马重新开始,再次形成有效按键,再次对num赋值(这时按键还没有松手,所以还是有效按键,另外虽然再次对num赋值但并没有改变num的值所以在按键时并不会感觉出它的变化))而不是检测出一次按键发生之后就一直停留在循环内,直到检测到松手, 这是两种不同的方法(加temp=P3)和(加松手检测) 只不过碰巧他在加完松手检测后没有回过头来把这个改回来,让你后来看错了, 其实,我把看这段代码中的那个temp=P3删掉,再把四个case值改成0xe0;0xd0;0xb0;0x70也可以。 这些代码是他在课堂上临时写的,很多地方都不是很完善,又是思路也很乱,所以他的代码只是参考而已。 不过安我的习惯,我习惯上喜欢把按键扫描写成一个带有uchar返回值的子函数,用返回值的十六位表示按键状态,再对状态进行处理分析。 |
|
|
|
我们的键盘还是8086的汇编写的
|
|
|
|
请问我最后那个猜想是对的吗? |
|
|
|
呵呵呵,这代码。看着有点像。。多少个n年前玩的实验。。。记得那时候,我们老师不要求我们赶快出成品,他们提倡我们为了压缩51空间做大量实验,不停的实验。。到最后,出来的都是实验品。。,还叫我们想疯了自己的头去挖掘51核到底有多大的潜能。。真bt。现在的我们早都散了。。每次看到他们发布51产品时,哥就跟住激动。。也不知道激动个什么。。还有就是当年我们看的书籍,一本杨文龙的《单片机原理与应用》。一本二级c语言。。现在书也丢干了。。哎,真可惜。。不同的老师,提的思想不同。走的方向也不同。。想起那时候,哥就奔放。。
|
|
|
|
本帖最后由 x97266067 于 2013-2-18 23:07 编辑
楼主是说加个temp=P3之后,在跳出小while循环时的条件是temp=0xf0,但要想temp=0xf0是不可能的,因为P3口永远不可能是0xf0吗?这个疑问是对的,非常对,但是,,, 还是因为,你复制的是上完课整理完的代码,楼主可以再看下那段视频,当时switch语句后面还没有,那个松手检测,但是有一段让数码管更新num的代码,这样的话,其实当时是永远跳不出switch语句外面那个循环的,正是因为楼主的判断,temp=P3=0xf0是不可能的,但是因为他不断检测有效按键,也能不断更新num的值,不断让数码管更新num值, 说到底,还是因为课堂上的代码和课后发布的整理后的代码不一样。 但如果加了那个松手检测就不一样了,松手检测中只要出现P3=0xff,即松手状态时,就可以经过松手循环里的那两句使temp=0xf0,跳出所有while循环。 额,,,我看到了,你是说消抖没有用吗?那个貌似不是消抖吧,放到这里貌似就像我上面说的应该是松手检测吧,, |
|
|
|
楼上说的很清楚啊 那个和松手检测配合 我看这个视频和练习时 也遇到这个问题 但是我看明白了 没怎么去想 还是LZ用功 多看多想 这样才牢靠
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
203 浏览 0 评论
761 浏览 0 评论
806 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
743 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1195 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11806 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 17:09 , Processed in 0.882019 second(s), Total 94, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号