|
#include<reg51.h>
#define key P0//定義按鍵端口
#define uchar unsigned char
sbit line0=P0^0;//定義行線
sbit line1=P0^1;
sbit line2=P0^2;
char led[]={0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定義led顯示字行碼
char scancode2[]={0xef,0xdf};
bit iskey()//判斷是否有按鍵閉合
{
key=0x07;//低三位為1,高三位為0
if((key&0x07)==0x07)//屏蔽高三位(列線),只檢測低三位(行線)
return 0;//沒有按鍵閉合
else
return 1;//有按鍵閉合
}
uchar key_identify()//識別建號
{
uchar linecode=0,i,rowcode=0,scancode=0xf7;//初始化掃描碼,第一列為0,其他為1
for(i=0;i<3;i++)//掃描三列
{
key=scancode;//輸出掃描碼,掃描各列
if((key&0x07)==0x07)//屏蔽高三位(列線),只檢測低三位(行線)
{
rowcode++;//無按鍵閉合
scancode=scancode2[rowcode-1];//輸出0的列線每次左移一位
}
else//已確定列號,再確定行號
{
if(line0==0)linecode=0;
if(line1==0)linecode=3;
if(line2==0)linecode=6;
break;
}
}
return (linecode+rowcode);//輸出鍵號
}
void wait_key_release()//等按鍵松開
{
while(1)
{
key=0x07;//低三位為1,高三位為0
if((key&0x07)==0x07)break;//讀行線狀態(tài),如果為高電平,則沒有按鍵閉合,鍵盤松開
}
}
void display(uchar n)//led顯示數(shù)字
{
P1=led[n];
P0=0xff;
}
int main(void)
{
uchar keycode;//保存鍵號
unsigned int i;
while(1)
{
while(!iskey());//如果沒有按鍵按下,等待
for(i=0;i<500;i++);//消抖
if(iskey())//檢測是否有按鍵
{
keycode=key_identify();//識別鍵號
wait_key_release();//等待按鍵松開
display(keycode);//顯示
}
}
}
仿真時P0.0 P0.1 P0.2電平是灰的 按鍵沒反應(yīng) 詳情見附件 |
-
-
矩陣鍵盤led顯示.rar
2017-4-17 12:46 上傳
點(diǎn)擊文件名下載附件
19.08 KB, 下載次數(shù): 53
|