单片机学习小组
直播中

朱佳婧

7年用户 186经验值
私信 关注

4*4矩阵键盘扫描为什么把P3赋值给temp后就可以根据temp的值来判定P3 I/O口的值呢?

             通常关于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)

赵媛

2019-4-8 10:54:23
temp=P3;
看这句。
举报

杜亚琼

2019-4-8 11:03:29
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;
}
}
举报

李景天

2019-4-8 11:16:58
估计你是看了郭天祥的视频,里面讲都比较清晰的
举报

人中狼

2019-4-8 13:05:20
把P3的值赋给temp后,在P3没有变化的情况下,temp的值就和P3一样,这样就可以通过对temp的操作和判断来确定P3的状态,这应该是C语言不能直接对端口进行操作,所以采用中间变量的方法。当然,如果在对temp做判断的过程中,P3口发生了变化,那么对temp的判断就会和P3不一致了,只是这种情况的概率非常低就是了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分