89c52串口通信+LCD1602显示

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

#include "lcd.h"

设置一下 lcd.h里的参数,打开原理图
89c52串口通信+LCD1602显示_第3张图片
对应的我们打开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字符

3、然后设置串口中断,这里我偷懒了,用的单片机小精灵直接生成的c语言代码
89c52串口通信+LCD1602显示_第4张图片
直接复制粘贴就好,然后在这个框架上进行修改,波特率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、编译烧录后,用串口调试工具进行测试
89c52串口通信+LCD1602显示_第5张图片

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

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

你可能感兴趣的:(温故知新)