编程51单片机实现通过串口控制lcd显示
时间: 2023-10-16 12:07:19 浏览: 143
lcd.rar_51串口控制
以下是51单片机通过串口控制LCD显示的简单示例代码:
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_PORT P2 // LCD 数据口
#define RS P3_4 // LCD RS
#define RW P3_5 // LCD RW
#define E P3_6 // LCD E
#define BAUDRATE 9600 // 串口波特率
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 110; j++);
}
}
void lcd_write_cmd(unsigned char cmd) {
RS = 0; // RS=0, RW=0, 写命令
RW = 0;
LCD_PORT = cmd;
E = 1;
_nop_();
_nop_();
_nop_();
E = 0;
delay_ms(1);
}
void lcd_write_data(unsigned char dat) {
RS = 1; // RS=1, RW=0, 写数据
RW = 0;
LCD_PORT = dat;
E = 1;
_nop_();
_nop_();
_nop_();
E = 0;
delay_ms(1);
}
void lcd_init() {
lcd_write_cmd(0x38); // 8位数据总线,2行,5x7点阵字符
lcd_write_cmd(0x0c); // 开显示,不显示光标
lcd_write_cmd(0x06); // 光标右移
lcd_write_cmd(0x01); // 清屏
}
void uart_init() {
TMOD = 0x20; // 8位自动重装载定时器1,模式2
TH1 = 0xfd; // 波特率9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0; // 8位数据位
SM1 = 1; // 波特率可变
REN = 1; // 允许接收
EA = 1; // 开全局中断
ES = 1; // 开串口中断
}
void uart_send(unsigned char dat) {
SBUF = dat;
while (!TI);
TI = 0;
}
void uart_recv() interrupt 4 {
unsigned char dat;
if (RI) {
RI = 0;
dat = SBUF;
lcd_write_data(dat);
}
}
void main() {
lcd_init();
uart_init();
while (1);
}
```
在这个示例代码中,我们使用P2口作为LCD的数据口,P3.4、P3.5和P3.6分别作为LCD的RS、RW和E控制口。首先,我们需要定义一些基本的函数,如延时函数 delay_ms()、LCD写命令函数 lcd_write_cmd() 和 LCD写数据函数 lcd_write_data()。然后,我们在函数 lcd_init() 中初始化LCD屏幕。接下来,在函数 uart_init() 中初始化串口模块,并开启全局中断和串口中断。在串口中断服务函数 uart_recv() 中,我们接收串口数据,并将其写入LCD屏幕中。最后,在主函数中,我们初始化LCD和串口模块,并进入一个死循环中等待串口数据的接收。
要使用这个程序,你需要将其下载到51单片机中,并连接串口终端程序来发送数据。在串口终端程序中,你可以输入任意字符,并发送给51单片机,程序会将其写入LCD屏幕中。注意,你需要在串口终端程序中设置波特率为9600,与程序中指定的波特率相同,否则会出现乱码。
阅读全文