LCD1602的解讀(詳細步驟分析)

編程初始化條件–寫命令
LCD1602液晶模塊內部的控制器共有11條控制指令
在這裏插入圖片描述
**

一、

**
DDRAM(display data RAM)是顯示數據隨機存儲器
CGROM :1602液晶模塊內部的字符發生存儲器(CGROM:Custom Glyph Read-only Memory定製字符只讀存儲器)已經存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A” ; 首先顯示內容分爲兩種,一種是常用字符,存儲在CGROM中,用戶可以直接調用,另一種是自定義的字符,比如自己設計的一些奇怪的圖形之,存儲在CGRAM;
對於CGRAM和CGROM只是在你想要定製你自己想要的字符時纔用到,也是寫命令進行初始化時設置的指令
在這裏插入圖片描述
【注意】這個圖在指令設置時對應的地址不一定對,主要是讀者方便理解CGRAM和CGROM
在這裏插入圖片描述
LCD的已有的字模存儲在CGROM中,自定義的存儲在CGRAM,留給自定義的位置只有8個地址,字模地址爲01000000-01000111八個地址,也就是最多自定義8個符號或者圖形。
LCD1602按其說明書說明,可以設置成爲四位總線(想當於4個並行接口),原八位並口輸入接線可以減少四個,即只接D4-D7,這適用於單片機接口比較少或比較緊張的情況下。不過,接成四位總線後,發送任何八位數據都應分兩次進行,先發高四位,再發低四位。在初始化時,應將LCD1602設置成四位總線。其他控制與八位總線完全相同。

定製字符這部分可以參考一下該作者的
原文鏈接:https://blog.csdn.net/weixin_42133183/article/details/80911996

地址是用16進製表示的,比如00H表示第一個字節,十六進制27轉換爲十進制就是39,表示第40個字節;第二行是直接從十六進制40H開始的(第一行後面的還有一些地址不使用所以在這不提,僅提到這80個字節)
舉例比如第二行第一字符0100 0000(40H) 根據指令8可知,DDRAM存儲器的地址設置(1000 0000)+ 屏幕字符座標的具體地址(0100 0000)
這個用處只是用來你顯示的數據的第一個字符從哪裏開始

# include"reg51.h"

typedef unsigned int u16;
typedef unsigned char u8;

#define lcd1602D0_D7 P0 //D0-D7
sbit lcd_E=P2^7; //使能端
sbit lcd_W=P2^5; 
sbit lcd_RS=P2^6;

void delay(u16 i)
{
   while(i--);
}

u8 display1[]="     TEST Distance!!!";
u8 display2[]=":0.0000 m";//輸出一個字符串

void lcdwritecommand(u8 comd)	 //先寫命令。。。
                              //命令也是靠時序來執行的
{
   lcd_E=0;//使能
   lcd_RS=0;//0表示選擇寫命令,1表示選擇寫數據
   lcd_W=0;// 0表示寫,1表示讀

   lcd1602D0_D7=comd;//將該一個字節數據放入總線(直接對應p0管腳)
   delay(10);//視頻說要延時1個ms???

   lcd_E=1;
   lcd_E=0;	 //使能產生一個下降沿
}
void lcdwritedat(u8 dat)	 //後寫數據。。。。根據寫數據時序圖來寫
                        //(以下內容已經是在寫時序中)
{
   lcd_E=0;//使能
   lcd_RS=1;//0表示選擇寫命令,1表示選擇寫數據
   lcd_W=0;// 0表示寫,1表示讀

   lcd1602D0_D7=dat;//將該一個字節數據放入總線(直接對應p0管腳)
   delay(10);//

   lcd_E=1;
   lcd_E=0;	 //使能產生一個下降沿
}
void lcdinit()	  
{   
   lcdwritecommand(0x38);//LCD1602指令4,選擇8總線(並行口)
   lcdwritecommand(0x0f);//指令3
   lcdwritecommand(0x06);//指令2
   lcdwritecommand(0x01);//指令1
   lcdwritecommand(0x8f);//顯示初始數據光標第一行第一列???
   //問題一:出現一個問題就是數據是從第6位開始顯示的
}
void main()
{
   u8 i,j;
   lcdinit(); //lcd初始化
   for(i=0;i<21;i++)
   {
       lcdwritedat(display1[i]);//第一行一個字符一個字符輸出
	   delay(10);
   }
   lcdwritecommand(0xc1);
   for(j=0;j<9;j++)
   {
       lcdwritedat(display2[j]);//第二行一個字符一個字符輸出
	   delay(10);
   }
   while(1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章