用51单片机写一个串口控制lcd1602的代码
时间: 2024-01-21 14:03:36 浏览: 73
51单片机串口通信1602显示
以下是51单片机串口控制LCD1602的代码,假设使用的是普通的1602液晶屏,数据线采用4位接口方式:
```c
#include <reg52.h>
#define LCD_RS P1_0
#define LCD_RW P1_1
#define LCD_EN P1_2
#define LCD_DATA P0
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 114; j++);
}
void lcd_write_cmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = (cmd & 0xF0);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
LCD_DATA = (cmd << 4);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
}
void lcd_write_data(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = (dat & 0xF0);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
LCD_DATA = (dat << 4);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
}
void lcd_init()
{
lcd_write_cmd(0x02); //进入4位模式
lcd_write_cmd(0x28); //设置16x2显示,5x8点阵,4位接口
lcd_write_cmd(0x0C); //开显示,关光标,不闪烁
lcd_write_cmd(0x06); //文字不动,地址自增
lcd_write_cmd(0x01); //清屏
delay_ms(10);
}
void uart_init()
{
TMOD = 0x20; //定时器1,模式2
TH1 = 0xFD; //波特率9600,使用11.0592 MHz晶振
TL1 = 0xFD;
TR1 = 1; //开启定时器1
SCON = 0x50; //8位数据,可变波特率,允许接收
ES = 1; //开启串口中断
EA = 1; //开启总中断
}
void uart_send_byte(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待发送完成
TI = 0; //清除发送完成标志位
}
void uart_send_string(unsigned char *str)
{
while (*str != '\0')
{
uart_send_byte(*str++);
}
}
void main()
{
uart_init();
lcd_init();
while (1)
{
//等待串口接收中断
}
}
void uart_isr() interrupt 4
{
unsigned char dat;
if (RI) //接收到数据
{
dat = SBUF;
lcd_write_data(dat);
RI = 0; //清除接收中断标志位
}
}
```
在上述代码中,我们定义了`lcd_write_cmd()`和`lcd_write_data()`函数用于向LCD屏幕发送命令和数据,定义了`lcd_init()`函数用于初始化LCD屏幕,定义了`uart_init()`函数用于初始化串口,定义了`uart_send_byte()`和`uart_send_string()`函数用于向串口发送数据,定义了`uart_isr()`中断服务函数用于处理串口接收中断。在主函数中,我们初始化串口和LCD屏幕,并在一个死循环中等待串口接收中断。当串口接收到数据时,会触发中断服务函数,将接收到的数据发送到LCD屏幕上显示。
阅读全文