c521单片机矩阵键盘4x4数码管显示0-f
时间: 2024-01-08 17:03:06 浏览: 212
以下是一个简单的C51程序,可以实现矩阵键盘的输入和数码管的显示功能。注意,这里使用的是普通的共阳数码管,如果使用共阴数码管需要修改代码:
```c
#include <reg52.h> // 51单片机头文件
sbit LSA = P2^2; // 数码管LSA引脚连接的IO口
sbit LSB = P2^3; // 数码管LSB引脚连接的IO口
sbit LSC = P2^4; // 数码管LSC引脚连接的IO口
sbit D1 = P0^0; // 数码管第1位的IO口
sbit D2 = P0^1; // 数码管第2位的IO口
sbit D3 = P0^2; // 数码管第3位的IO口
sbit D4 = P0^3; // 数码管第4位的IO口
unsigned char code Nums[] = { // 数码管显示0~F的值
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char KeySta[4][4] = { // 矩阵键盘按键状态
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
void InitLcd() // 初始化数码管
{
P0 = 0xff; // 数码管全部关闭
LSA = 0; LSB = 0; LSC = 0; // 数码管显示第一位
TMOD &= 0xf0; // 设置定时器为模式0
TH0 = 0x3c; TL0 = 0xb0; // 定时器初值,定时1ms
ET0 = 1; // 开启定时器中断
TR0 = 1; // 开启定时器
}
void Display(unsigned char num, unsigned char pos) // 在数码管的指定位置显示一个数字
{
unsigned char tmp = Nums[num];
switch(pos) {
case 1: D1 = 0; P0 = tmp; D1 = 1; break;
case 2: D2 = 0; P0 = tmp; D2 = 1; break;
case 3: D3 = 0; P0 = tmp; D3 = 1; break;
case 4: D4 = 0; P0 = tmp; D4 = 1; break;
default: break;
}
}
void KeyDriver() // 矩阵键盘驱动程序
{
unsigned char i, j;
static unsigned char backup[4][4] = { // 矩阵键盘状态备份
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
for(i = 0; i < 4; i++) {
for(j = 0; j < 4; j++) {
if(KeySta[i][j] != backup[i][j]) { // 检测到按键状态改变
if(KeySta[i][j] == 0) { // 按键按下
Display(i * 4 + j, 1); // 在数码管第一位显示按键编号
}
}
backup[i][j] = KeySta[i][j]; // 备份按键状态
}
}
}
void main()
{
InitLcd(); // 初始化数码管
while(1) {
KeyDriver(); // 矩阵键盘驱动程序
}
}
void Timer0() interrupt 1 // 定时器0中断服务程序
{
static unsigned char cnt = 0;
static unsigned char pos = 1;
TH0 = 0x3c; TL0 = 0xb0; // 定时器重新赋初值,定时1ms
cnt++;
if(cnt >= 100) { // 每100ms更新数码管显示位置
cnt = 0;
pos++;
if(pos > 4) pos = 1;
}
switch(pos) { // 控制数码管显示位置的选择
case 1: LSA = 0; LSB = 0; LSC = 0; break;
case 2: LSA = 1; LSB = 0; LSC = 0; break;
case 3: LSA = 0; LSB = 1; LSC = 0; break;
case 4: LSA = 1; LSB = 1; LSC = 0; break;
default: break;
}
}
```
这段程序中,使用P2口的LSA、LSB、LSC三个引脚控制数码管的显示位置,使用P0口的D1~D4四个引脚控制数码管的亮灭。矩阵键盘的状态通过二维数组KeySta存储,在定时器中断服务程序Timer0中调用KeyDriver函数进行检测和处理。在按键按下时,将按键编号显示在数码管的第一位。
阅读全文