給你寫一個5*6矩陣鍵盤數(shù)碼管動態(tài)顯示示例參考,端口可以按實際需要自行更改,再把數(shù)碼管顯示改為LCD顯示。
- //P1.0~1.5接行線,P1.6~1.7、P2.0~2.2接列線
- //數(shù)碼管顯示鍵值
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define PD (P2&0x07)<<8|P1 //宏定義5*6矩陣端口
- sbit wela1=P2^6;//數(shù)碼管十位
- sbit wela2=P2^7;//數(shù)碼管個位
- uchar code table[]={//共陰數(shù)碼管段碼"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位數(shù)據(jù)
- {
- P1=i;
- P2&=0xf8;//清0 P2低3位不影響高5位狀態(tài)
- P2|=i>>8;//
- }
- void keyscan() //按鍵掃描程序
- {
- static bit sign=0; //按鍵自鎖標志
- static uint count=0; //消抖計數(shù)變量
- uint num=0; //臨時變量
- PX(0x07C0); //賦值PX 11111 000000
- num=PD; //保存PD值 xxxxx 000000,x為0或1
- if(num!=0x07C0) //檢測有按鍵按下
- {
- if(++count>=10 && sign==0) //根據(jù)主循環(huán)周期調整約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; //消抖計數(shù)清0
- }
- }
- void main() //主函數(shù)
- {
- 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;
- }
- }
- }
復制代碼
|