//********"键盘及其显示"**************
//"当按下一个键的时候显示按下键的键值,其余时间显示字母“P”"
// "P1口作为数码管的位选,P0口作为数码管的段选"
//"P2口是键盘连接口,低4位为列,高4位为行"
#include"reg52.h"
//"下面为数码管显示码"
unsigned char code table[19]={0x3f,0x06,0x5b,0x4f,0x66,//0~4
0x6d,0x7d,0x07,0x7f,0x6f,//5~9
0x77,0x7c,0x39,0x5e,0x79,//A~E
0x71,0x73,0xc3,0x00};//F.p.=..
unsigned char key_scan(void);
//*************"键盘显示"********************
//"函数名称:void key_display(void)"
//"函数功能:显示所按下键的键值"
//"参数说明:无 P0口作为段码, P1作为位码"
//******************************************
void key_display(void)
{
unsigned char key_value_1=16;
P1=0x00;//"选通所有的数码管"
key_value_1=key_scan();//"返回键值"
P0=table[key_value_1];//"输出显示码"
}
//***********"延时"*********************
//"函数名称:void delay(unsigned char delay_time)"
//"函数功能:延时"
//"参数说明:有 delay_time"
//*************************************
void delay(unsigned int delay_time)
{
while(delay_time){delay_time--;}
//"延时8+6*delay_time us"
}
//***********"按键扫描"*******************
//"函数名称:unsigned char key_scan(void)"
//"函数功能:用行列扫描方式进行键盘扫描,P2口高四位作为行,低四位作为列"
//"参数说明:无"
//***************************************
unsigned char key_scan(void)
{
unsigned char key_code;//"键盘行编码"
unsigned char key_value;//"键值"
unsigned char row=0;//"行值"
unsigned char line=0;//"列值"
unsigned char temp=0xfe;//"列扫描码"
unsigned char i;
P2=0xf0;//"P2口赋初值,准备进行行,列扫描"
if((P2&0xf0)!=0xf0)//"表示有键按下"
{
delay(2000);//"延时10ms消抖"
if((P2&0xf0)!=0xf0)//"表明确实有键按下,进行键盘扫描"
{
for(i=0;i<4;i++)//"列扫描"
{
P2=temp;//"送列扫描码"
if((P2&0xf0)!=0xf0)
{
key_code=P2&0xf0;//"得出行编码"
row=i;//"计算出列值"
break;
}
temp=(temp<<1)|0x01;//"进行下一列扫描"
}
switch(key_code)//"根据行编码得出行值"
{
case 0xe0: line=0;break;
case 0xd0: line=1;break;
case 0xb0: line=2;break;
case 0x70: line=3;break;
default: ;
}
key_value=row*4+line;//"根据行,列值计算出键值"
}
return(key_value);
while((P2&0xf0)!=0xf0){key_display();}//"等待按键释放"
}
}
//**************"主函数"***********************
//"函数名称:void main(void)"
//"函数功能:"
//"参数说明:无"
//********************************************
void main(void)
{
while(1)
{
key_display();
}
}
|