完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通常关于4*4矩阵键盘的扫描检测程序是这样的:
void keyscan() { unsigned char temp,key; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; break; .........//省略其他扫描 } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } display(key); } } 这里 if(temp!=0xf0) 这句话承担最终的检测判定角色,我不懂,按照C语言的规则,temp是个变量,跟P3应该不相关啊,P3把值赋给temp后,P3应该是不变的,之后temp的值应该跟P3就脱离关系了,但为什么这里把P3赋值给temp后,就可以根据temp的值来判定P3 I/O口的值呢?求大家指点 |
|
相关推荐
5个回答
|
|
|
|
|
|
void anxx()interrupt 0 //按键扫描中断,aj,as全局变量,com为I/O,aj_0中断入口引脚
{ uchar a,x,y; //定义a缓存:xY数轴 aj=0; as=0; ys10us(5000); //延时25ms if(!AJ_0){ a=COM; //保护现场 y=a&0x0f; //判断y数轴准备 switch(y){ //查表 case 0x07:x=4;break; case 0x0b:x=3;break; case 0x0d:x=2;break; case 0x0e:x=1;break; default: { //查表失败 x=0; break; } } if(x&&(!AJ_0)){ //判断y=0?准备判断X数据 for(aj=0,y=0;y<4;++y){ switch(y){ case 0:COM=0x7f;break; case 1:COM=0xbf;break; case 2:COM=0xdf;break; case 3:COM=0xef;break; default:{ COM=a|0x0f; //查表错误 aj=0; as=0; y=0; } } ys10us(10); //去抖延时 while(!AJ_0){ for(;!aj;) {//防止二次计数 aj=y*4+x; //求面值 } for(as=0;!AJ_0;as++) //求按键时间 ys10us(50000); //1S } } COM=a|0x0f;//恢复初次按键状态 } else{ //按键扫描错误返回 aj=0; as=0; COM=a|0x0f; } } |
|
|
|
估计你是看了郭天祥的视频,里面讲都比较清晰的
|
|
|
|
把P3的值赋给temp后,在P3没有变化的情况下,temp的值就和P3一样,这样就可以通过对temp的操作和判断来确定P3的状态,这应该是C语言不能直接对端口进行操作,所以采用中间变量的方法。当然,如果在对temp做判断的过程中,P3口发生了变化,那么对temp的判断就会和P3不一致了,只是这种情况的概率非常低就是了
|
|
|
|
temp=P3;你都给他赋值了,怎么能说不想管呢
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
8996 浏览 16 评论
4051 浏览 18 评论
1109浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1858浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 22:33 , Processed in 1.376596 second(s), Total 86, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号