4X4矩阵键盘(查表法)

/*行线接P1.0-P1.3,列线接P1.4-P1.7。


根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。

开机时,数码管显示“-”。

当键按下时,数码管显示按下键的键值,蜂鸣器响一声。*/

#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit BEEP = P3^6; //蜂鸣器驱动线

uchar key;

unsigned char code disp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};

unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };

/**********************************************************

延时子函数

**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 120; t++);
}
}

/**********************************************************

x*0.14MS 延时子函数

**********************************************************/
void delay0(uchar x)
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {;}
}
}

/**********************************************************

蜂鸣器驱动子函数

**********************************************************/
void beep()
{
uchar i;
for (i=0;i<180;i++)
{
delay0(5);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delayms(250); //延时
}

/**********************************************************

键盘扫描子函数

**********************************************************/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;

P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判键是否按下
{
delayms(30); //延时30ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2; //组合成键编码

for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
key=j;
return(key);
}
}
}
}
else P1=0xff;

return (16);
}

/**********************************************************

判键是否按下子函数

**********************************************************/
void keydown()
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
keyscan();
P0=disp_code[key];
beep();
}
}

/**********************************************************

主函数

**********************************************************/
main()
{
P0 = 0xbf;
P2 = 0x7f; //数码管显示"-"
P1 = 0xff;

while(1)
{
keydown();
}
}

/***********************

**********************************/

相关文档
最新文档