写的是按下4x4键盘矩阵,在动态数码管上显示”L ? OP ”,其中?的取值范围为0~9。
Keil 4的代码
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LATCH = P2^2; // 数码管锁存引脚
uchar code segCode[] = { // 共阴极数码管的段码表
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; // 存储当前按下的键值
void delay(uint t) // 延时函数
{
uint i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(uchar num) // 数码管显示函数
{
LATCH = 0;
P0 = segCode[num];
LATCH = 1;
}
uchar getKey() // 获取按键函数
{
uchar row, col;
P1 = 0xFF; // 全部行拉高
col = P1; // 读取列值
col = col & 0x0F; // 只保留低4位
if(col == 0x0F) // 没有按键按下
return 0xFF;
else
{
row = 0;
P1 = 0xF0; // 全部列拉高
while(col == 0x0F) // 检测列值是否改变
{
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(); // 获取当前按下的键值
if(keyValue != 0xFF) // 判断是否有按键按下
{
if(keyValue >= 0xE7 && keyValue <= 0xEE) // 判断按下的键是否在范围内
{
num = keyValue - 0xE0; // 获取按键对应的数字
}
}
// 数码管动态显示"L ? OP"
display(0); // 显示空白
delay(5);
display(num); // 显示数字
delay(5);
display(10); // 显示字母L
delay(5);
display(11); // 显示字母O
delay(5);
display(12); // 显示字母P
delay(5);
}
}
|