自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

總結下自己學習遇到的情況:1。每天學習點少量的新知識覺得心情愉悅 2。新知識的量>自己接受的承受範圍,就覺得很糟糕。不知不覺地就有牴觸學習的意識,越要強迫自己學,放棄得越快,放棄了,過一段時間還想學,但隨著時間流逝前面知識忘得差不多了,然後又重新學,週而復始浪費了大量時間。人最大的敵人還是自己啊,克服壞毛病,永遠不要放棄,只要堅持你有能力做任何你能想象的事情,重拾自我從今天開始做起。。。。

液晶Lcd1602顯示字元

做到只要能顯示字元就行,第一次看驅動檔案和原理看的頭蒙,先會用就行。

LCD1602是一個有16引腳的字元液晶屏。8個數據引腳(D0-D7)和3個控制引腳(RS,RW,EN)。其餘5個引腳用於LCD的電源和背光。

螢幕可以顯示2行,每行可以顯示16個字元。每個字元由5x8(列x行)畫素矩陣組成。

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

自己遇到的一些問題

1。_nop()_是intrins標頭檔案的裡單週期空語句,可是實現極短延時。nop表示空迴圈一個機器指令的時間,一個nop延時多少根據晶振所定,12M中表示1us

1S=1000ms(毫秒)=1000 000us(微妙)。1us(毫秒)=1000ns(納秒)

LCD1602

的速度是

納秒級別

的,而

51微控制器

毫秒級別

的,所以基本不需要讀取 忙標誌,只要微延時就行了,proteus模擬軟體不支援判忙函式

void lcd1602CheckBusy()//判忙函式{ DPORT = 0xff; RS=0; RW=1; E=1; while(DPORT&0x80); E=0;}

2。稍微瞭解下LCD1602常用的一些命令,再看LCD1602初始化程式碼不會這麼懵了

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

常用的LCD1602命令

3。Proteus中學會使用終端符號

兩個引腳不用連線也能導通方法:兩端要加上終端符號,然後再終端上加上網路標號,要連在一起的兩個終端必須有相同的網路標號

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

模組化程式設計思想

先學會抄作業,瞭解如何模組化程式設計

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

固定格式條件預編譯

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

把LCD1602驅動程式碼匯入到工程中

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

模擬軟體效果

自學51微控制器05:簡單複製貼上程式碼讓LCD1602顯示字元

完整的驅動程式碼

delay。h

#ifndef _DELAY_H_#define _DELAY_H_void DelayUs2x(unsigned char t);void delayNms(unsigned char t);#endif

delay。c

void DelayUs2x(unsigned char t){ while(——t);}/*———————————————————————— mS延時函式,含有輸入引數 unsigned char t,無返回值 unsigned char 是定義無符號字元變數,其值的範圍是 0~255 這裡使用晶振12M,精確延時請使用匯編————————————————————————*/void delayNms(unsigned char t){ while(t——) { //大致延時1mS DelayUs2x(245); DelayUs2x(245); }}

lcd1602.h

#ifndef _LCD1602_H_#define _LCD1602_H_#include#include#include “delay。h” //請根據晶振自行編寫延時函式#define DPORT P0 // D0-D7根據實際硬體連線修改sbit RS = P1^7; // 根據實際硬體連線修改sbit RW = P1^6; // 根據實際硬體連線修改sbit E = P1^5; // 根據實際硬體連線修改void lcd1602WriteCmd(unsigned char cmd); //寫命令函式void lcd1602WriteByte(unsigned char dat);//寫資料函式void lcd1602Init(); // 初始化函式void lcd1602WritePos(unsigned char xPos,unsigned char yPos);void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat); // 寫1個字元void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s); // 寫字串#endif

lcd1602.c

#include “lcd1602。h”void lcd1602WriteByte(unsigned char dat)//寫資料函式{ delayNms(5);//判忙函式不支援proteus,延時5ms RS=1; //將RS引腳設為高電平,RS = 1(寫資料模式) RW=0; //將RW引腳設為低電平,RW = 0(寫操作模式) DPORT=dat;// 將待寫資料送到資料埠(D0-D7) E=1; //使能脈衝,LCD鎖存D0至D7處的資料並執行命令 _nop_();//短暫延時1個機器週期1us左右 _nop_(); E=0; //關閉使能釋放匯流排} void lcd1602WriteCmd(unsigned char cmd) //寫命令函式{ delayNms(5);//判忙函式不支援proteus,延時5ms RS=0; //將RS引腳設為低電平,RS = 0(寫命令模式) RW=0; //將RW引腳設為低電平,RW = 0(寫操作模式) DPORT=cmd;// 將待寫資料送到資料埠(D0-D7) E=1; //使能脈衝,LCD鎖存D0至D7處的資料並執行命令 _nop_();// 短暫延時1個機器週期1us左右 _nop_(); E=0; //關閉使能釋放匯流排} void lcd1602Init() // LCD1602 初始化函式 { delayNms(20); /*LCD1602的上電初始化時間大約15ms */ lcd1602WriteCmd(0x38); /*設定2行,5x8矩陣,8位模式*/ lcd1602WriteCmd(0x0c); //顯示開啟,游標關閉 lcd1602WriteCmd(0x06); //資料從左到右以遞增順序寫入 lcd1602WriteCmd(0x01);//清屏耗時比較長需要2ms左右,別的命令以nm為單位 delayNms(5); }// 內部函式用於設定顯示字元起始座標void lcd1602WritePos(unsigned char xPos,unsigned char yPos) { unsigned char tmp; xPos&=0x0f; // x位置範圍是0~15 yPos&=0x01; // y位置範圍是0~1 if(yPos==0) // 顯示第一行 tmp=xPos; // 第一行字元地址從 0x00 開始 else tmp=xPos+0x40; // 第二行字元地址從 0x40 開始 lcd1602WriteCmd(tmp|0x80);//設定 RAM 寫入的地址}//在指定的行與列顯示指定的字元,xpos:行,ypos:列,c:待顯示字元void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat){ lcd1602WritePos(xPos,yPos); lcd1602WriteByte(Dat);}// 在液晶上顯示字串,xpos:行座標,ypos:列座標,str-字串指標void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s){ unsigned char i=0; lcd1602WritePos(xPos,yPos); // 起始座標 while(s[i]) { lcd1602WriteByte(s[i]); i++; if (i>=16) break; // 超出16個字元外的資料丟棄 }}

main。c

#include#include“lcd1602。h”void main(){ lcd1602Init(); lcd1602WriteChar(7,0,‘H’); lcd1602WriteChar(8,0,‘i’); lcd1602WriteString(3,1,“2021-03-07”); while(1);}