#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rs=P2^6; // 数据命令选择
sbit rw=P2^5; //读写选择
sbit e=P2^7; //使能
uint8 a[]=" the key number "; //要显示的字符
uint8 b[]="is ";
uint8 n;
uint8 code tel[]="1 2ABC3DEF4GHI5JKL6MNO7PQRS8TUV9WXYZ*0+#";
uint8 k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13;
void delay(uint16 i)
{
while(i--);
}
void wrc(uint8 c) //写命令
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(10);
e=0;
/*
P0=c<<4;
e=1;
e=0;*/ //四位的LCD要加上
}
void wrd(uint8 dat) //写数据
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(10);
e=0;
/*
P0=dat<<4;
e=1;
e=0;*/ //四位的LCD要加上
rs=0;
}
void init()
{
delay(1000);
/* wrc(0x32);
wrc(0x28);
wrc(0x28); */ //四位的LCD要加上
wrc(0x38);
wrc(0x38);
wrc(0x38);
wrc(0x06);
wrc(0x0c);
wrc(0x01);
}
void time0init()
{
TMOD=0X01;
TH0=0XFF;
TL0=0XFF;
TR0=1;
ET0=1;
EA=1;
}
uint8 keyscan() //键盘扫描
{
uint8 h,l,value;
P1=0x0f; //列置0
h=P1&0X0F; //判断哪一行按下
if(h!=0x0f) //判断是否按下
{
delay(1000); //消抖
if(h!=0x0f)
{
l=P1|0xf0; //把列置1
P1=l; //把列状态给P1口
l=P1&0xf0; //判断那一列按下
h=P1&0X0F; //判断哪一行按下
value=h+l; //组合起来到底是那个按键按下
}
}
return value;
}
void keypros() //按键处理
{
uint8 key=0;
TR0=0;
key=keyscan();
switch(key)
{
case 0xee:
k1++; //k1按键按下去的次数
if(k1==1)
{
n=tel[0]; //0
}
if(k1==2) //空格
{
n=tel[1];
k1=0;
}
break;
case 0xde:
k2++; //k2按键按下去的次数
if(k2==1)
{
n=tel[2]; //2
}
if(k2==2)
{
n=tel[3];//A
}
if(k2==3)
{
n=tel[4];//B
}
if(k2==4)
{
n=tel[5];//C
k2=0;
}
break;
case 0xbe:
k3++; //k3按键按下去的次数
if(k3==1)
{
n=tel[6]; //3
}
if(k3==2)
{
n=tel[7]; //D
}
if(k3==3)
{
n=tel[8]; //E
}
if(k3==4)
{
n=tel[9];//F
k3=0;
}
break;
case 0x7e:
break;
case 0xed:
k5++; //k5按键按下去的次数
if(k5==1)
{
n=tel[10]; //4
}
if(k5==2)
{
n=tel[11]; //G
}
if(k5==3)
{
n=tel[12]; //H
}
if(k5==4)
{
n=tel[13];//I
k5=0;
}
break;
case 0xdd:
k6++; //k6按键按下去的次数
if(k6==1)
{
n=tel[14]; //5
}
if(k6==2)
{
n=tel[15]; //J
}
if(k6==3)
{
n=tel[16]; //K
}
if(k6==4)
{
n=tel[17];//L
k6=0;
}
break;
case 0xbd:
k7++; //k7按键按下去的次数
if(k7==1)
{
n=tel[18]; //6
}
if(k7==2)
{
n=tel[19]; //M
}
if(k7==3)
{
n=tel[20]; //N
}
if(k7==4)
{
n=tel[21];//O
k7=0;
}
break;
case 0x7d:
break;
case 0xeb:
k9++; //k9按键按下去的次数
if(k9==1)
{
n=tel[22]; //7
}
if(k9==2)
{
n=tel[23]; //P
}
if(k9==3)
{
n=tel[24]; //Q
}
if(k9==4)
{
n=tel[25];//R
}
if(k9==5)
{
n=tel[26];//S
k9=0;
}
break;
case 0xdb:
k10++; //k10按键按下去的次数
if(k10==1)
{
n=tel[27]; //8
}
if(k10==2)
{
n=tel[28]; //T
}
if(k10==3)
{
n=tel[29]; //U
}
if(k10==4)
{
n=tel[30];//V
k10=0;
}
break;
case 0xbb:
k11++; //k11按键按下去的次数
if(k11==1)
{
n=tel[31]; //9
}
if(k11==2)
{
n=tel[32]; //W
}
if(k11==3)
{
n=tel[33]; //X
}
if(k11==4)
{
n=tel[34];//Y
}
if(k11==4)
{
n=tel[35];//Z
k11=0;
}
break;
case 0x7b: n=11;break;
case 0xe7:
k13++; //k13按键按下去的次数
if(k13==1)
{
n=tel[36]; //*
}
if(k13==2) //0
{
n=tel[37];
k13=0;
}
break;
case 0xd7:
n=tel[38]; //k14按键按下去的次数
break;
case 0xb7:
n=tel[39]; //k15按键按下去的次数
break;
case 0x77: n=15;break;
default : break;
}
TR0=1;
}
void display()
{
uint8 i;
wrc(0x00+0x80);
for(i=0;i<16;i++)
{
wrd(a[i]);
}
wrc(0x40+0x80);
for(i=0;i<14;i++)
{
wrd(b[i]);
}
wrd(n);
}
void main()
{
init();
time0init();
while(1);
}
void tim0() interrupt 1
{
TH0=0XFF;
TL0=0XFF;
keypros();
display();
}