|
|
給你一個(gè)異組端口的4*4矩陣鍵盤程序,讀、寫函數(shù)同樣適用于異組端口組成的數(shù)碼管段碼驅(qū)動(dòng)程序
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit code0=P2^2; //定義4*4鍵盤端口
- sbit code1=P2^4;
- sbit code2=P3^2;
- sbit code3=P3^3;
- sbit code4=P3^4;
- sbit code5=P3^5;
- sbit code6=P3^6;
- sbit code7=P3^7;
- uchar key=0xff; //鍵值變量初始值
- void PX(uchar i) //寫入8位數(shù)據(jù)
- {
- code0=i&0x01;i>>=1;
- code1=i&0x01;i>>=1;
- code2=i&0x01;i>>=1;
- code3=i&0x01;i>>=1;
- code4=i&0x01;i>>=1;
- code5=i&0x01;i>>=1;
- code6=i&0x01;i>>=1;
- code7=i&0x01;
- }
- uchar PD() //讀取8位數(shù)據(jù)
- {
- uchar i;
- i=code7;
- i=(i<<1)|code6;
- i=(i<<1)|code5;
- i=(i<<1)|code4;
- i=(i<<1)|code3;
- i=(i<<1)|code2;
- i=(i<<1)|code1;
- i=(i<<1)|code0;
- return i;
- }
- void key_scan() //矩陣鍵盤掃描函數(shù)
- {
- uchar num; //臨時(shí)變量
- static bit sign=0; //按鍵自鎖標(biāo)志
- static uint count=0; //消抖計(jì)數(shù)變量
- PX(0xf0); //先給矩陣端口賦一個(gè)初值0xf0
- if(PD()!=0xf0) //判斷矩陣端口不等于所賦初值,說(shuō)明有健按下
- {
- count++; //消抖計(jì)數(shù)
- if((count>=100)&&(sign==0))//如果按鍵自鎖標(biāo)志為0
- {
- sign=1; //按鍵自鎖標(biāo)志置1,鍵不抬起,按其他鍵無(wú)效
- num=PD(); //讀PD()值保存 xxxx 0000,x為0或1
- num|=0x0f; //num按位或0x0f值xxxx 1111
- PX(num); //num代入PX
- num=PD(); //再讀PD()值保存xxxx xxxx
- key=num; //輸出鍵值
- }
- }
- else //按鍵抬起
- {
- sign=0; //按鍵自鎖標(biāo)志清0
- count=0; //消抖計(jì)數(shù)清0
- }
- }
- void main()
- {
- while(1)
- {
- key_scan(); //鍵盤掃描
- P1=key; //LED低電平亮顯示鍵值
- }
- }
復(fù)制代碼
|
|