LCD液晶屏顯示原理
液晶(Liquid Crystal)是一種高分子材料,因為其特殊的物理、化學、光學特性,20世紀中葉開始廣泛應用在輕薄型顯示器上。
液晶顯示器(Liquid Crystal Display,LCD)主要原理是以電流刺激液晶分子產生點、線、面并配合背部燈管構成畫面。
現在來了解一下液晶的物理特性:LCD本身是不能發光的,它需要借助光源進行顯示,即我們平時所說的背光。當光束通過這層液晶時,液晶本身會排排站立或扭轉呈不規則狀,因而阻隔或使光束順利通過。
大多數液晶都屬于有機復合物,由長棒狀的分子構成。在自然狀態下,這些棒狀分子的長軸大致平行。將液晶倒入一個經精良加工的開槽平面,液晶分子會順著槽排列,所以假如那些槽非常平行,則各分子也是完全平行的。
也就是說,若一個平面上的分子南北向排列,則另一平面上的分子東西向排列,而位于兩個平面之間的分子被強迫進入一種90度扭轉的狀態。由于光線順著分子的排列方向傳播,所以光線經過液晶時也被扭轉90度。但當液晶上加一個電壓時,分子便會重新垂直排列,使光線能直射出去,而不發生任何扭轉。
極化濾光器實際是一系列越來越細的平行線。這些線形成一張網,阻斷不與這些線平行的所有光線。極化濾光器的線正好與第一個垂直,所以能完全阻斷那些已經極化的光線。只有兩個濾光器的線完全平行,或者光線本身已扭轉到與第二個極化濾光器相匹配,光線才得以穿透。
所以通過這些特定方向的偏光片再施加電壓就可以讓部分區域光通過,另外部分區域光遮擋,這些明暗相間的點按照一定的像素排列起來的圖像就是我們想要顯示的信息了。
1602液晶顯示模塊內部包含驅動芯片為HD44780(HITACHI)或其他兼容芯片,內部提供了192種字符的庫,用戶可以直接調用。它可以顯示兩行字符,每行包括16個5×8點陣塊組成的顯示字符塊,每個點陣塊為一個字符位,字符間距和行距都為一個點的寬度。
接下來
LCD1602顯示控制
了解LCD顯示原理之后,那要怎樣才能讓它顯示字符呢?這就要先了解其內部驅動芯片的特點和控制方式。單片機控制顯示器驅動也是需要進行通信的,這里就又涉及到我們之前一直強調的時序了,上一節講解uart時我們知道uart通信是要有嚴格的時序要求的,所以它才需要精準的波特率來控制,液晶顯示器控制時序雖然不用像uart那樣精準,但也需要一定的要求。我們先來看一下它的常用接口和引腳說明。
●VSS:電源地引腳。
●VDD:供電電源引腳。
●Vo:液晶顯示偏壓信號引腳,外加0 ~5V電壓以調節顯示對比度。
●RS:寄存器選擇引腳,為高電平時選擇數據寄存器;為低電平時選擇指令寄存器。
●R/W:讀、寫操作選擇引腳,高電平時為讀操作;低電平時為寫操作。
●E:使能信號引腳,低電平有效。
●DB0 ~ DB7:數據總線引腳,用于輸入驅動1602液晶模塊顯示的數據。
●A:背光5V電源引腳。
●K:背光地信號引腳。
現在我們再來了解它的控制時序:
從圖中可以看出,它的讀寫操作中RS,R/W,E三個控制引腳的時序變化是不一樣的。并且數據與指令也有區別,這樣就具體可以分為一下4種情況:
讀狀態——輸入:RS=L,R/W=H,E=H;輸出:D0~D7=狀態字。
讀數據——輸入:RS=H,R/W=H,E=H;輸出:無。
寫指令——輸入:RS=L,R/W=L,E=H,D0~D7=指令碼,E=H;輸出:D0~D7=數據。
寫數據——輸入:RS=H,R/W=L,E=H,D0~D7=數據,E=H;輸出:無。
顯示器內部驅動芯片帶有80字節的RAM緩沖區,其地址對應如下:
但是我們知道顯示屏界面做多只能顯示16*2個字符,那它內部要怎么處理所有的緩沖區呢?
向圖中的00H~0FH、40H~4FH地址中的任意處寫顯示數據時,液晶都可以立即顯示出來;但寫入到10H~27H或50H~67H地址處時,必須通過移屏指令將他們移入可顯示區域才能正常顯示。
顯示器內部內置字符串分布表如下:
顯示驅動的控制指令如下:
以上內容比較多,并且還有部分信息沒有完全列出,這里也不一一列出了,使用時不用記憶,只需對照資料進行編程就好。
LCD1602顯示示例
以上介紹了1602液晶顯示器相關的主要內容,現在我們繪制一個簡單的電路圖再編程測試一下。
什么的電路中我們將顯示器數據端口連接在P0上,其他3根控制引腳連接在P2.2~P2.4上。
現在我們編程讓它來顯示一些簡單的字符:
/*
*這是一個LCD1602顯示程序
*目的是通過顯示屏顯示一些字符
*/
#include
#include
#define DB1602 P0 //1602數據口
typedef unsigned char u8;
typedef unsigned int u16;
sbit rs_1602=P2^2;
sbit rw_1602=P2^3;
sbit en_1602=P2^4;
void delay(u8 ms);
void lcd1602_check_busy();
void Write_Byte_1602(u8 Byte,bit dat);
void lcd1602_Init();
void Write_char1_1602(bit x,u8 y,u8 dat1);
void Write_string_1602(bit x,u8 y,u8 *str);
void main(void)
{
lcd1602_Init();
Write_string_1602(0,0," Hello guy!");
Write_char1_1602(1,6,'-');
Write_string_1602(1,7,"--LCD1602");
while(1)
{
}
}
void delay(u8 ms)
{
u8 i,j;
for(i=0; i< ms; i++)
{
for(j=0; j< 110; j++)
{
;
}
}
}
void lcd1602_check_busy()
{
u8 busy;
bit via;
do
{
rs_1602=0;
rw_1602=1;
DB1602|=0xf0;
en_1602=1;
busy=DB1602;
en_1602=0;
en_1602=1; //
en_1602=0; //
via=(bit)(busy&0x80);
}while(via);
}
void Write_Byte_1602(u8 Byte,bit dat)
{
lcd1602_check_busy(); //忙則等待
rs_1602=dat; //數據命令選擇位
rw_1602=0;
en_1602=1;
DB1602=Byte;
_nop_();
en_1602=0;
}
void lcd1602_Init()
{
Write_Byte_1602(0x38,0); //設置16×2顯示,5×7點陣,8位數據接口
Write_Byte_1602(0x08,0);
Write_Byte_1602(0x01,0); //顯示清屏
Write_Byte_1602(0x06,0); //顯示光標移動設置
Write_Byte_1602(0x0c,0); //顯示開及光標設置
}
void Write_char1_1602(bit x,u8 y,u8 dat1)
{
if(x==0)
{
Write_Byte_1602(0x80+y,0);
}
else
{
Write_Byte_1602(0xc0+y,0);
}
//dat1+=0x30;
Write_Byte_1602(dat1,1);
}
void Write_string_1602(bit x,u8 y,u8 *str)
{
if(x==0)
{
Write_Byte_1602(0x80+y,0);
}
else
{
Write_Byte_1602(0xc0+y,0);
}
while(*str)
{
Write_Byte_1602(*str,1);
str++;
}
}
這段代碼看起來比原來的程序都復雜一點,但還是一些比較基礎的內容,所以大家先自己理解一下,不理解地方可以先看一下資料,這段程序中使用到了我之前沒提到過的內容——指針,后面我會單獨列出出來進行講解。
評論
查看更多