LCD1602液晶顯示器簡介_第1頁
LCD1602液晶顯示器簡介_第2頁
LCD1602液晶顯示器簡介_第3頁
LCD1602液晶顯示器簡介_第4頁
LCD1602液晶顯示器簡介_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

LCD1602液晶顯示器簡介一概述液晶〔LiquidCrystal〕是一種高分子材料,因其特殊的物理、化學(xué)、光學(xué)特性,廣泛應(yīng)用輕薄顯示器上。液晶顯示器〔LiquidCrystalDisplay,LCD〕的主要原理是以電流刺激液晶分子產(chǎn)生點、線、面并配合背部燈管構(gòu)成畫面。各種型號的液晶通常是按照顯示字符的行數(shù)或液晶點陣的行、列數(shù)來命名。例如,1602表示每行顯示16個字符,一共可以顯示兩行。這類液晶通常稱為字符型液晶,只能顯示ASCII碼字符。12232表示液晶顯示畫面由122列、32行組成,共有122*32個點來顯示各種圖形。用戶可以通過程序控制這些點中任何一個點顯示或不顯示,從而構(gòu)成各種圖形畫面。因此,12232稱為圖形型液晶。液晶體積小,功耗低,顯示操作簡單。但其有致命的弱點,即使用溫度范圍很窄。通用型液晶工作溫度為0到+55攝氏度,存儲溫度為-20到+60攝氏度。二LCD160211602的外形尺寸〔毫米〕2主要技術(shù)參數(shù)接口信號說明4根本操作時序RAM地址映射圖控制器內(nèi)部帶有80B的RAM緩沖區(qū)。對應(yīng)關(guān)系如下列圖所示。向圖中的00~0F、40~4F地址中的任意處寫入顯示數(shù)據(jù)時,液晶可立即顯示出來;當(dāng)寫入到10~27或50~67地址時,必須通過移屏指令將他們一移入可顯示區(qū)域方可正常顯示。1602液晶模塊內(nèi)部的字符發(fā)生存儲器〔CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,如下表所示。這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比方大寫的英文字母“A〞的代碼是01000001B〔41H〕,顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A〞。狀態(tài)字說明說明:原那么上每次對控制器進(jìn)行讀寫操作前,都必須進(jìn)行讀寫檢測,確保STA7為0。實際上,由于單片機(jī)的操作速度慢于液晶控制器的反響速度,因此可以不進(jìn)行檢測,或只進(jìn)行簡短的延時即可。7指令說明1602液晶模塊內(nèi)部的控制器共有11條控制指令。顯示模式設(shè)置顯示開/關(guān)及光標(biāo)設(shè)置數(shù)據(jù)指針設(shè)置其它設(shè)置8控制接口時序說明時序參數(shù)讀操作時序?qū)懖僮鲿r序9初始化過程1〕延時15ms2〕寫指令38H(不檢測忙信號)3〕延時5ms4〕寫指令38H(不檢測忙信號)5〕延時5ms6〕寫指令38H(不檢測忙信號)7〕(以后每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測忙信號)8〕寫指令38H:顯示模式設(shè)置9〕寫指令08H:顯示關(guān)閉10〕寫指令01H:顯示清屏11〕寫指令06H:顯示光標(biāo)移動設(shè)置12〕寫指令0CH:顯示開及光標(biāo)設(shè)置三驅(qū)動程序舉例1I/O方式驅(qū)動程序程序如下:/*=========================================================SMC1602A(16*2)I/O口線接線方式連接線圖:---------------------------------------------------|LCM-----51|LCM-----51|LCM------51|---------------------------------------------||DB0-----P1.0|DB4-----P1.4|RW-------P2.0||DB1-----P1.1|DB5-----P1.5|RS-------P2.1||DB2-----P1.2|DB6-----P1.6|E--------P2.2||DB3-----P1.3|DB7-----P1.7|VLCD接1K電阻到GND|---------------------------------------------------[注:AT89S51使用12M晶體震蕩器]=========================================================*/#include<reg51.h>sbitLCM_RW=P2^0;

//定義引腳sbitLCM_RS=P2^1;sbitLCM_E

