51单片机串行口实现数据在lcd上显示代码
时间: 2024-03-15 20:44:41 浏览: 119
要在LCD上显示串口接收到的数据,需要以下步骤:
1. 设置LCD引脚和工作模式。
2. 初始化串口模块,包括设置工作模式、中断优先级和使能串口中断等。
3. 编写发送和接收函数,通过串口发送和接收数据。
4. 在主函数中调用发送和接收函数,并将接收到的数据显示在LCD上。
以下是一个简单的示例代码:
```
#include <reg52.h>
#define FOSC 11059200L // 定义晶振频率
#define BAUD 9600 // 定义波特率
sbit RS = P1^0; // LCD RS引脚
sbit RW = P1^1; // LCD RW引脚
sbit EN = P1^2; // LCD EN引脚
sbit LCD_D4 = P1^4; // LCD 数据引脚 D4
sbit LCD_D5 = P1^5; // LCD 数据引脚 D5
sbit LCD_D6 = P1^6; // LCD 数据引脚 D6
sbit LCD_D7 = P1^7; // LCD 数据引脚 D7
void init_lcd(); // 初始化LCD函数
void write_cmd(unsigned char cmd); // 发送命令函数
void write_data(unsigned char dat); // 发送数据函数
void delay_ms(unsigned int ms); // 延时函数
void init_uart(); // 初始化串口函数
void send_char(unsigned char ch); // 发送字符函数
unsigned char receive_char(); // 接收字符函数
void main()
{
unsigned char ch;
init_lcd(); // 初始化LCD
init_uart(); // 初始化串口
while(1)
{
ch = receive_char(); // 接收字符
write_data(ch); // 将字符显示在LCD上
}
}
void init_lcd()
{
write_cmd(0x38); // 设置工作模式: 8位数据总线,2行显示,5x7点阵
write_cmd(0x0c); // 开启显示,不显示光标
write_cmd(0x06); // 设置光标移动方向: 光标右移,字符不移动
write_cmd(0x01); // 清屏
}
void write_cmd(unsigned char cmd)
{
RS = 0; // 发送命令
RW = 0;
LCD_D7 = cmd & 0x80;
LCD_D6 = cmd & 0x40;
LCD_D5 = cmd & 0x20;
LCD_D4 = cmd & 0x10;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
LCD_D7 = cmd & 0x08;
LCD_D6 = cmd & 0x04;
LCD_D5 = cmd & 0x02;
LCD_D4 = cmd & 0x01;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
}
void write_data(unsigned char dat)
{
RS = 1; // 发送数据
RW = 0;
LCD_D7 = dat & 0x80;
LCD_D6 = dat & 0x40;
LCD_D5 = dat & 0x20;
LCD_D4 = dat & 0x10;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
LCD_D7 = dat & 0x08;
LCD_D6 = dat & 0x04;
LCD_D5 = dat & 0x02;
LCD_D4 = dat & 0x01;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
}
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 110; j++);
}
}
void init_uart()
{
TMOD = 0x20; // 设置定时器1为模式2,用于计算波特率
TH1 = 256 - FOSC / 12 / 32 / BAUD; // 计算波特率重载值
TL1 = TH1;
PCON = 0x00; // 不倍频
SCON = 0x50; // 设置串口工作模式
ES = 1; // 使能串口中断
EA = 1; // 使能总中断
TR1 = 1; // 启动定时器1
}
void send_char(unsigned char ch)
{
SBUF = ch; // 发送字符
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志位
}
unsigned char receive_char()
{
unsigned char ch;
while(!RI); // 等待接收完成
ch = SBUF; // 读取接收到的字符
RI = 0; // 清除接收标志位
return ch;
}
void uart_isr() interrupt 4
{
if(RI) // 如果接收到数据
{
RI = 0; // 清除接收标志位
}
if(TI) // 如果发送完成
{
TI = 0; // 清除发送标志位
}
}
```
该代码实现了将串口接收到的数据显示在LCD上,可以通过调用 write_data 函数将数据显示在LCD上。注意,该代码仅供参考,具体实现需要根据具体的应用场景进行修改和完善。