89c52串口通信+LCD1602显示

接下来我们捡起来lcd1602的显示 与串口通信。实现的功能是通过上位机给单片机通过串口发送信息,然后将发送的信息在lcd1602上显示出来。
(码字好累啊,这是第二遍码字了刚刚这篇博客都要写完了,要粘贴最后代码的时候,被bug掉了,csdn的粘贴代码段千万不要有空行,分分钟要你老命,记得保存到草稿箱)
材料:单片机开发板 lcd1602 单片机小精灵 串口调试助手
1、首先我们新建工程,过程略
2、之前我有写过一lcd的库文件,可以实现简单的显示功能,我们将此头文件打包放在工程根目录下。
打包安放
库文件将在文章最后共享出来
然后设置include paths,把库函数所在文件夹添加进去
设置
程序中也包含进去

#include "lcd.h"

设置一下 lcd.h里的参数,打开原理图
原理图
对应的我们打开lcd.h修改下lcd.h 的参数

#define LCD1602_DATAPINS P0
sbit LCD1602_E=P1^4;
sbit LCD1602_RW=P1^5;
sbit LCD1602_RS=P1^6;

对于这个lcd库函数调用非常方便例如

 LcdInit(); //初始化
 LcdLine(1,1);//把光标定位在第一行第一个单元
 LcdWriteData(‘a’);显示a字符

a

3、然后设置串口中断,这里我偷懒了,用的单片机小精灵直接生成的c语言代码
生成代码
直接复制粘贴就好,然后在这个框架上进行修改,波特率600 这里无所谓,速度慢点而已
复(妈蛋这个复字又删除不了了,赶紧保存一下)。
4、下面是我写的代码

#include "reg52.h"
#include "lcd.h"
void InitUART(void);
void SOneByte(unsigned char c);
void UARTInterrupt(void);
unsigned char k;
unsigned char displaybuf[2][16]={"                ","                "};
unsigned char f1=0;
unsigned char f2=0;
int main()
{
 int a,b;
 InitUART();
 LcdInit(); 
 LcdLine(1,1);
 while(1)
{
 for(a=0;a<2;a++)
 {
  LcdLine(a+1,1);
  for(b=0;b<16;b++)
  LcdWriteData(displaybuf[a][b]);
 }
}
}
void InitUART(void)
{
 TMOD = 0x20;
 SCON = 0x50;
 TH1 = 0xA0;
 TL1 = TH1;
 PCON = 0x80;
 EA = 1;
 ES = 1;
 TR1 = 1;
}
void SOneByte(unsigned char c)
{
 SBUF = c;
 while(!TI);
 TI = 0;
}
void UARTInterrupt(void) interrupt 4
{
 if(RI)
 {
  RI = 0;
  if(f1<16) displaybuf[0][f1++]=SBUF;
  else if(f1==16&&f2<16) displaybuf[1][f2++]=SBUF;
  else 
  {
   for(;f1>0;f1--)
   {
    displaybuf[0][f1]=' ';
    displaybuf[1][f1]=' ';
   }
   f2=f1;
   displaybuf[0][f1++]=SBUF;
  }
  SBUF=k;
  SOneByte(SBUF);
 }
 else
 {
  TI = 0;
 }
}

5、编译链接生成hex 烧录即可
编(啊啊啊这个编又删不掉了 赶紧保存)
6、编译烧录后,用串口调试工具进行测试
调试

结果

搞定!1月3号就考试了,1天看一门课,难受。

链接:https://pan.baidu.com/s/1OmqfIiVFvTS_1MRG3uCaiQ
提取码:apfe
复制这段内容后打开百度网盘手机App,操作更方便哦

  • 32
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
以下是基于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上进行显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值