#ifndef _key_H_
#define _key_H_
#include<reg51.h>
unsigned char num[5][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}}; //5行4列
#define uint unsigned int
unsigned char KEY;
sbit H5=P3^0;
keybord()
{
unsigned char H,L,tmp1,tmp2; //行是j 列是i
while(1)
{P2=0x0f;
H5=0; //P2口输出 0 0 0 0 1 1 1 1 ,读低4位
if(P2!=0x0f);
delay_ms(10);
if(P2!=0x0f); //读取P2口的值,如果不等于00001111,证明有键按下
{tmp1=P2; //按下后,P2口的值给temp1
switch(tmp1)
{ // P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
case 0x07:L=4;break; //如果 0 0 0 0 0 1 1 1 为第4列
case 0x0b:L=3;break; //如果 0 0 0 0 1 0 1 1 为第3列
case 0x0d:L=2;break; //如果 0 0 0 0 1 1 0 1 为第2列
case 0x0e:L=1;break; // 如果 0 0 0 0 1 1 1 0 为第1列
}
P2=0xf0;
H5=1;
if(P2!=0xf0); //P2口输1111 0000 读高4位
delay_ms(5);
if(P2!=0xf0);
tmp2=P2; // P2口的值给tmp2
switch(tmp2)
{ // p3.0 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
case 0x70:H=4;break; //如果 1 0 1 1 1 0 0 0 0 为第1行
case 0xb0:H=3;break; //如果 1 1 0 1 1 0 0 0 0 为第2行
case 0xd0:H=2;break; //如果 1 1 1 0 1 0 0 0 0 为第3行
case 0xe0:H=1;break; // 如果 1 1 1 1 0 0 0 0 0 为第4行
case 0xf0:if(H5!=1){H=5;};break; // 如果 0 1 1 1 1 0 0 0 0 为第5行
}
KEY=num[H][L];
}
return KEY;
}
}
KEY_display(uint k)
{
switch(k)
{ case 1: disp_cn_2(NO_0,6,32);break;
case 2: disp_cn_2(NO_1,6,32); break;
case 3: disp_cn_2(NO_2,6,32); break;
case 4: disp_cn_2(NO_1,6,32); break;
case 5: disp_cn_2(NO_7,6,32); break;
case 6: disp_cn_2(NO_8,6,32); break;
case 7: disp_cn_2(NO_6,6,32); break;
case 8: disp_cn_2(NO_3,6,32); break;
case 9: disp_cn_2(NO_2,6,32); break;
case 10: disp_cn_2(NO_9,6,32); break;
case 11:disp_cn_2(NO_9,6,32); break;
case 12:disp_cn_2(NO_2,6,32); break;
case 13:disp_cn_2(NO_4,6,32); break;
case 14:disp_cn_2(NO_13,6,32); break;
case 15:disp_cn_2(NO_4,6,32); break;
case 16:disp_cn_2(NO_1,6,32); break;
case 17:disp_cn_2(NO_8,6,32); break;
case 18:disp_cn_2(NO_17,6,32); break;
case 19:disp_cn_2(NO_8,6,32); break;
case 20:disp_cn_2(NO_6,6,32); break;
default: break;
}
}
#endif
|