STC89C52上电后数码管从右到左走字显示数字“8”3次,然后熄灭。 4*4矩阵键盘从右边输出0-15
时间: 2024-02-19 16:02:56 浏览: 128
好的,针对您的问题,我可以给出以下的思路和代码实现:
首先,对于STC89C52上电后数码管从右到左走字显示数字“8”3次,然后熄灭,可以使用定时器中断来实现。具体的代码实现如下:
```c
#include <reg52.h>
#define LED P0
#define KEY P3
unsigned char code table[] = { // 数码管0-F的显示码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char cnt = 0; // 数码管计数器
unsigned char num = 8; // 数码管显示的数字
unsigned char flag = 1; // 翻转标志位
void timer0_isr() interrupt 1 { // 定时器0中断服务函数
TH0 = 0xfc; // 重新赋值
TL0 = 0x67;
cnt++;
if (cnt == 200) { // 200 * 50us = 10ms
cnt = 0;
if (flag) { // 翻转标志位为1时,数字从右到左显示
LED = table[num % 10];
KEY = 0x0f;
KEY = 0x0e;
LED = table[num / 10];
KEY = 0x0f;
KEY = 0x0d;
num--;
if (num == 5) flag = 0; // 当数字为5时,翻转标志位变为0
} else { // 翻转标志位为0时,数字从左到右显示
LED = table[num / 10];
KEY = 0x0f;
KEY = 0x0d;
LED = table[num % 10];
KEY = 0x0f;
KEY = 0x0e;
num++;
if (num == 9) flag = 1; // 当数字为9时,翻转标志位变为1
}
}
}
void main() {
TMOD = 0x01; // 定时器0工作方式1
TH0 = 0xfc; // 计时初值
TL0 = 0x67;
EA = 1; // 总中断允许
ET0 = 1; // 定时器0中断允许
TR0 = 1; // 定时器0开始计时
while (1); // 无限循环
}
```
接下来,对于4*4矩阵键盘从右边输出0-15,可以使用行列扫描的方法来实现。具体的代码实现如下:
```c
#include <reg52.h>
#define LED P0
#define KEY P3
unsigned char code table[] = { // 数码管0-F的显示码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char key_scan() { // 4*4矩阵键盘扫描函数
unsigned char row, col, value;
KEY = 0x0f;
value = KEY;
if (value != 0x0f) {
delay_ms(10); // 延时10ms
if (KEY != 0x0f) {
row = 0;
KEY = 0x0f;
value = KEY;
while (value != 0x0f) {
value = KEY;
row++;
KEY = ~(0x80 >> row); // 逐行扫描
}
col = 0;
KEY = 0xf0;
value = KEY;
while (value != 0xf0) {
value = KEY;
col++;
KEY = ~(0x08 << col); // 逐列扫描
}
LED = table[row * 4 + col]; // 在数码管上输出0-15
while (KEY != 0xf0); // 等待按键释放
return 1;
}
}
return 0;
}
void main() {
EA = 1; // 总中断允许
while (1) {
key_scan(); // 扫描键盘
}
}
```
注意,上述代码中使用了一个delay_ms()函数,可以通过下面的代码实现:
```c
void delay_ms(unsigned int ms) { // 毫秒延时函数
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++);
}
}
```
希望以上的思路和代码可以帮助您解决问题,如果您还有其他问题或需要更多帮助,请随时告诉我。
阅读全文