建立工程矩阵键盘4x4显示,采用反转法检测形式,keil编写代码完成4x4按键控制数码管显示数字1~16效果。
时间: 2024-01-01 13:05:25 浏览: 101
以下是一个基于Keil C51的例子代码,实现了使用4x4矩阵键盘控制数码管显示数字1~16的功能,并采用反转法检测形式:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY_ROW_1 = P1^0;
sbit KEY_ROW_2 = P1^1;
sbit KEY_ROW_3 = P1^2;
sbit KEY_ROW_4 = P1^3;
sbit KEY_COL_1 = P1^4;
sbit KEY_COL_2 = P1^5;
sbit KEY_COL_3 = P1^6;
sbit KEY_COL_4 = P1^7;
sbit LED_DATA = P2^0;
sbit LED_CLK = P2^1;
sbit LED_LATCH = P2^2;
uchar key_prev, key_now; // 上一次和当前检测到的按键值
uchar led_data = 0x01; // 数码管显示的初始数字为1
void KeypadScan() {
uchar rows = 0x0f, cols = 0xf0;
uchar i, j;
for (i = 0; i < 4; i++) {
rows = _crol_(rows, 1); // 行扫描
cols = 0xf0;
if (rows == 0x0e) {
KEY_ROW_1 = 0;
} else {
KEY_ROW_1 = 1;
}
if (rows == 0x0d) {
KEY_ROW_2 = 0;
} else {
KEY_ROW_2 = 1;
}
if (rows == 0x0b) {
KEY_ROW_3 = 0;
} else {
KEY_ROW_3 = 1;
}
if (rows == 0x07) {
KEY_ROW_4 = 0;
} else {
KEY_ROW_4 = 1;
}
for (j = 0; j < 4; j++) {
if ((cols & 0x80) == 0x80) {
if ((rows & 0x08) == 0x08) {
key_now = i * 4 + j + 1; // 检测到按键
}
}
cols = _crol_(cols, 1); // 列扫描
}
}
}
void LedDisplay() {
uchar i;
for (i = 0; i < 8; i++) {
LED_CLK = 0;
if ((led_data & 0x80) == 0x80) {
LED_DATA = 1;
} else {
LED_DATA = 0;
}
led_data = _crol_(led_data, 1);
LED_CLK = 1;
}
LED_LATCH = 0;
LED_LATCH = 1;
}
void main() {
while (1) {
KeypadScan();
if (key_now != 0 && key_now != key_prev) { // 有按键按下且不是重复按下
led_data = key_now; // 数码管显示的数字为按键值
key_prev = key_now;
}
LedDisplay();
}
}
```
该代码中,定义了矩阵键盘的行列引脚和数码管的数据、时钟和锁存引脚,并通过`KeypadScan`函数实现了矩阵键盘的扫描和按键检测,通过`LedDisplay`函数实现了数码管的显示。
在`main`函数中,不断循环调用`KeypadScan`和`LedDisplay`函数,当检测到有按键按下且不是重复按下时,将按键值作为数码管显示的数字,并显示在数码管上。
需要注意的是,该代码仅为示例代码,实际应用中需要根据具体硬件平台和需求进行修改和优化。
阅读全文