51單片機(jī)100例實(shí)例之17例
//項(xiàng)目名稱:數(shù)碼管顯示矩陣鍵盤按鍵值
//項(xiàng)目再創(chuàng)作者:科技小宅神
//完成時(shí)間:2021/01/21

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定義蜂鳴器接口位置
sbit BEEP = P3^0;
//七段數(shù)碼管數(shù)組:1~16-0
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
//上次按鍵號(hào)和當(dāng)前按鍵序號(hào),在矩陣鍵盤中,序號(hào)范圍為0~15,16則為無(wú)按鍵
uchar Pre_KeyNO = 16,KeyNO = 16;
//延時(shí)子程序
void DelayMS(uint ms)
{
? uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
//矩陣鍵盤掃描子程序
void Keys_Scan()
{
? uchar Tmp;
P1 = 0x0f;//高4位置0,放入4行
DelayMS(1);
Tmp = P1 ^ 0x0f;//按鍵按下后0x0f變成0000 xxxx,
?//x中有1個(gè)為0,其他任為1,通過(guò)異或把3個(gè)1變成0,唯一的0變成1
switch(Tmp)//判斷按鍵發(fā)生于0~3那一列
{
case 1: KeyNO = 0; break;//第一列
case 2: KeyNO = 1; break;//第二列
case 4: KeyNO = 2; break;//第三列
case 8: KeyNO = 3; break;//第四列
default: KeyNO = 16;//無(wú)按鍵按下
}
P1 = 0xf0;//低4位置0,放入4列
DelayMS(1);
Tmp = P1 >> 4 ^ 0x0f;//按鍵按下后0x0f變成 xxxx 0000,
?//x中有1個(gè)為0,其他任為1,通過(guò)右移,高4位轉(zhuǎn)移到低4位,
?//并異或把3個(gè)1變成0,唯一的0變成1
? ? ? ? ? ? ? ? ??
switch(Tmp)//對(duì)0~3行分別附加起始值0,4,8,12
{
case 1: KeyNO += 0; break;
case 2: KeyNO += 4; break;
case 4: KeyNO += 8; break;
case 8: KeyNO += 12;
}
}
//蜂鳴器
void Beep()
{
? uchar i;
for(i=0;i<100;i++)
{
DelayMS(1);
BEEP = ~BEEP;//取反
}
BEEP = 0;//給低電平,恢復(fù)不響工作狀態(tài)
}
//主程序
void main()
{
? P0 = 0x00;//初始化
while(1)//死循環(huán)
{
P1 = 0xf0;//初始化
if(P1 != 0xf0)//當(dāng)有按下按鍵,則進(jìn)行矩陣鍵盤掃描子程序(獲得按鍵序號(hào))
? ?Keys_Scan();
if(Pre_KeyNO != KeyNO)//上次按鍵號(hào)和當(dāng)前按鍵序號(hào)不一致時(shí),
{
P0 = ~DSY_CODE[KeyNO];//通過(guò)按鍵值,在數(shù)組中取得相應(yīng)的值,并從P0口輸出
Beep();
Pre_KeyNO = KeyNO;//上次按鍵序號(hào)=當(dāng)前按鍵序號(hào)
}
DelayMS(100);
}
}