歡迎來圍觀小白講知識,作為硬件中的小白一枚,對于很多大神講得東西總是摸不透,恕小白直言,大神研究得太深入,小白還依然在表面,所以小白還是看小白寫得東西能懂許多。最后還是那一句 大神勿噴。
接下來進入主題教你在12864液晶上顯示一些簡單的文字,這僅僅是顯示文字哦,對于要顯示圖啊什么的,我們還有后續(xù)繼續(xù)說。
</br>
雖然很簡單,但對于初學(xué)者來說,找不到路就很難了,很可能你把代碼燒錄了進去但沒有顯示,這就很尷尬了。所以今天帶大家來學(xué)學(xué)入何簡單地讓顯示屏顯示你要顯示的文字。
液晶基本特征
1. 低電源電壓(VDD:+3V 或+5V),DM12864-A 為 5V,
DM12864-L 為 3.3, 驅(qū)動芯片:ST7920
2.顯示分辨率:128×64 點
3. 內(nèi)置漢字字庫,提供 8192 個 16×16 點陣漢字(簡繁體可選)
4. 內(nèi)置 128 個 16×8 點陣字符
5. 2MHZ 時鐘頻率
6. 顯示方式:STN、半透、正顯
7. 驅(qū)動方式:1/32DUTY,1/5BIAS
8. 視角方向:6 點
9. 背光方式:側(cè)部高亮白色 LED,藍光白字,功耗僅為普通 LED 的 1/5—1/10
10. 通訊方式:串行、并口可選
11 內(nèi)置 DC-DC 轉(zhuǎn)換電路,無需外加負壓
12 無需片選信號,簡化軟件設(shè)計
13 工作溫度: 0℃ - +55℃ ,存儲溫度: -20℃ - +60℃
并行模式下的引腳定義
控制界面的4種模式
由于我們并不需要從液晶中讀出數(shù)據(jù),因為沒什么可讀出來的,所以我們只需向液晶寫入數(shù)據(jù)和寫入命令,因此R/W=0
控制液晶的指令
對于這些指令,當(dāng)我們要用時,刻意去查找就行了,指令中的X表示可以為任何的值,即1或0 。
液晶的時序圖
對于要做的任意模塊來說,看懂時序圖是非常重要的,時序圖就是讓你知道何時寫數(shù)據(jù)、指令。之前我們說了,我們只需寫入就行,不需要讀所以,把R/W置0。
當(dāng)我們要寫代碼時,先把端口定義好先,然后在寫。寫指令把RS置0,按照時序圖延時一下,然后把使能E置0,也延時一下,把指令寫入指令口,即賦值,也要延時一下,再把使能端E拉高,即把E置1,再延時一下,這樣就把指令發(fā)送給了液晶了。
</br>
void write_com(uchar cmdcode)
{
chk_busy();
LCM_RS=0;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=cmdcode;
LCM_EN=0;
}
寫數(shù)據(jù),寫數(shù)據(jù)時,我們要把RS拉低,即置0,按照時序圖延時一下,然后把使能E置0,也延時一下,把數(shù)據(jù)寫入數(shù)據(jù)口,即賦值,也要延時一下,再把使能端E拉高,即把E置1,再延時一下,這樣就把數(shù)據(jù)發(fā)送給了液晶了
</br>
void write_data(uchar Dispdata)
{
chk_busy();
LCM_RS=1;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=Dispdata;
LCM_EN=0;
}
只有使能端E處于高電平時,數(shù)據(jù)才是穩(wěn)定的,所以我們發(fā)完數(shù)據(jù)或指令要稍微延時一下的原因。接下來我們就要在屏幕上指定我們要顯示的地方顯示了,即定位我們文字的位置。
</br>
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
write_com(pos); //設(shè)置地址
}
在發(fā)送數(shù)據(jù)或指令時,我們得檢查一下,是否液晶已經(jīng)處理完數(shù)據(jù)或指令了,所以我們得忙位檢查一下
void chk_busy()
{
LCM_RS=0;
LCM_RW=1;
LCM_EN=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
LCM_EN=0;
}
當(dāng)我們要顯示第二主頁面時,我們要清理一下屏幕上的文字,即清屏。
清屏很簡單,只需發(fā)送指令0x01即可。
void lcm_clr(void)
{
write_com(0x01);
}
當(dāng)然我們顯示之前得初始化一下液晶,即要是液晶如何顯示,有無光標(biāo)等
void lcm_init() //初始化液晶函數(shù)
{
write_com(0x30); //選擇8bit數(shù)據(jù)流
write_com(0x0c); //開顯示(無游標(biāo)、不反白)
lcm_clr(); //清除顯示,并且設(shè)定地址指針為00H
write_com(0x06); //光標(biāo)右移,DDRAM位址計數(shù)器(AC)加1,不整屏 移動
}
好了,有了這些函數(shù),顯示文字也就很容易了
#inclue<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Lcd_Bus P0 //數(shù)據(jù)口
sbit LCM_EN = P1^0; //液晶使能控制
sbit LCM_RW = P1^1; //液晶讀/寫控制
sbit LCM_RS = P1^2; //寄存器選擇輸入
sbit LCM_PSB = P1^3; //串/并方式控制 0時為串,1時為并
uchar code dis1[] = {"歡迎關(guān)注"};
uchar code dis3[] = {"五分錢特效"};
uchar code dis4[] = {"不定期更新"};
void main()
{
void lcm_init();
void lcm_clr(void);
uchar i;
Delay(10); //延時
lcd_pos(0,1); //設(shè)置顯示位置為第一行的第1位開始顯示
i = 0;
while(dis1[i] != '\0')
{ //顯示字符
write_data(dis1[i]);
i++;
}
lcd_pos(1,1); //設(shè)置顯示位置為第三行的第1位開始顯示
i = 0;
while(dis3[i] != '\0')
{
write_data(dis3[i]); //顯示字符
i++;
}
lcd_pos(2,1); //設(shè)置顯示位置為第三行的第1個字符
i = 0;
while(dis4[i] != '\0')
{
write_data(dis4[i]); //顯示字符
i++;
}
while(1);
}
這樣就能顯示想要顯示的文字了