谁能帮我解释一下这个程序中的这个(键盘扫描函数,使用行列反转扫描法)

2025-01-07 21:36:08
推荐回答(3个)
回答1:

你用的是4x4的矩阵键盘的行列反转扫描吧,这种方法确定一个键码要分成3步:

第一步:将行IO置低电平,列IO置高电平,读数据。按下任意键时,将有一个列IO被拉低,于是读到类似00001011的数据

第二步:将行IO置高电平,列IO置低电平,重复第一步,读到类似11010000的数据cord_l=P3&0xf0;本句取有效值

第三步:将读到数据的有效部分结合,即(00001011) | (10110000)得到11011011,这就是键码了,至此,键盘扫描部分,即uchar keyscan(void)结束
return(cord_h+cord_l);本句将两次读到的数据中有效部分结合

按照硬件连接可以为每个按键确定唯一的键码,即 switch(key)中的16个分支

回答2:

#include
#define uint unsigned int
#define uchar unsigned char
uchar num,temp,H;
sbit wei=P2^7;
sbit duan=P2^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void main()
{
wei=1;
P1=0xc0;
wei=0x0;
P1=0;

duan=1;
P1=0x00;
duan=0;

while(1)
{
P3=0xfe;
H=0;
temp=P3;
//P0=table[num];
if(temp!=0xfe)
{
switch(temp)
{
case 0xee: num=0; break;
case 0xde: num=1; break;
case 0xbe: num=2; break;
case 0x7e: num=3; break;
}
}
P3=0xfd;
H=0;
temp=P3;
if(temp!=0xfd)
{
switch(temp)
{
case 0xed: num=4; break;
case 0xdd: num=5; break;
case 0xbd: num=6; break;
case 0x7d: num=7; break;
}
}
P3=0xfb;
H=0;
temp=P3;
if(temp!=0xfb)
{
switch(temp)
{
case 0xeb: num=8; break;
case 0xdb: num=9; break;
case 0xbb: num=10; break;
case 0x7b: num=11; break;
}
}
P3=0xf7;
H=0;
temp=P3;
if(temp!=0xf7)
{
switch(temp)
{
case 0xe7: num=12; break;
case 0xd7: num=13; break;
case 0xb7: num=14; break;
case 0x77: num=15; break;
}
}

duan=1;
P1=table[num];
duan=0;

}

}

我是不大理解他的做法。你就是要确定按键然后返回1,2,3。。。我上面的程序可以达到一样的效果。程序有很多种的。只要你能应用好按键就行了。真的不太理解他那要读按键的输入然后在输出是为什么。

回答3:

混过