=P2^2;#defineLCM_Data

P1#defineBusy0x80//用于檢測LCM狀態(tài)字中的Busy標(biāo)識voidWriteDataLCM(unsignedcharWDLCM);voidWriteCommandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);unsignedcharReadStatusLCM(void);voidLCMInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelayms(unsignedintn);voiddellay(unsignedint

h);unsignedcharcodeblog_adr[]={"EDNchina"};unsignedcharcodeemail[]={"tengjingshu@126"};voidmain(void){

//Delay400Ms();

//啟動等待,等LCM講入工作狀態(tài)

LCMInit();

//LCM初始化

DisplayListChar(6,0,blog_adr);

DisplayListChar(0,0,email);

while(1);}//寫數(shù)據(jù)RS="H",RW=L,D0~D7=數(shù)據(jù),E=高脈沖voidWriteDataLCM(unsignedcharWDLCM)

{

dellay(100);

LCM_E=0;

LCM_RS=1;

LCM_RW=0;LCM_Data=WDLCM;//dellay(100);

//短暫延時,代替檢測忙狀態(tài)

//ReadStatusLCM();//檢測忙

LCM_E=1;

LCM_E=0;}//寫指令RS="L",RW=L,D0~D7=指令碼,E=高脈沖voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC為0時忽略忙檢測{

//if(BuysC)ReadStatusLCM();//根據(jù)需要檢測忙

dellay(100);

//短暫延時,代替檢測忙狀態(tài)

LCM_E=0;

LCM_RS=0;

LCM_RW=0;

LCM_Data=WCLCM;

LCM_E

=1;

LCM_E=0;}//讀數(shù)據(jù)RS="H",RW=H,E=HunsignedcharReadDataLCM(void){

LCM_RS=1;

LCM_RW=1;

LCM_E=1;

return(LCM_Data);}//讀狀態(tài)RS="L",RW=H,E=HunsignedcharReadStatusLCM(void){

LCM_Data=0xFF;

LCM_RS=0;

LCM_RW=1;

LCM_E=1;

//while(LCM_Data&Busy);//檢測忙信號

return(LCM_Data);}voidLCMInit(void)//LCM初始化{

LCM_Data=0;

Delayms(15);

WriteCommandLCM(0x38,0);//三次顯示模式設(shè)置,不檢測忙信號

Delayms(5);

WriteCommandLCM(0x38,0);

Delayms(5);

WriteCommandLCM(0x38,0);

WriteCommandLCM(0x38,1);//顯示模式設(shè)置,開始要求每次檢測忙信號

WriteCommandLCM(0x08,1);//關(guān)閉顯示

WriteCommandLCM(0x01,1);//顯示清屏

WriteCommandLCM(0x06,1);//顯示光標(biāo)移動設(shè)置

WriteCommandLCM(0x0C,1);//顯示開及光標(biāo)設(shè)置}//按指定位置顯示一個字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;

//當(dāng)要顯示第二行時地址碼+0x40;X|=0x80;

//算出指令碼WriteCommandLCM(X,1);//這里不檢測忙信號,發(fā)送地址碼WriteDataLCM(DData);}//按指定位置顯示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength;ListLength=0;Y&=0x1;X&=0xF;

//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x1f)//假設(shè)到達(dá)字串尾那么退出

{

if(X<=0xF)//X坐標(biāo)應(yīng)小于0xF

{

DisplayOneChar(X,Y,DData[ListLength]);//顯示單個字符

ListLength++;X++;

}}}//延時程序voidDelayms(unsignedintn){

unsignedinti,j;

for(j=n;j>0;j--)

