keybuf = (keybuf << 1) | KEY4; //只取 KEY4 为例,缓冲区左移一位,并将当前扫描值移入最低位
不太理解这行代码的意思,有没有老哥能举个实例解释一下。
比如keybuf当前值为0x10,按键key4按下为低电平,不按下为高电平。如果按键按下,计算后的结果为0x10<<1为0x20,或上最后一位0等于0x20。不知道能明白不?
将数码管显示函数放到key();函数里面,实现了功能。同时进行了优化,将位选直接写在main函数while循环之前,然后直接操作P0确定段选即可。并且也没有延时。
#include <regx52.h>
#include "key.h"
sbit LS_A=P2^2;
sbit LS_B=P2^3;
sbit LS_C=P2^4;
unsigned code Nixie_Value[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
void Key()
{
unsigned char KeyNumber=0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;P0=Nixie_Value[KeyNumber];}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;P0=Nixie_Value[KeyNumber];}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;P0=Nixie_Value[KeyNumber];}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;P0=Nixie_Value[KeyNumber];}
}
int main()
{
LS_A=0;LS_B=0;LS_C=0;
P0=0x3F;
while(1)
{
key();
}
}