12864點(diǎn)陣液晶顯示模塊的原理和實(shí)例程序(HJ12864M-1)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
12864點(diǎn)陣液晶顯示模塊(LCM)就是由128*64個(gè)液晶顯示點(diǎn)組成的一個(gè)128列*64行的陣列。每個(gè)顯示點(diǎn)對(duì)應(yīng)一位二進(jìn)制數(shù),1表示亮,0表示滅。存儲(chǔ)這些點(diǎn)陣信息的RAM稱為顯示數(shù)據(jù)存儲(chǔ)器。要顯示某個(gè)圖形或漢字就是將相應(yīng)的點(diǎn)陣信息寫入到相應(yīng)的存儲(chǔ)單元中。圖形或漢字的點(diǎn)陣信息當(dāng)然由自己設(shè)計(jì),問題的關(guān)鍵就是顯示點(diǎn)在液晶屏上的位置(行和列)與其在存儲(chǔ)器中的地址之間的關(guān)系。
由于多數(shù)液晶顯示模塊的驅(qū)動(dòng)電路是由一片行驅(qū)動(dòng)器和兩片列驅(qū)動(dòng)器構(gòu)成,所以12864液晶屏實(shí)際上是由左右兩塊獨(dú)立的64*64液晶屏拼接而成,每半屏有一個(gè)512*8 bits顯示數(shù)據(jù)RAM。左右半屏驅(qū)動(dòng)電路及存儲(chǔ)器分別由片選信號(hào)CS1和CS2選擇。(少數(shù)廠商為了簡(jiǎn)化用戶設(shè)計(jì),在模塊中增加譯碼電路,使得128*64液晶屏就是一個(gè)整屏,只需一個(gè)片選信號(hào)。)
顯示點(diǎn)在64*64液晶屏上的位置由行號(hào)(line,0~63)與列號(hào)(column,0~63)確定。512*8 bits RAM中某個(gè)存儲(chǔ)單元的地址由頁地址(Xpage,0~7)和列地址(Yaddress,0~63)確定。每個(gè)存儲(chǔ)單元存儲(chǔ)8個(gè)液晶點(diǎn)的顯示信息。
為了使液晶點(diǎn)位置信息與存儲(chǔ)地址的對(duì)應(yīng)關(guān)系更直觀關(guān),將64*64液晶屏從上至下8等分為8個(gè)顯示塊,每塊包括8行*64列個(gè)點(diǎn)陣。每列中的8行點(diǎn)陣信息構(gòu)成一個(gè)8bits二進(jìn)制數(shù),存儲(chǔ)在一個(gè)存儲(chǔ)單元中。(需要注意:二進(jìn)制的高低有效位順序與行號(hào)對(duì)應(yīng)關(guān)系因不同商家而不同)存放一個(gè)顯示塊的RAM區(qū)稱為存儲(chǔ)頁。即64*64液晶屏的點(diǎn)陣信息存儲(chǔ)在8個(gè)存儲(chǔ)頁中,每頁64個(gè)字節(jié),每個(gè)字節(jié)存儲(chǔ)一列(8行)點(diǎn)陣信息。因此存儲(chǔ)單元地址包括頁地址(Xpage,0~7)和列地址(Yaddress,0~63)。
例如點(diǎn)亮128*64的屏中(20,30)位置上的液晶點(diǎn),因列地址30小于64,該點(diǎn)在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,該點(diǎn)在RAM中頁地址為2,在字節(jié)中的序號(hào)為4;所以將二進(jìn)制數(shù)據(jù)00010000(也可能是00001000,高低順序取決于制造商)寫入Xpage=2,Yaddress=29的存儲(chǔ)單元中即點(diǎn)亮(20,30)上的液晶點(diǎn)。
/////LCD12864液晶屏測(cè)試程序(已通過)//////
////////液晶屏型號(hào):HJ12864M-1//////////
///////////////////////////////////////
#include
#define uchar unsigned char
#define uint unsigned int
//8bit數(shù)據(jù)接入IO口
#define Part P0 //P0接8位數(shù)據(jù)線
//控制數(shù)據(jù)端
sbit LCD_RS=P2^5; //定義12864液晶RS端,寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
sbit LCD_RW=P2^6; //定義12864液晶RW端,讀/寫信號(hào) H:讀 L:寫
sbit LCD_EN=P2^7; //定義12864液晶LCDEN端, 片選信號(hào) 下降沿觸發(fā),鎖存數(shù)據(jù)
//
sbit LCD_PSB=P3^2; //定義12864液晶PSB端, H:并行 L:串行
sbit LCD_RST=P3^4; //定義12864液晶RST端, H:不復(fù)位 L:復(fù)位
uchar code dis1[]={"床前明月光"};
uchar code dis2[]={"疑是地上霜"};
uchar code dis3[]={"舉頭望明月"};
uchar code dis4[]={"低頭思故鄉(xiāng)"};
//=====================================
//毫秒延時(shí)函數(shù)
void delay(uint xms)
{
uint i,j;
for(j=0;i for(i=0;i<110;i++); } //==================================== //LCD忙檢測(cè)函數(shù) bit lcd_busy() { bit result; LCD_RS=0; LCD_RW=1; LCD_EN= 1; result=(bit)(Part & 0x80); LCD_EN=0; return result; } //===================================== //液晶寫命令函數(shù) void lcd_write_cmd(uchar com) { while(lcd_busy()); LCD_RS=0; //選擇指令寄存器 LCD_RW=0; //寫 LCD_EN=0; Part=com; //指令值賦給P0口 delay(5); LCD_EN=1; delay(5); LCD_EN=0; } //===================================== //液晶寫一個(gè)字符數(shù)據(jù)函數(shù) void lcd_write_dat(uchar date) { while(lcd_busy()); LCD_RS=1; //選擇數(shù)據(jù)寄存器 LCD_RW=0; //寫 LCD_EN=0; P0=date; //數(shù)據(jù)值賦給P0口 delay(5); LCD_EN=1; delay(5); LCD_EN=0; } //===================================== //液晶寫一個(gè)字符串函數(shù) void lcd_write_string(uchar *str) { while(*str!='