在这段C51代码中,上升沿和下降沿的检测是通过位运算和状态变量实现的,具体逻辑如下:
下降沿检测(Key_Down)
Key_Val ^ Key_Old:对当前键值和上一次键值进行异或操作。若键值从1变为0(下降沿),异或结果为1;否则为0。Key_Val & ...:当前键值为0时(按键被按下),保留异或结果;若当前键值为1(按键未按下),则结果为0。
上升沿检测(Key_Up)
~Key_Val:对当前键值取反。若按键被松开(当前键值为0),取反后为1。Key_Val ^ Key_Old:若键值从0变为1(上升沿),异或结果为1。~Key_Val & ...:仅在按键从“按下”变为“松开”时(即上升沿),Key_Up为1;否则为0。
/*按键读取*/
unsigned char Key_Read()
{
unsigned char temp=0;//要给初始值0,否则可能报错
if(P3_4==0)temp=1;
if(P3_5==0)temp=2;
if(P3_6==0)temp=3;
if(P3_7==0)temp=4;
return temp;
}
/*变量声明*/
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
/*Main*/
void main()
{
while(1)
{
Key_Val=Key_Read();//读取键码值,while中不断扫描,每次扫描都会将temp重置为0并判断
Key_Down=Key_Val&(Key_Val^Key_Old);//检测下降沿,按下瞬间
Key_Up=~Key_Val&(Key_Val^Key_Old);//检测上升沿,抬手瞬间
Key_Old=Key_Val;//扫描辅助变量,一直按着的时候
//测试代码
if(Key_Down==1)P1_0=0;
if(Key_Up==2)P1_0=1;
if(Key_Old==3)
P1_1=0;
else
P1_1=1;
if(Key_Down==4)
P1_3=~P1_3;
}
}
在按下瞬间,为什么能检测不同数字呢
这个问题我问了gpt,它说只能是0或1,但通过仿真是对的
于是我深究原理
下降沿检测(Key_Down)
此时我们假设我们要按下按键P3_6,那么temp的值将由0->3
Key_Val=3;//0011
Key_Old=0;//0000
那么,Key_Down=0011&(0011^0000),此处只有11和00不同,及为1,异或结果为0011,所以0011&0011还是得到0011,即为3。
上升沿检测(Key_Up)
接下来我们假设我们要松开按键P3_6,那么temp的值将由3->0
Key_Val=0;//0000
Key_Old=3;//0011
那么,Key_Up=1111&(0000^0011),此处只有11和00不同,异或结果为0011,所以1111&0011还是得到0011,即为3。
1698






