编写代码使51单片机和 pc 端串 行输入输出,用单片机矩阵键盘 输入一个多位数,发送到 pc 端。 同时输入的数字在数码管显示。
时间: 2024-03-18 07:38:52 浏览: 20
好的,下面是一个简单的示例代码,实现了51单片机和PC端的串口通信,以及矩阵键盘输入和数码管显示功能。这个示例代码使用了P0口作为数码管的控制端口,使用P1口作为串口通信的引脚,使用P3口作为矩阵键盘的输入和输出端口。
```c
#include <reg51.h>
#define BAUDRATE 9600 // 串口波特率
#define FOSC 11059200 // 晶振频率
#define TH1_RELOAD (256 - (FOSC / BAUDRATE) / 12) // 定时器1重装值
sbit D1 = P0 ^ 0; // 数码管 D1
sbit D2 = P0 ^ 1; // 数码管 D2
sbit D3 = P0 ^ 2; // 数码管 D3
sbit D4 = P0 ^ 3; // 数码管 D4
sbit LSA = P0 ^ 4; // 数码管段选A
sbit LSB = P0 ^ 5; // 数码管段选B
sbit LSC = P0 ^ 6; // 数码管段选C
unsigned char code digit[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
unsigned char code keymap[] = { // 矩阵键盘键值表
'1', '2', '3', 'A',
'4', '5', '6', 'B',
'7', '8', '9', 'C',
'*', '0', '#', 'D'
};
unsigned char keyvalue = 0; // 矩阵键盘输入的键值
unsigned char buffer[10] = {0}; // 存储输入的多位数字
unsigned char bufcount = 0; // 当前输入数字的位数
void delay(unsigned int t) { // 延时函数
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 120; j++);
}
void init_uart() { // 初始化串口通信
TMOD |= 0x20;
TH1 = TH1_RELOAD;
TL1 = TH1_RELOAD;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
TI = 0;
RI = 0;
}
void init_keyboard() { // 初始化矩阵键盘
P3 = 0xff;
}
void scan_keyboard() { // 扫描矩阵键盘
unsigned char i, j;
P3 = 0xfe;
for (i = 0; i < 4; i++) {
if (P3 != 0xfe) {
delay(5);
if (P3 != 0xfe) {
for (j = 0; j < 4; j++) {
P3 = 0xf7 ^ (1 << j);
if (P3 != 0xf7) {
delay(5);
if (P3 != 0xf7) {
keyvalue = keymap[i * 4 + j];
return;
}
}
}
}
}
P3 = (P3 << 1) | 0x01;
}
}
void display(unsigned char num) { // 数码管显示
LSA = 0;
LSB = 0;
LSC = 0;
P0 = digit[num / 1000];
delay(5);
LSA = 1;
P0 = digit[num % 1000 / 100];
delay(5);
LSB = 1;
P0 = digit[num % 100 / 10];
delay(5);
LSC = 1;
P0 = digit[num % 10];
delay(5);
}
void send_char(unsigned char ch) { // 发送一个字符到串口
SBUF = ch;
while (!TI);
TI = 0;
}
void main() {
unsigned int num = 0;
unsigned char i;
init_uart();
init_keyboard();
while (1) {
scan_keyboard();
if (keyvalue != 0) { // 如果有键值输入
if (keyvalue >= '0' && keyvalue <= '9') { // 如果是数字键
buffer[bufcount++] = keyvalue; // 存储数字
num = num * 10 + (keyvalue - '0'); // 计算数字
display(num); // 数码管显示
} else if (keyvalue == '#') { // 如果是结束键
for (i = 0; i < bufcount; i++) { // 发送数字到串口
send_char(buffer[i]);
}
send_char('\n'); // 发送换行符
num = 0; // 清零计数器
bufcount = 0; // 清空输入缓存
display(0); // 数码管清零
}
keyvalue = 0; // 清空键值
}
}
}
```
这个示例代码实现了矩阵键盘输入多位数字,将数字发送到PC端,同时在数码管上显示输入的数字。当输入结束时,按下#键可以将数字发送到PC端,并清空输入缓存和数码管显示。