|
寫的是按下4x4鍵盤矩陣,在動(dòng)態(tài)數(shù)碼管上顯示”L ? OP ”,其中?的取值范圍為0~9。
Keil 4的代碼
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LATCH = P2^2; // 數(shù)碼管鎖存引腳
uchar code segCode[] = { // 共陰極數(shù)碼管的段碼表
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
uchar code keyTable[] = { // 4x4矩陣鍵盤的鍵值表
0xEE, 0xDE, 0xBE, 0x7E,
0xED, 0xDD, 0xBD, 0x7D,
0xEB, 0xDB, 0xBB, 0x7B,
0xE7, 0xD7, 0xB7, 0x77
};
uchar keyValue; // 存儲(chǔ)當(dāng)前按下的鍵值
void delay(uint t) // 延時(shí)函數(shù)
{
uint i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(uchar num) // 數(shù)碼管顯示函數(shù)
{
LATCH = 0;
P0 = segCode[num];
LATCH = 1;
}
uchar getKey() // 獲取按鍵函數(shù)
{
uchar row, col;
P1 = 0xFF; // 全部行拉高
col = P1; // 讀取列值
col = col & 0x0F; // 只保留低4位
if(col == 0x0F) // 沒有按鍵按下
return 0xFF;
else
{
row = 0;
P1 = 0xF0; // 全部列拉高
while(col == 0x0F) // 檢測(cè)列值是否改變
{
delay(5);
col = P1 & 0x0F;
row++;
}
col = col | (P1 & 0x0F); // 組合列值和行值
return keyTable[(row - 1) * 4 + col - 1];
}
}
void main()
{
uchar num = 0;
while(1)
{
keyValue = getKey(); // 獲取當(dāng)前按下的鍵值
if(keyValue != 0xFF) // 判斷是否有按鍵按下
{
if(keyValue >= 0xE7 && keyValue <= 0xEE) // 判斷按下的鍵是否在范圍內(nèi)
{
num = keyValue - 0xE0; // 獲取按鍵對(duì)應(yīng)的數(shù)字
}
}
// 數(shù)碼管動(dòng)態(tài)顯示"L ? OP"
display(0); // 顯示空白
delay(5);
display(num); // 顯示數(shù)字
delay(5);
display(10); // 顯示字母L
delay(5);
display(11); // 顯示字母O
delay(5);
display(12); // 顯示字母P
delay(5);
}
}
|
|