for(i=112;i>0;i--);}/****************************************************函數(shù)名稱:dellay**入口參數(shù):h〔unsignedint型〕**出口參數(shù):無**功能描述:短暫延時,使用12MHz晶體,約0.01MS****************************************************/voiddellay(unsignedint

h){

while(h--);

//0.01MS}要注意的是在讀寫程序中,沒有用“檢測忙〞,其實對于1602來說,沒有檢測忙信號對于實際來說還好,因為常常因為檢測忙,而使1602沒顯示〔一直處于忙檢測中〕?!懊z測〞用一個小延時代替。對于LCM1602來說,讀寫時序最重要。

LCM1602寫操作時序//寫數(shù)據(jù)RS="H",RW=L,D0~D7=數(shù)據(jù),E=高脈沖voidWriteDataLCM(unsignedcharWDLCM)

{

dellay(100);

//短暫延時,代替檢測忙狀態(tài)LCM_E=0;

LCM_RS=1;

LCM_RW=0;LCM_Data=WDLCM;

LCM_E=1;

LCM_E=0;}//寫指令RS="L",RW=L,D0~D7=指令碼,E=高脈沖voidWriteCommandLCM(unsignedcharWCLCM){

dellay(100);

//短暫延時,代替檢測忙狀態(tài)

LCM_E=0;

LCM_RS=0;

LCM_RW=0;

LCM_Data=WCLCM;

LCM_E

=1;LCM_E=0;}上面兩個分別為寫數(shù)據(jù)函數(shù)和寫命令函數(shù),檢測忙已用小延時代替。其實這個時序好似不太嚴(yán)格,但要保證的是E高脈沖時,寫的數(shù)據(jù)/命令是有效的。好似函數(shù)也可以寫成這樣:voidWriteCommandLCM(unsignedcharWCLCM){dellay(100);

//短暫延時,代替檢測忙狀態(tài)

LCM_Data=WCLCM;

LCM_RS=0;

LCM_RW=0;LCM_E

=0;

dellay(100);

LCM_E

=1;}//按指定位置顯示一串字符函數(shù)DisplayListChar的作用是在指定位置顯示一串字符,其中有一句“while(DData[ListLength]>0x1f)//假設(shè)到達(dá)字串尾那么退出〞

為什么要大于0x20呢?

unsignedcharcodeblog_adr[]={"EDNchina"};unsignedcharcodeemail[]={"tengjingshu@126"};

用單引號’’()括起來的字符為字符的ASCII碼值,而不是字符串。

用雙引號〞〞(shift+)括起來的一串字符,成為字符串常量。C編譯器會自動地在字符末尾加上結(jié)束符’\0’(NULL)(ASCII碼為0x00也就是00H)。chara[]={“BeiJing〞};chara[]={‘B’,’e’,’I’,’‘,’J’,’i’,’n’,’g’,’\0’};兩者是等價的,數(shù)組的每個元素為對應(yīng)字符的ASCII碼,如a[3]數(shù)組a的第四個元素是’‘空格,那么a[3]里面放著的是空格’‘的ASCII碼0x20。還要注意的是數(shù)組的元素數(shù)目一定要比字符多一個。以便C編譯器自動在其后面參加結(jié)束符’\0’。可以知道‘\0’ASCII碼為0x00‘\n’ASCII碼為0x0A那知道為什么有這句了吧“while(DData[ListLength]>0x1F)//假設(shè)到達(dá)字串尾那么退出〞因為大于0x1f才能顯示字符,小于和等于0x1f的都是鍵盤控制符。當(dāng)然我們也可以檢測’\0’(0x00)“while(DData[ListLength]!='\0')

//檢測到字符串結(jié)束符那么退出〞總線方式驅(qū)動程序LCM1602總線方式C51程序//********************Lcd1602B.c***********************************#include<delay.h>#include<lcd1602b.h>#include<absacc.h>/*=======================================================

