//-----------------------------------------------------------------
// 名稱: 數碼管顯示4×4 鍵盤矩陣按鍵序號
//-----------------------------------------------------------------
// 說明: 按下任意一按鍵時,數碼管會顯示它在鍵盤矩陣上的序號0 - F,
// 掃描程序首先判斷按鍵發生在哪一列,然后根據所發生的行附加
// 不同的值,從而得到鍵盤按鍵序號.
//
//-----------------------------------------------------------------
#include <reg51.h>
#define INT8U unsigned char
#define INT16U unsigned int
//0~F的共陽數碼管段碼,最后一個是黑屏
const INT8U SEG_CODE[] =
{ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
};
sbit BEEP = P3^0;
//上次按鍵和當前按鍵序號,該矩陣中序號范圍為0-15,0xFF表示無按鍵
INT8U pre_KeyNo=0xff,Key_No=0xff;
//-----------------------------------------------------------------
// 延時函數
//-----------------------------------------------------------------
void delay_ms(INT16U x)
{
INT8U t; while(x--) for(t = 0; t < 120; t++);
}
//-----------------------------------------------------------------
// 鍵盤矩陣掃描子程序
//-----------------------------------------------------------------
void Keys_Scan()
{ // 高4位置0,放入4行,掃描4列
P1=0x0f; delay_ms(1);
if(P1 == 0x0f) {Key_No=0xff;return;} //無按鍵時提前返回
//判斷發生在第幾列
switch(P1)
{
case 0x0e: Key_No =0; break; //0列
case 0x0d: Key_No =1; break; //1列
case 0x0b: Key_No =2; break; //2列
case 0x07: Key_No =3; break; //3列
default: Key_No=0xff; return; //無鍵按下,提前返回;
}
// 低4位置0,放入4列,掃描4行
P1=0xf0; delay_ms(1);
if(P1 == 0x0f) {Key_No=0xff;return;}
//判斷發生在第幾行
//對0~3行分別賦初值0,4,8,12
switch(P1)
{
case 0xe0: Key_No +=0; break; //0行
case 0xd0: Key_No +=4; break; //1行
case 0xb0: Key_No +=8; break; //2行
case 0x70: Key_No +=12; break; //3行
default: Key_No=0xff; //無鍵按下
}
}
//-----------------------------------------------------------------
// 蜂鳴器子程序
//-----------------------------------------------------------------
void Beep()
{
INT8U i;
for(i=0;i<100;i++){delay_ms(1); BEEP = ~BEEP;}
BEEP=1;
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
P0=0xff; //初始關數碼管
while(1)
{
Keys_Scan(); //掃描鍵值
if(Key_No == 0xff){delay_ms(10); continue;}
//顯示鍵值,蜂鳴器提示
P0=SEG_CODE[Key_No];Beep();
//未釋放等待
while(Keys_Scan(), Key_No != 0xff);//這句話怎么理解??while()語句里還可以放函數??
}
}
//最后一句語句怎么理解??while()語句里還可以放函數?? 逗號??
//最后一句語句怎么理解??while()語句里還可以放函數?? 逗號??
//最后一句語句怎么理解??while()語句里還可以放函數?? 逗號??
|