#include<reg52.h> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit DU = P2^6; sbit WE = P2^7; uint keyvalue = 13; //1 2 3 A uchar code table[]={ 0x06, 0x5b, 0x4f, 0x77, //4 5 6 B 0x66, 0x6d, 0x7d, 0x7c, //7 8 9 C 0x07, 0x7f, 0x6f, 0x39, //- 0 点 D 0x40, 0x3f, 0x80, 0x5e, //E H L U 0x79, 0x76, 0x38, 0x3e, //N F 熄灭 0x37, 0x71, 0x00}; //延时函数 void delay(uint z) { uint x, y; for(x=z; x>0; x–) for(y=114; y>0; y–); }
//按键扫描 void keyscan() { //矩阵键盘 P3 = 0xf0;//1111 0000列扫描 delay(10);//软件消抖 /按键按下会使得P3的值发生改变,先通过比较P3值来 检测是哪一列发生了改变,再将P3值改变进行列扫描, 通过比较P3值来检测是哪一行,最后进行松手检测/ if(P3 != 0xf0) { switch(P3) { case 0xe0: keyvalue = 0;break;//1110 0000第一列 case 0xd0: keyvalue = 1;break; case 0xb0: keyvalue = 2;break; case 0x70: keyvalue = 3;break; } P3 = 0x0f;//0000 1111行扫描 switch(P3) { case 0x0e: keyvalue += 0;break;//0000 1110第一行 case 0x0d: keyvalue += 4;break; case 0x0b: keyvalue += 8;break; case 0x07: keyvalue += 12;break; } while(P3!=0x0f);//松手检测 } //独立键盘 P3 = 0xff;//1111 1111 if(P3 != 0xff) { delay(10); switch(P3) //判断哪一行被按下 { case 0xfe: keyvalue = 16; break;//S2被按下 case 0xfd: keyvalue = 17; break;//S3被按下 case 0xfb: keyvalue = 18; break;//S4被按下 case 0xf7: keyvalue = 19; break;//S5被按下 } while(P3 != 0xff);//松手检测 } }
void main() { WE = 1; P0 = 0xfe; WE = 0; DU = 1; while(1) { keyscan(); P0 = table[keyvalue]; } }`