给你写一个5*6矩阵键盘数码管动态显示示例参考,端口可以按实际需要自行更改,再把数码管显示改为LCD显示。
- //P1.0~1.5接行线,P1.6~1.7、P2.0~2.2接列线
- //数码管显示键值
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define PD (P2&0x07)<<8|P1 //宏定义5*6矩阵端口
- sbit wela1=P2^6;//数码管十位
- sbit wela2=P2^7;//数码管个位
- uchar code table[]={//共阴数码管段码"0~f"
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uint key=0; //键值变量
- uchar ge,shi;
- bit flag;
- void PX(uint i) //写入16位数据
- {
- P1=i;
- P2&=0xf8;//清0 P2低3位不影响高5位状态
- P2|=i>>8;//
- }
- void keyscan() //按键扫描程序
- {
- static bit sign=0; //按键自锁标志
- static uint count=0; //消抖计数变量
- uint num=0; //临时变量
- PX(0x07C0); //赋值PX 11111 000000
- num=PD; //保存PD值 xxxxx 000000,x为0或1
- if(num!=0x07C0) //检测有按键按下
- {
- if(++count>=10 && sign==0) //根据主循环周期调整约10~20ms
- {
- sign=1; //按键自锁标志置1
- num|=0x003f; //保存num按位或003f值 xxxxx 111111
- PX(num); //赋值PX xxxxx 111111
- num=PD; //保存PD值 xxxxx xxxxxx
- switch(num)
- {
- case 0x07be: key= 1; break;//011110 111110
- case 0x077e: key= 2; break;//011101 111110
- case 0x06fe: key= 3; break;//011011 111110
- case 0x05fe: key= 4; break;//010111 111110
- case 0x03fe: key= 5; break;//001111 111110
- case 0x07bd: key= 6; break;//011110 111101
- case 0x077d: key= 7; break;//011101 111101
- case 0x06fd: key= 8; break;//011011 111101
- case 0x05fd: key= 9; break;//010111 111101
- case 0x03fd: key=10; break;//001111 111101
- case 0x07bb: key=11; break;//011110 111011
- case 0x077b: key=12; break;//011101 111011
- case 0x06fb: key=13; break;//011011 111011
- case 0x05fb: key=14; break;//010111 111011
- case 0x03fb: key=15; break;//001111 111011
- case 0x07b7: key=16; break;//011110 110111
- case 0x0777: key=17; break;//011101 110111
- case 0x06f7: key=18; break;//011011 110111
- case 0x05f7: key=19; break;//010111 110111
- case 0x03f7: key=20; break;//001111 110111
- case 0x07af: key=21; break;//011110 101111
- case 0x076f: key=22; break;//011101 101111
- case 0x06ef: key=23; break;//011011 101111
- case 0x05ef: key=24; break;//010111 101111
- case 0x03ef: key=25; break;//001111 101111
- case 0x079f: key=26; break;//011110 011111
- case 0x075f: key=27; break;//011101 011111
- case 0x06df: key=28; break;//011011 011111
- case 0x05df: key=29; break;//010111 011111
- case 0x03df: key=30; break;//001111 011111
- }
- }
- }
- else //键抬起
- {
- sign=0; //按键自锁标志清0
- count=0; //消抖计数清0
- }
- }
- void main() //主函数
- {
- while(1)
- {
- keyscan(); //按键扫描程序
- if(flag)
- {
- P0=0x00;
- wela1=0;
- wela2=1;
- P0=table[key/10];
- flag=~flag;
- }
- else
- {
- P0=0x00;
- wela1=1;
- wela2=0;
- P0=table[key%10];
- flag=~flag;
- }
- }
- }
复制代码
|