無標題.jpg (131.95 KB, 下載次數(shù): 45)
下載附件
2019-3-11 17:04 上傳
給你寫一個3*3矩陣鍵盤不占用剩余IO口演示程序,有詳細注釋。順序取了P3.0~3.5,按此規(guī)律可以取任意一組的任意6個IO口。
- #include <reg52.h>
- #define uint unsigned int //宏定義無符號整型數(shù)據(jù)
- #define uchar unsigned char //宏定義無符號字符型數(shù)據(jù)
- uchar key=0; //定義鍵值全局變量
- void keyscan() //按鍵掃描程序
- {
- static bit sign=0; //按鍵自鎖標志
- static uint count=0; //消抖計數(shù)變量
- uchar temp1=0,temp2=0,temp3;//臨時變量
- P3|=0x3f; //賦值P3,保留高2位不變,操作低6位 xx11 1111 x為0或1
- P3&=0xf8; //賦值P3,保留高2位不變,操作低6位 xx11 1000 x為0或1
- temp1=P3&0x38; //保存P3低6位狀態(tài)到temp1
- if(temp1!=0x38) //檢測有按鍵按下
- {
- count++; //消抖計數(shù)
- if((count>=250)&&(sign==0))//count100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
- {
- sign=1; //按鍵自鎖標志置1
- P3|=0x3f; //賦值P3,保留高2位不變,操作低6位 xx11 1111 x為0或1
- P3&=0xc7; //賦值P3,保留高2位不變,操作低6位 xx00 0111 x為0或1
- temp2=P3&0x07; //保存P3低6位狀態(tài)到temp2
- temp3=temp2|temp1; //保存temp2和temp1相或值
- switch(temp3)
- {
- case 0x36: key=1; break;
- case 0x35: key=2; break;
- case 0x33: key=3; break;
- case 0x2e: key=4; break;
- case 0x2d: key=5; break;
- case 0x2b: key=6; break;
- case 0x1e: key=7; break;
- case 0x1d: key=8; break;
- case 0x1b: key=9; break;
- }
- }
- }
- else //鍵抬起
- {
- sign=0; //按鍵有效標志清0
- count=0; //消抖計數(shù)清0
- }
- }
- void main() //主函數(shù)
- {
- while(1)
- {
- keyscan(); //按鍵掃描程序
- P1=key; //P1顯示(2進制)
- }
- }
復制代碼
|