STC89C52RC波特率9600由矩阵键盘为0~9及发送键,实现由矩阵按键按下一个数在0'255内,将其显示在8位共阳极数码管上,在按下发送键后并通过串口通信发送给计算机,C语言带注释
时间: 2024-02-28 13:53:38 浏览: 79
好的,下面是代码(带注释):
```c
#include <reg52.h> // 8052单片机的头文件
#define uchar unsigned char // 定义无符号字符型变量
#define uint unsigned int // 定义无符号整型变量
sbit LSA = P2^2; // 数码管控制引脚
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit key1 = P3^4; // 矩阵按键引脚
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
sbit key_send = P3^3;
uchar code table[] = { // 数码管显示字符表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90
};
uchar num; // 存储按下的数字
bit send_flag; // 发送标志位
void delay(uint z) { // 延时函数
uint x,y;
for(x = z; x > 0; x--)
for(y = 110; y > 0; y--);
}
uchar KeyScan() { // 矩阵键盘扫描函数
uchar val;
P1 = 0xF0;
if (key1 == 0) {
delay(10); // 延时去抖
if (key1 == 0) val = 1;
}
else if (key2 == 0) {
delay(10);
if (key2 == 0) val = 2;
}
else if (key3 == 0) {
delay(10);
if (key3 == 0) val = 3;
}
else if (key4 == 0) {
delay(10);
if (key4 == 0) val = 4;
}
else {
val = 0;
}
return val;
}
void DigDisplay() { // 数码管显示函数
uchar i;
for (i = 0; i < 8; i++) { // 扫描8位数码管
switch(i) { // 根据位数选择控制引脚
case(0): LSA = 0; LSB = 0; LSC = 0; break;
case(1): LSA = 1; LSB = 0; LSC = 0; break;
case(2): LSA = 0; LSB = 1; LSC = 0; break;
case(3): LSA = 1; LSB = 1; LSC = 0; break;
case(4): LSA = 0; LSB = 0; LSC = 1; break;
case(5): LSA = 1; LSB = 0; LSC = 1; break;
case(6): LSA = 0; LSB = 1; LSC = 1; break;
case(7): LSA = 1; LSB = 1; LSC = 1; break;
}
P0 = table[num % 10]; // 显示个位
delay(100); // 延时
P0 = 0x00; // 关闭数码管
num /= 10; // 取下一位数字
}
}
void main() {
send_flag = 0;
while(1) { // 主程序循环
if (send_flag == 1) { // 如果发送标志位为1
SBUF = num; // 发送数字到计算机
while(!TI); // 等待发送完成
TI = 0; // 发送完成,清除发送标志位
send_flag = 0; // 清除发送标志位
}
else { // 如果发送标志位为0
num = 0;
while (1) { // 等待按键按下
if (key_send == 0) { // 如果发送键按下
send_flag = 1; // 设置发送标志位为1
break; // 跳出循环
}
else {
num = KeyScan(); // 扫描矩阵键盘
if (num != 0) { // 如果按下数字键
DigDisplay(); // 数码管显示数字
}
}
}
}
}
}
```
注:此代码只是实现了数码管显示和串口发送功能,需要在串口接收程序中接收并处理数据。
阅读全文