顯示字符串=======================================================*/voidLcdDisplayString(unsignedcharx,unsignedchary,unsignedchar*ptr){unsignedchari,l=0;

while(ptr[l]>31){l++;};

//

for(i=0;i<l;i++){

LcdDisplayChar(x++,y,ptr[i]);

if(x==16){

x=0;y^=1;//異或,第一行的話變第二行,第二行的話變第一行

}

}}/*=======================================================

顯示光標(biāo)定位=======================================================*/voidLocateXY(charposx,charposy){unsignedchartemp;

temp=posx&0x0f;

//確保只選0~16個格子

posy&=0x01;

//確保不是在第一行就在第二行

if(posy)temp|=0x40;

//在第二行的時候加40H

temp|=0x80;

//數(shù)據(jù)指針設(shè)置指令碼80H+地址碼〔0-27H,40H-67H〕

LcdWriteCommand(temp,1);}/*=======================================================

按指定位置顯示數(shù)出一個字符=======================================================*/voidLcdDisplayChar(unsignedcharx,unsignedchary,unsignedcharWdata){

LocateXY(x,y);

//定位顯示地址

LcdWriteData(Wdata);

//寫字符}/*=======================================================

初始化程序,必須按照產(chǎn)品資料介紹的初始化過程進(jìn)行=======================================================*/voidLcdReset(void){

Delayms(400);

//啟動時必須的延時,等待lcm進(jìn)入工作狀態(tài)

LcdWriteCommand(0x38,0);

//顯示模式設(shè)置(不檢測忙信號)

Delayms(15);

LcdWriteCommand(0x38,0);

//共三次

Delayms(15);

LcdWriteCommand(0x38,0);

Delayms(15);

LcdWriteCommand(0x38,1);

//顯示模式設(shè)置(以后均檢測忙信號)

LcdWriteCommand(0x08,1);

//顯示關(guān)閉

LcdWriteCommand(0x06,1);

//顯示光標(biāo)移動設(shè)置

LcdWriteCommand(0x0c,1);

//顯示開及光標(biāo)設(shè)置

LcdClear();}/*=======================================================

clear=======================================================*/voidLcdClear(void){

LcdWriteCommand(0x01,1);

//顯示清屏}/*=======================================================

寫控制字符子程序:E="1"RS="0"RW="0"=======================================================*/voidLcdWriteCommand(unsignedcharCMD,unsignedcharAttribC){

//AttribC=1檢查忙狀態(tài),AttribC=0不檢查忙狀態(tài)

if(AttribC)while(Lcd1602StatusPort&Busy);

//檢測忙信號?

//busy=0x80

每次讀寫操作都要進(jìn)行讀寫檢測,確保SAT7=0

Lcd1602CmdPort=CMD;}/*=======================================================

當(dāng)前位置寫字符子程序:E=1RS="1"RW="0"=======================================================*/voidLcdWriteData(chardataW){

while(Lcd1602StatusPort&Busy);

//檢測忙信號

//busy=0x80

每次讀寫操作都要進(jìn)行讀寫檢測,確保SAT7=0

Lcd1602WdataPort=dataW;精確微秒級延時〔詳細(xì)可以參考我另一篇博文51單片機(jī)C51微秒級〔ms〕精確延時〕//********************delay.h***********************************#include<delay.h>//forcrystal11.0592MvoidDelayms(unsignedintn){

unsignedinti,j;

for(j=n;j>0;j--)

for(i=112;i>0;i--);}//********************lcd1602b.h***********************************#ifndef__LCD1602B_H__#define__LCD1602B_H__#defineLcd1602CmdPortXBYTE[0x8000]

//E=1RS="0"RW="0"

//寫指令#defineLcd1602WdataPortXBYTE[0x8100]

//E=1RS="1"RW="0"http://寫數(shù)據(jù)#defineLcd1602StatusPortXBYTE[0x8200]

//E=1RS="0"RW="1"

//讀狀態(tài)#defineBusy0x80

//busyexternvoidLcdClear(void);externvoidLcdWriteData(chardataW);externvoidLcdWriteCommand(unsignedcharCMD,unsignedcharAttribC);externvoidLcdReset(void);externvoidDisplay(unsignedchardd);externvoidLcdDisplayChar(unsignedcharx,unsignedchary,unsignedcharWdata);externvoidLcdDisplayString(unsignedcharx,unsignedchary,unsignedchar*ptr);#endif其中要注意寫指令的地址0x8000寫數(shù)據(jù)的地址0x8100讀狀態(tài)的地址0x8200這三個地址值是根據(jù)硬件電路連接確定的。//********************absacc.h***********************************#ifndef__ABSACC_H__#define__ABSACC_H__#defineCBYTE((unsignedcharvolatilecode

*)0)#defineDBYTE((unsignedcharvolatiledata

*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論