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,操作更方便哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章