单片机4x4按键中断扫描法中的键盘编码的问题

来源:百度知道 编辑:UC知道 时间:2024/06/07 09:50:26
我不知道这个键盘编码怎么编来的,谁来帮我解释下啊
code unsigned char key_tab[17]=
{0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};//========================此数组为键盘编码,
//本人采用类式类似电话按键的编码方式,方便以后设计
// 1 2 3 a 0x01 0x02 0x03 0x0a
// 4 5 6 b 对应16进制码: 0x04 0x05 0x06 0x0b
// 7 8 9 e 0x07 0x08 0x09 0x0e
// * 0 # f 0x0c 0x00 0x0e 0x0f
//打个比方,如果你按下0键,P0口读到数据为0xed
//如果你按下2键,P0口读到数据为0x7d,按下9键为0xdb,
//我们将读到的P0口数据经过查表法就能得到相应的16进制码

//键盘的读取,我们采用中断法,电路用一个4与门(74HC21)接入
//中断口(INT0),利用中断来扫描键盘矩阵,读取数据

嗯,想法很不错..
我试着帮你解释下第一个吧..
这应该是选用的线扫法(好像这么说的吧).
比如说,键盘口为,P1
在一开始输出,01111111B,再判断P1口值是否变化..
若没变化再换成,10111111B,再判断P1口值是否变化..
这样依次到,11101111B,
在有变化时就可以得到把描码了..就像是你那个表中所示.的数值就经过这四次都可以得出其中一种....
#include<reg51.h>
#define uchar unsigned char
#define KeyPad P0
code uchar key_tab[17]=
{0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};
code uchar key_show[]=
{1,2,3,0x0a,
4,5,6,0x0b,
7,8,9,0x0e,
0x0c,0,0x0d,0x0f,0xff};
uchar Keyscan()
{
uchar i=0x01,j,k;
KeyPad=~i;
j=~i;
for (k=0;k<4;k++)
{
if(KeyPad==j)
{
i*=2;
KeyPad=~i;
j=~i;
}
else
k=KeyPad;//取出扫描码.
}
i=0;
if(k!=4)
{
while(key_tab[i++]!=0xff)
{
if(k==key_tab[i])
k=i;
else
k=16;
}
}
return key_show[k];
}
以上是整个扫描键盘子程序..
程序编译通