51单片机串口通信驱动lcd1602的代码
时间: 2023-10-06 09:10:20 浏览: 108
以下是基于51单片机串口通信驱动LCD1602的代码,代码中使用了STC89C52单片机和串行LCD1602模块:
```
#include <reg52.h> //引入STC89C52头文件
#include <intrins.h> //引入Keil C中的内置函数
typedef unsigned char uchar;
typedef unsigned int uint;
#define LCD1602_DB P0 //定义LCD1602的数据总线接口
sbit RS = P1^0; //定义RS
sbit RW = P1^1; //定义RW
sbit EN = P1^2; //定义EN
void delay(uint xms) //延时函数
{
uint i, j;
for(i = xms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void write_com(uchar com) //写入命令函数
{
RS = 0; //RS = 0,写入命令
RW = 0; //RW = 0,写入数据
LCD1602_DB = com; //写入命令数据
EN = 1; //EN = 1,使能
_nop_(); //空操作,延时
EN = 0; //EN = 0,取消使能
}
void write_data(uchar dat) //写入数据函数
{
RS = 1; //RS = 1,写入数据
RW = 0; //RW = 0,写入数据
LCD1602_DB = dat; //写入数据
EN = 1; //EN = 1,使能
_nop_(); //空操作,延时
EN = 0; //EN = 0,取消使能
}
void init() //初始化函数
{
write_com(0x38); //设置16×2显示,8位数据接口,5×7点阵
write_com(0x08); //显示关闭
write_com(0x01); //清屏
write_com(0x06); //写入数据后游标自动加1,屏幕不移动
write_com(0x0c); //显示开启,游标关闭
}
void main() //主函数
{
uchar i = 0, j = 0, k; //初始化计数变量
init(); //初始化LCD1602
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //设置定时器1为8位自动重载计数器,计数器溢出中断方式
TH1 = 0xfd; //波特率为9600,定时器1初值为0xfd
TL1 = 0xfd; //波特率为9600,定时器1初值为0xfd
TR1 = 1; //启动定时器1,开始计数
ES = 1; //允许串口中断
EA = 1; //允许总中断
while(1) //循环
{
write_com(0x80); //设置游标位置为第一行第一列
for(k = 0; k < 16; k++) //循环16次
{
write_data(' '); //写入空格
}
write_com(0x80); //设置游标位置为第一行第一列
while(j < i) //循环直到j >= i
{
write_data(SBUF[j]); //写入接收到的数据
j++; //j自加1
}
delay(500); //延时500ms
}
}
void ser() interrupt 4 //串口中断函数
{
if(RI) //如果接收中断标志为1
{
RI = 0; //接收中断标志置0
SBUF = P1; //将接收到的数据发送出去
}
if(TI) //如果发送中断标志为1
{
TI = 0; //发送中断标志置0
}
}
```
在代码中,我们定义了三个引脚分别用来控制LCD1602的RS、RW、EN,还定义了LCD1602的数据总线接口,使用了初始化函数init()来初始化LCD1602,使用了延时函数delay()来延时,使用了写入命令函数write_com()和写入数据函数write_data()来写入命令和数据,使用了串口中断函数ser()来处理接收到的数据。在主函数中,我们使用了定时器和串口通信来接收外部传输的数据,并在LCD1602上进行显示。
阅读全文