液晶顯示簡介
①液晶顯示原理
液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區域進行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規模集成電路直接驅動、易于實現全彩色顯示的特點,目前已經被廣泛應用在便攜式電腦、數字攝像機、PDA移動通信工具等眾多領域。
②液晶顯示器的分類
液晶顯示的分類方法有很多種,通常可按其顯示方式分為段式、字符式、點陣式等。除了黑白顯示外,液晶顯示器還有多灰度有彩色顯示等。如果根據驅動方式來分,可以分為靜態驅動(Static)、單純矩陣驅動(Simple Matrix)和主動矩陣驅動(Active Matrix)三種。
③液晶顯示器各種圖形的顯示原理:
線段的顯示
點陣圖形式液晶由M×N個顯示單元組成,假設LCD顯示屏有64行,每行有128列,每8列對應1字節的8位,即每行由16字節,共16×8=128個點組成,屏上64×16個顯示單元與顯示RAM區1024字節相對應,每一字節的內容和顯示屏上相應位置的亮暗對應。例如屏的第一行的亮暗由RAM區的000H——00FH的16字節的內容決定,當(000H)=FFH時,則屏幕的左上角顯示一條短亮線,長度為8個點;當(3FFH)=FFH時,則屏幕的右下角顯示一條短亮線;當(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H時,則在屏幕的頂部顯示一條由8段亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。
字符的顯示
用LCD顯示一個字符時比較復雜,因為一個字符由6×8或8×8點陣組成,既要找到和顯示屏幕上某幾個位置對應的顯示RAM區的8字節,還要使每字節的不同位為“1”,其它的為“0”,為“1”的點亮,為“0”的不亮。這樣一來就組成某個字符。但由于內帶字符發生器的控制器來說,顯示字符就比較簡單了,可以讓控制器工作在文本方式,根據在LCD上開始顯示的行列號及每行的列數找出顯示RAM對應的地址,設立光標,在此送上該字符對應的代碼即可。
漢字的顯示
漢字的顯示一般采用圖形的方式,事先從微機中提取要顯示的漢字的點陣碼(一般用字模提取軟件),每個漢字占32B,分左右兩半,各占16B,左邊為1、3、5……右邊為2、4、6……根據在LCD上開始顯示的行列號及每行的列數可找出顯示RAM對應的地址,設立光標,送上要顯示的漢字的第一字節,光標位置加1,送第二個字節,換行按列對齊,送第三個字節……直到32B顯示完就可以LCD上得到一個完整漢字。
1602LCD主要技術參數:
顯示容量: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為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。
?
第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
第7~14腳:D0~D7為8位雙向數據線。
第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 //數據接口
uchar up[]={“IvU,hupeixian”};
uchar code down[]={“_by fu ”}
/*************************延時函數*****************************/
void Delay_ms(uint time)
{
uint i,j;
for(i = 0;i 《 time;i ++)
for(j = 0;j 《 930;j ++);
}
/**********************檢測狀態************************************/
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);
}
/************************寫數據***********************************/
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(); //根據需要檢測忙
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);//三次顯示模式設置,不檢測忙信號
Delay_ms(5);
LCD_WriteCommand(0x38,0);
Delay5Ms();
LCD_WriteCommand(0x38,0);
Delay_ms(5);
LCD_WriteCommand(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
LCD_WriteCommand(0x08,1); //關閉顯示
LCD_WriteCommand(0x01,1); //顯示清屏
LCD_WriteCommand(0x06,1); // 顯示光標移動設置
LCD_WriteCommand(0x0C,1); // 顯示開及光標設置
}
/***********************顯示一個字符********************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼
LCD_WriteCommand(X, 0); //這里不檢測忙信號,發送地址碼
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坐標應小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
/******************************************************************/
void main(void)
{
Delay_ms(400); //啟動等待,等LCD講入工作狀態
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);//寫指令函數
void write_data(uchar dat);//寫數據函數
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);//設置4位格式,2行,5X7,功能設定
write_commond(0x0C);//0000001100,開顯示,無光標,不閃爍
write_commond(0x06);//0000000110,置輸入模式,光標右移,屏幕上的文字不移動
write_commond(0x14);//0001000100,設定CGRAM地址顯示屏或光標移動方向
}
void write_commond(uchar dat)
{
rs=0;//指令 DB=dat;
e=1;//允許 下降沿觸發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;//數據
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]);//第一行的數據字符
delay(5);
}
write_commond(0xc0);//第二行的DDRAM地址不加0x10也可
for(i=0;i《16;i++)
{
write_data(data[i]);//第二行的數據字符
delay(5);
}
/* for(i=0;i《16;i++)
{
write_commond(0x18);//光標不動,數據左移一位
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);//寫指令函數
void write_data(uchar dat);//寫數據函數
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);//設置4位格式,2行,5X7,功能設定
write_commond(0x0C);//0000001100,開顯示,無光標,不閃爍
write_commond(0x06);//0000000110,置輸入模式,光標右移,屏幕上的文字不移動
write_commond(0x80);//0001000100,設定CGRAM地址顯示屏或光標移動方向
}
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;//數據
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);
}
}
評論
查看更多