c语言51单片机PC 端通过串口(STC-ISP 的串口助手)向开发板发送字符串(字符串以’*’字 母结尾,字符数小于 40,波特率 4800),把该字符串显示到 LCD1602 上,第二 次输入的字符串将替换之前的显示,如果字符数大于 16 则滚动显示,串口的数 据传送采用中断方式编程
时间: 2023-12-06 21:02:58 浏览: 30
好的,下面是一个大致的C语言代码实现,供你参考:
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_RS P0_0 // RS引脚
#define LCD_RW P0_1 // RW引脚
#define LCD_EN P0_2 // EN引脚
#define LCD_DATA P1 // 数据口
#define BUF_SIZE 40 // 缓冲区大小
unsigned char buf[BUF_SIZE]; // 接收缓冲区
unsigned char idx; // 缓冲区索引
void init_serial() // 初始化串口
{
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 0xfd; // 波特率4800,定时器1初值
TL1 = 0xfd; // 波特率4800,定时器1初值
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1
SM1 = 1; // 设置串口为模式1
REN = 1; // 允许接收数据
EA = 1; // 允许中断
ES = 1; // 允许串口中断
}
void init_lcd() // 初始化LCD
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay_ms(15); // 延时15ms
lcd_cmd(0x38); // 设置16*2显示,5*7点阵
delay_ms(5); // 延时5ms
lcd_cmd(0x08); // 关闭显示
delay_ms(5); // 延时5ms
lcd_cmd(0x01); // 清屏
delay_ms(5); // 延时5ms
lcd_cmd(0x06); // 光标右移,不移动屏幕
delay_ms(5); // 延时5ms
lcd_cmd(0x0c); // 开启显示,不显示光标,不闪烁
delay_ms(5); // 延时5ms
}
void lcd_cmd(unsigned char cmd) // 发送指令
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void lcd_data(unsigned char dat) // 发送数据
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = dat;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void lcd_puts(unsigned char *str) // 显示字符串
{
unsigned char i;
for(i=0; str[i]!='\0'; i++)
{
lcd_data(str[i]);
}
}
void lcd_clear() // 清屏
{
lcd_cmd(0x01);
}
void lcd_scroll(unsigned char *str) // 滚动显示字符串
{
unsigned char i, j;
while(*str != '\0')
{
lcd_cmd(0x1c); // 光标右移
for(i=0; i<15 && *str!='\0'; i++, str++)
{
lcd_data(*str);
}
if(*str == '\0') break;
lcd_cmd(0x80); // 光标移到第一行
for(j=0; j<15 && *str!='\0'; j++, str++)
{
lcd_data(*str);
}
lcd_cmd(0xc0); // 光标移到第二行
}
}
void display_buf() // 显示缓冲区内容
{
unsigned char i, len;
for(i=0; i<BUF_SIZE && buf[i]!='\0'; i++);
len = i;
if(len <= 16)
{
lcd_cmd(0x80);
lcd_puts(buf);
}
else
{
lcd_scroll(buf);
}
}
void serial_isr() interrupt 4 // 串口中断服务函数
{
if(RI) // 接收到数据
{
RI = 0;
buf[idx++] = SBUF;
if(buf[idx-1] == '*') // 接收到完整字符串
{
buf[idx-1] = '\0'; // 字符串结尾
idx = 0; // 重置索引
lcd_clear(); // 清屏
display_buf(); // 显示缓冲区内容
}
}
}
void main()
{
init_serial(); // 初始化串口
init_lcd(); // 初始化LCD
while(1); // 主循环
}
```
以上是一个大致的实现,具体的细节还需要根据实际情况进行调整。希望能对你有所帮助!