基于51单片机按下矩阵键盘单元键盘,静态显示单元数码管显示对应数字通过排线,将单片机最小系统单元的P2口的0-7与矩阵键盘单元的 J0701的0-7一一对应相,通过信号线将单片机最小系统单元的 P1.0、P1.1、P1.2分别与静态显示单元的SER、SRCLK、RCLK相连:编程实现
时间: 2024-03-06 18:47:18 浏览: 24
好的,下面是一种基于中断的51单片机程序,实现了按下矩阵键盘单元键盘,静态显示单元数码管显示对应数字的功能。假设矩阵键盘单元的J0701的0-7对应单片机的P2口的0-7,静态显示单元的SER、SRCLK、RCLK分别对应单片机的P1.0、P1.1、P1.2:
```c
#include <reg52.h>
// 定义数码管显示数字的函数
void display(unsigned char num) {
// 数码管显示0-9的码表
unsigned char code table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
// 将数码管的RCLK拉低
P1 &= 0xF7;
// 依次将每一位数字通过SER和SRCLK发送到数码管
for (int i = 0; i < 8; i++) {
// 将SER设置为当前数字的第i位
P1 = (P1 & 0xFE) | ((table[num] >> i) & 0x01);
// 将SRCLK拉高
P1 |= 0x02;
// 将SRCLK拉低
P1 &= 0xFD;
}
// 将数码管的RCLK拉高,显示数字
P1 |= 0x08;
}
// 定义中断函数,用于处理矩阵键盘的按键事件
void key_isr() interrupt 0 {
// 定义矩阵键盘单元的行列对应关系
unsigned char code keys[4][4] = {
{1, 2, 3, 10},
{4, 5, 6, 11},
{7, 8, 9, 12},
{14, 0, 15, 13}
};
// 定义当前按下的键值
unsigned char key = 0;
// 定义当前显示的数字
static unsigned char num = 0;
// 扫描矩阵键盘,获取当前按下的键值
for (int i = 0; i < 4; i++) {
// 将第i行的输出设置为低电平
P2 = ~(0x01 << i);
// 判断第i行是否有键按下
if ((P2 & 0x0F) != 0x0F) {
// 获取第i行有键按下的列号
unsigned char col = P2 & 0x0F;
// 根据行列号获取键值
key = keys[i][col];
// 跳出循环
break;
}
}
// 如果有键按下,则显示对应的数字
if (key != 0) {
// 如果按下的是数字键,则显示对应的数字
if (key <= 9) {
num = key;
display(num);
}
// 如果按下的是清零键,则将数字清零
else if (key == 10) {
num = 0;
display(num);
}
// 如果按下的是加一键,则将数字加一
else if (key == 11) {
num++;
display(num);
}
// 如果按下的是减一键,则将数字减一
else if (key == 12) {
num--;
display(num);
}
// 如果按下的是其他键,则不做处理
else {
// do nothing
}
}
// 清空键值
key = 0;
}
// 主函数
void main() {
// 将中断0设置为下降沿触发
IT0 = 1;
// 使能中断0
EX0 = 1;
// 全局中断使能
EA = 1;
// 无限循环
while (1) {
// do nothing
}
}
```
这段程序中,使用了一个中断函数key_isr来处理矩阵键盘的按键事件,当有键按下时,会执行中断函数中的代码。在中断函数中,使用了一个二维数组keys来存储矩阵键盘单元的行列对应关系,通过P2口的输出来扫描矩阵键盘,获取当前按下的键值。如果按下的是数字键,则将对应的数字显示在数码管上;如果按下的是清零键,则将数字清零;如果按下的是加一键,则将数字加一;如果按下的是减一键,则将数字减一。