液晶顯示簡介
?、僖壕э@示原理
液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規(guī)模集成電路直接驅(qū)動、易于實現(xiàn)全彩色顯示的特點,目前已經(jīng)被廣泛應(yīng)用在便攜式電腦、數(shù)字?jǐn)z像機、PDA移動通信工具等眾多領(lǐng)域。
②液晶顯示器的分類
液晶顯示的分類方法有很多種,通??砂雌滹@示方式分為段式、字符式、點陣式等。除了黑白顯示外,液晶顯示器還有多灰度有彩色顯示等。如果根據(jù)驅(qū)動方式來分,可以分為靜態(tài)驅(qū)動(Static)、單純矩陣驅(qū)動(Simple Matrix)和主動矩陣驅(qū)動(Active Matrix)三種。
?、垡壕э@示器各種圖形的顯示原理:
線段的顯示
點陣圖形式液晶由M×N個顯示單元組成,假設(shè)LCD顯示屏有64行,每行有128列,每8列對應(yīng)1字節(jié)的8位,即每行由16字節(jié),共16×8=128個點組成,屏上64×16個顯示單元與顯示RAM區(qū)1024字節(jié)相對應(yīng),每一字節(jié)的內(nèi)容和顯示屏上相應(yīng)位置的亮暗對應(yīng)。例如屏的第一行的亮暗由RAM區(qū)的000H——00FH的16字節(jié)的內(nèi)容決定,當(dāng)(000H)=FFH時,則屏幕的左上角顯示一條短亮線,長度為8個點;當(dāng)(3FFH)=FFH時,則屏幕的右下角顯示一條短亮線;當(dāng)(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H時,則在屏幕的頂部顯示一條由8段亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。
字符的顯示
用LCD顯示一個字符時比較復(fù)雜,因為一個字符由6×8或8×8點陣組成,既要找到和顯示屏幕上某幾個位置對應(yīng)的顯示RAM區(qū)的8字節(jié),還要使每字節(jié)的不同位為“1”,其它的為“0”,為“1”的點亮,為“0”的不亮。這樣一來就組成某個字符。但由于內(nèi)帶字符發(fā)生器的控制器來說,顯示字符就比較簡單了,可以讓控制器工作在文本方式,根據(jù)在LCD上開始顯示的行列號及每行的列數(shù)找出顯示RAM對應(yīng)的地址,設(shè)立光標(biāo),在此送上該字符對應(yīng)的代碼即可。
漢字的顯示
漢字的顯示一般采用圖形的方式,事先從微機中提取要顯示的漢字的點陣碼(一般用字模提取軟件),每個漢字占32B,分左右兩半,各占16B,左邊為1、3、5……右邊為2、4、6……根據(jù)在LCD上開始顯示的行列號及每行的列數(shù)可找出顯示RAM對應(yīng)的地址,設(shè)立光標(biāo),送上要顯示的漢字的第一字節(jié),光標(biāo)位置加1,送第二個字節(jié),換行按列對齊,送第三個字節(jié)……直到32B顯示完就可以LCD上得到一個完整漢字。
1602LCD主要技術(shù)參數(shù):
顯示容量:16×2個字符
芯片工作電壓:4.5—5.5V
工作電流:2.0mA(5.0V)
模塊最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
引腳說明
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當(dāng)RS和R/W共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時可以讀忙信號,當(dāng)RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。
?
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
第15腳:背光源正極。
第16腳:背光源負極。
用51單片機編寫lcd1602顯示程序
#include 《reg51.h》
#define uchar unsigned char
#define uint unsigned int
sbit LCD_E=P3^5; //定義接口
sbit LCD_RW=P3^6;
sbit LCD_RS=P3^7;
#define LCD_Data P1 //數(shù)據(jù)接口
uchar up[]={“IvU,hupeixian”};
uchar code down[]={“_by fu ”}
/*************************延時函數(shù)*****************************/
void Delay_ms(uint time)
{
uint i,j;
for(i = 0;i 《 time;i ++)
for(j = 0;j 《 930;j ++);
}
/**********************檢測狀態(tài)************************************/
uchar LCD_ReadStatus(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
while (LCD_Data & 0x80); //檢測忙信號
return(LCD_Data);
}
/************************寫數(shù)據(jù)***********************************/
void LCD_WriteData(uchar WDLCD)
{
LCD_ReadStatus();//檢測忙
LCD_Data = WDLCD
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;//若晶振速度太高可以在這后加小的延時
LCD_E = 1;//延時
LCD_E = 0;
}
/************************寫指令********************************/
void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC為0時忽略忙檢測
{
if (BuysC)
LCD_ReadStatus(); //根據(jù)需要檢測忙
LCD_Data = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/*****************初始化***********************************/
void LCD_Init(void)
{
LCD_Data = 0;
LCD_WriteCommand(0x38,0);//三次顯示模式設(shè)置,不檢測忙信號
Delay_ms(5);
LCD_WriteCommand(0x38,0);
Delay5Ms();
LCD_WriteCommand(0x38,0);
Delay_ms(5);
LCD_WriteCommand(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
LCD_WriteCommand(0x08,1); //關(guān)閉顯示
LCD_WriteCommand(0x01,1); //顯示清屏
LCD_WriteCommand(0x06,1); // 顯示光標(biāo)移動設(shè)置
LCD_WriteCommand(0x0C,1); // 顯示開及光標(biāo)設(shè)置
}
/***********************顯示一個字符********************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼
LCD_WriteCommand(X, 0); //這里不檢測忙信號,發(fā)送地址碼
LCD_WriteData(DData);
}
/************************顯示一串字符*******************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]》0x20) //若到達字串尾則退出
{
if (X 《= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
/******************************************************************/
void main(void)
{
Delay_ms(400); //啟動等待,等LCD講入工作狀態(tài)
LCD_Init(); //LCD初始化
Delay_ms(5); //延時片刻(可不要)
DisplayListChar(0, 1, up);
DisplayListChar(6, 0, down);
LCD_Data=0xff;
while(1);
}
用16F877A編寫lcd1602顯示程序
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
#define DB PORTD //定義端口
#define rs RB0 #define e RB1
__CONFIG(0x3B31);
const uchar data[]=“happy everyday”;//輸入的字符串 第一行
const uchar data1[]=“xiexie”;//第二行
void init();
void write_commond(uchar dat);//寫指令函數(shù)
void write_data(uchar dat);//寫數(shù)據(jù)函數(shù)
void delay(uint x);
void delay(uint x)
{
uint a,b;
for(a=x;a》0;a--)
for(b=110;b》0;b--); }
void init()//初始化指令
{
write_commond(0x01);//0000000001,清除屏幕顯示
write_commond(0x28);//設(shè)置4位格式,2行,5X7,功能設(shè)定
write_commond(0x0C);//0000001100,開顯示,無光標(biāo),不閃爍
write_commond(0x06);//0000000110,置輸入模式,光標(biāo)右移,屏幕上的文字不移動
write_commond(0x14);//0001000100,設(shè)定CGRAM地址顯示屏或光標(biāo)移動方向
}
void write_commond(uchar dat)
{
rs=0;//指令 DB=dat;
e=1;//允許 下降沿觸發(fā)1-0
delay(5);
e=0;
DB=DB《《4;//左移四位從RD4~RD7進入LCD
delay(5);
e=1; delay(5);
e=0;
}
void write_data(uchar dat)
{
rs=1;//數(shù)據(jù)
DB=dat;
e=1;//允許
delay(5);
e=0;
delay(5);
DB=DB《《4;
e=1;
delay(5);
e=0;
}
void main()
{
uchar i;
TRISD=0X00;//定義端口寄存器
PORTD=0X00;
PORTB=0X00;
TRISB=0X00;
init();
write_commond(0x80);//第一行的DDRAM的地址,不加0x10時,也可以從//最左邊開始
for(i=0;i《12;i++)
{
write_data(data[i]);//第一行的數(shù)據(jù)字符
delay(5);
}
write_commond(0xc0);//第二行的DDRAM地址不加0x10也可
for(i=0;i《16;i++)
{
write_data(data[i]);//第二行的數(shù)據(jù)字符
delay(5);
}
/* for(i=0;i《16;i++)
{
write_commond(0x18);//光標(biāo)不動,數(shù)據(jù)左移一位
delay(5);
}*/
while(1);
}
寫近一個字符A程序如下:
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
#define DB PORTD
#define rs RB0
#define e RB1
__CONFIG(0x3B31);
void init();
void write_commond(uchar dat);//寫指令函數(shù)
void write_data(uchar dat);//寫數(shù)據(jù)函數(shù)
void disp_char(uchar x,uchar y,uchar dat);//在屏幕某個位置顯示一個字符,x(0-16),y(1-2)
void delay(uint x);
void delay(uint x)
{
uint a,b;
for(a=x;a》0;a--)
for(b=110;b》0;b--);
}
void init()//初始化指令
{
write_commond(0x01);//0000000001,清除屏幕顯示
write_commond(0x28);//設(shè)置4位格式,2行,5X7,功能設(shè)定
write_commond(0x0C);//0000001100,開顯示,無光標(biāo),不閃爍
write_commond(0x06);//0000000110,置輸入模式,光標(biāo)右移,屏幕上的文字不移動
write_commond(0x80);//0001000100,設(shè)定CGRAM地址顯示屏或光標(biāo)移動方向
}
void write_commond(uchar dat)
{
rs=0;//指令
DB=dat;
e=1;//允許
delay(5);
e=0;
DB=DB《《4;
delay(5);
e=1;
delay(5);
e=0;
}
void write_data(uchar dat)
{
rs=1;//數(shù)據(jù)
DB=dat;
e=1;//允許
delay(5);
e=0;
delay(5);
DB=DB《《4;
e=1;delay(5);
e=0;
}
void disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1) address=0x80+x;
else
address=0xc0+x;
write_commond(address);
write_data(dat);
delay(5);
}
void main()
{
TRISD=0X00;
PORTD=0X00;
PORTB=0X00;
TRISB=0X00;
init();
disp_char(0,1,‘A’);
while(1);
}
也可以是如下:
void disp_char(uchar x,uchar y,uchar dat)
{
uchar i;
write_commond(0x80+x);
if(i=0;i《16;i++)
{
write_data(‘A’);
delay(5);
}
}
評論