




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、LCD1602液晶顯示器簡介一 概述液晶(Liquid Crystal)是一種高分子材料,因其特殊的物理、化學、光學特性,廣泛應用輕薄顯示器上。液晶顯示器(Liquid Crystal Display,LCD)的主要原理是以電流刺激液晶分子產(chǎn)生點、線、面并配合背部燈管構(gòu)成畫面。各種型號的液晶通常是按照顯示字符的行數(shù)或液晶點陣的行、列數(shù)來命名。例如,1602表示每行顯示16個字符,一共可以顯示兩行。這類液晶通常稱為字符型液晶,只能顯示ASCII碼字符。12232表示液晶顯示畫面由122列、32行組成,共有122*32個點來顯示各種圖形。用戶可以通過程序控制這些點中任何一個點顯示或不顯示,從而構(gòu)成
2、各種圖形畫面。因此,12232稱為圖形型液晶。液晶體積小,功耗低,顯示操作簡單。但其有致命的弱點,即使用溫度范圍很窄。通用型液晶工作溫度為0到+55攝氏度,存儲溫度為-20到+60攝氏度。二 LCD1602 1 1602的外形尺寸(毫米)2 主要技術(shù)參數(shù)3 接口信號說明4 基本操作時序4 RAM地址映射圖控制器內(nèi)部帶有80B的RAM緩沖區(qū)。對應關(guān)系如下圖所示。向圖中的000F、404F地址中的任意處寫入顯示數(shù)據(jù)時,液晶可立即顯示出來;當寫入到1027或5067地址時,必須通過移屏指令將他們一移入可顯示區(qū)域方可正常顯示。1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點
3、陣字符圖形,如下表所示。這些字符有:阿拉伯數(shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。6 狀態(tài)字說明說明:原則上每次對控制器進行讀寫操作前,都必須進行讀寫檢測,確保STA7為0。實際上,由于單片機的操作速度慢于液晶控制器的反應速度,因此可以不進行檢測,或只進行簡短的延時即可。7 指令說明 1602液晶模塊內(nèi)部的控制器共有11條控制指令。(1) 顯示模式設置(2) 顯示開/關(guān)及光標設置(3) 數(shù)據(jù)指針設置(4) 其它設置8 控制
4、接口時序說明時序參數(shù)讀操作時序?qū)懖僮鲿r序9 初始化過程1)延時15ms2)寫指令38H(不檢測忙信號)3)延時5ms4)寫指令38H(不檢測忙信號)5)延時5ms6)寫指令38H(不檢測忙信號)7)(以后每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測忙信號)8)寫指令38H:顯示模式設置9)寫指令08H:顯示關(guān)閉10)寫指令01H:顯示清屏11)寫指令06H:顯示光標移動設置12)寫指令0CH:顯示開及光標設置三 驅(qū)動程序舉例1 I/O方式驅(qū)動程序程序如下:/*=SMC1602A(16*2)I/O口線接線方式 連接線圖:-|LCM-51 | LCM-51 | LCM-51 |-|DB0-P1.0 |
5、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> sbit LCM_RW=P20; /定義引腳sbit LCM_RS =P21;sbit LCM_E =P22; #define LCM_Data P1 #define Busy
6、0x80 /用于檢測 LCM 狀態(tài)字中的 Busy 標識 void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void); void LCMInit(void); void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void Displa
7、yListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delayms(unsigned int n);void dellay(unsigned int h); unsigned char code blog_adr = "EDNchina"unsigned char code email = "tengjingshu" void main(void) /D
8、elay400Ms(); /啟動等待,等 LCM 講入工作狀態(tài) LCMInit(); /LCM 初始化 DisplayListChar(6, 0, blog_adr); DisplayLis
9、tChar(0, 0, email); while(1); /寫數(shù)據(jù) RS="H",RW=L,D0D7=數(shù)據(jù),E=高脈沖void WriteDataLCM(unsigned char WDLCM) dellay(100); LCM_E = 0;
10、60; LCM_RS = 1; LCM_RW = 0;LCM_Data = WDLCM;/dellay(100); /短暫延時,代替檢測忙狀態(tài) /ReadStatusLCM(); /檢測忙 LCM_E = 1;
11、60; LCM_E = 0; /寫指令 RS="L",RW=L,D0D7=指令碼,E=高脈沖 void WriteCommandLCM(unsigned char WCLCM,BuysC) /BuysC 為 0 時忽略忙檢測 /if (BuysC) ReadStatusLCM(); /根據(jù)需要檢測忙 dellay(100); /短暫延時,代替檢測
12、忙狀態(tài) LCM_E = 0; LCM_RS = 0; LCM_RW = 0; LCM_Data = WCLCM; LCM_E = 1; &
13、#160; LCM_E = 0; /讀數(shù)據(jù) RS="H",RW=H,E=Hunsigned char ReadDataLCM(void) LCM_RS = 1; LCM_RW = 1; LCM_E = 1; return(LCM_Data); /讀狀態(tài) RS="L",R
14、W=H,E=Hunsigned char ReadStatusLCM(void) LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 1; /while (LCM_Data & Busy); /檢測忙信號
15、; return(LCM_Data); void LCMInit(void) /LCM 初始化 LCM_Data = 0; Delayms(15); WriteCommandLCM(0x38,0); /三次顯示模式設置,不檢測忙信號 Delayms(5); Writ
16、eCommandLCM(0x38,0); Delayms(5); WriteCommandLCM(0x38,0); WriteCommandLCM(0x38,1); /顯示模式設置,開始要求每次檢測忙信號 WriteCommandLCM(0x08,1); /關(guān)閉顯示 WriteCommandLC
17、M(0x01,1); /顯示清屏 WriteCommandLCM(0x06,1); / 顯示光標移動設置 WriteCommandLCM(0x0C,1); / 顯示開及光標設置 /按指定位置顯示一個字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y &= 0x1;X &= 0xF; /限制 X 不能大于 15,Y 不能大于 1if (Y) X
18、|= 0x40; /當要顯示第二行時地址碼+0x40; X |= 0x80; /算出指令碼WriteCommandLCM(X, 1); /這里不檢測忙信號,發(fā)送地址碼WriteDataLCM(DData); /按指定位置顯示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; &
19、#160; /限制 X 不能大于 15,Y 不能大于 1while (DDataListLength>0x1f) /若到達字串尾則退出 if (X <= 0xF) /X 坐標應小于 0xF &
20、#160; DisplayOneChar(X, Y, DDataListLength); /顯示單個字符 ListLength+; X+; /延時程序void Delayms(unsigned
21、 int n) unsigned int i,j; for(j=n;j>0;j-) for(i=112;i>0;i-); /* 函數(shù)名稱: dellay* 入口參數(shù):h(unsigned int型)* 出口參數(shù):無* 功能描述: 短暫延時,使用12MHz晶體,約0.01MS*/void dellay(unsigned int h) wh
22、ile(h-); /0.01MS 要注意的是在讀寫程序中,沒有用 “檢測忙”,其實對于1602來說,沒有檢測忙信號對于實際來說還好,因為常常因為檢測忙,而使1602沒顯示(一直處于忙檢測中)。“忙檢測”用一個小延時代替。對于LCM1602來說,讀寫時序最重要。
23、160; LCM1602寫操作時序 /寫數(shù)據(jù) RS="H",RW=L,D0D7=數(shù)據(jù),E=高脈沖void WriteDataLCM(unsigned char WDLCM) dellay(10
24、0); /短暫延時,代替檢測忙狀態(tài) LCM_E = 0; LCM_RS = 1; LCM_RW = 0;LCM_Data = WDLCM; LCM_E = 1; L
25、CM_E = 0; /寫指令 RS="L",RW=L,D0D7=指令碼,E=高脈沖 void WriteCommandLCM(unsigned char WCLCM) dellay(100); /短暫延時,代替檢測忙狀態(tài) LCM_E = 0; LCM_RS = 0;
26、0; LCM_RW = 0; LCM_Data = WCLCM; LCM_E = 1; LCM_E = 0; 上面兩個分別為寫數(shù)據(jù)函數(shù)和寫命令函數(shù),檢測忙已用小延時代替。其實這個時序好像不太嚴格,但要保證的是E高脈沖時,寫的數(shù)據(jù)/命令是有效的。好像函
27、數(shù)也可以寫成這樣:void WriteCommandLCM(unsigned char WCLCM) dellay(100); /短暫延時,代替檢測忙狀態(tài) LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0;
28、160; LCM_E = 0; dellay(100); LCM_E = 1; /按指定位置顯示一串字符函數(shù)DisplayListChar的作用是在指定位置顯示一串字符,其中有一句“while (DDataListLength>0x1f) /若到達字串尾則退出” 為什么要大于0x20呢? unsigned char
29、 code blog_adr = "EDNchina"unsigned char code email = "tengjingshu" 用單引號 ( )括起來的字符為字符的ASCII碼值,而不是字符串。 用雙引號”(shift+ )括起來的一串字符,成為字符串常量。C編譯器會自動地在字符末尾加上結(jié)束符0(NULL) (ASCII碼為0x00也就是00H)。 char a=“Bei Jing”;char a=B,e,I, ,J,i,n,g,0; 兩者是等價的,數(shù)組的每個元素為對應字符的
30、ASCII碼,如a3數(shù)組a的第四個元素是 空格,則a3里面放著的是空格 的ASCII碼0x20。還要注意的是數(shù)組的元素數(shù)目一定要比字符多一個。以便C編譯器自動在其后面加入結(jié)束符0。 可以知道0 ASCII碼為0x00nASCII碼為0x0A 那知道為什么有這句了吧“while (DDataListLength>0x1F) /若到達字串尾則退出”因為大于0x1f才能顯示字符,小于和等于0x1f的都是鍵盤控制符。當然我們也可以檢測0(0x00)“while (DDataListLength!='0') /檢測到字符串結(jié)束符則退出”2
31、 總線方式驅(qū)動程序 LCM1602總線方式C51程序/*Lcd1602B.c*#include <delay.h>#include <lcd1602b.h>#include <absacc.h>/*= 顯示字符串=*/void LcdDisplayString(unsigned char x,unsigned char y, unsigned char *ptr) unsigned char i,l=0;
32、160; while (ptrl >31)l+; /
33、 for (i=0;i<l;i+) LcdDisplayChar(x+,y,ptri); if ( x = 16 )
34、0; x = 0; y = 1; /異或,第一行的話變第二行,第二行的話變第一行 /*= 顯示光標定位=*/void LocateXY( char posx,char posy) unsigned char temp;
35、; temp = posx & 0x0f; /確保只選016個格子 posy &= 0x01; /確保不是在第一行就在第二行
36、 if ( posy )temp |= 0x40; /在第二行的時候加40H temp |= 0x80; /數(shù)據(jù)指針設置 指令碼 80H+ 地址碼( 0-27H ,40H-67H) LcdWriteCommand(temp,1); /*= 按指定位置顯示數(shù)出一個字符=*/void LcdDisplayChar(unsigned char x,unsi
37、gned char y,unsigned char Wdata) LocateXY( x, y ); / 定位顯示地址 LcdWriteData( Wda
38、ta ); / 寫字符 /*= 初始化程序, 必須按照產(chǎn)品資料介紹的初始化過程進行=*/void LcdReset( void ) Delayms(400);
39、 / 啟動時必須的延時,等待lcm進入工作狀態(tài) LcdWriteCommand( 0x38, 0); / 顯示模式設置(不檢測忙信號) Delayms(15);
40、0; LcdWriteCommand( 0x38, 0); / 共三次 Delayms(15); LcdWriteCommand( 0x38, 0); Delayms(15);
41、160; LcdWriteCommand( 0x38, 1); / 顯示模式設置(以后均檢測忙信號) LcdWriteCommand( 0x08, 1); &
42、#160; / 顯示關(guān)閉 LcdWriteCommand( 0x06, 1); / 顯示光標移動設置 LcdWriteCommand( 0x0c, 1); &
43、#160; / 顯示開及光標設置 LcdClear();/*= clear=*/void LcdClear(void) LcdWriteCommand( 0x01, 1); / 顯示清屏/*= 寫控制字符子
44、程序: E="1" RS="0" RW="0"=*/void LcdWriteCommand( unsigned char CMD,unsigned char AttribC ) /AttribC=1檢查忙狀態(tài),AttribC=0不檢查忙狀態(tài) if (AttribC) while( Lcd1602StatusPort & Busy );
45、 / 檢測忙信號? /busy=0x80 每次讀寫操作都要進行讀寫檢測,確保SAT7=0 Lcd1602CmdPort = CMD; /*= 當前位置寫字符子程序: E =1 RS="1" RW="0"=*/void LcdW
46、riteData( char dataW ) while( Lcd1602StatusPort & Busy ); /檢測忙信號
47、60; /busy=0x80 每次讀寫操作都要進行讀寫檢測,確保SAT7=0 Lcd1602WdataPort = dataW; 精確微秒級延時(詳細可以參考我另一篇博文51單片機C51微秒級(ms)精確延時 )/*delay.h*#include <delay.h> /for crystal 11.0592M void Delayms(unsigned int n) uns
48、igned int i,j; for(j=n;j>0;j-) for(i=112;i>0;i-); /*lcd1602b.h*#ifndef _LCD1602B_H_#define _LCD1602B_H_ #define Lcd1602CmdPort XBYTE0x8000 /E=1 RS="0" RW="0" /寫指令
49、#define Lcd1602WdataPort XBYTE0x8100 /E =1 RS="1" RW="0" /寫數(shù)據(jù)#define Lcd1602StatusPort XBYTE0x8200 /E=1 RS="0" RW="1" /讀狀態(tài)#define Busy 0x80
50、 /busy extern void LcdClear(void);extern void LcdWriteData( char dataW );extern void LcdWriteCommand( unsigned char CMD,unsigned char Attri
51、bC );extern void LcdReset( void );extern void Display( unsigned char dd );extern void LcdDisplayChar(unsigned char x,unsigned char y,unsigned char Wdata);extern void LcdDisplayString(unsigned char x,unsigned char y, unsigned char *ptr); #endif 其中要注意寫指令的地址 0x8000寫數(shù)據(jù)的地址 0x8100讀狀態(tài)的地址 0x8200這三個地址值是根據(jù)硬件電路連接確定的。 /* absacc.h*#ifndef _ABSACC_H_#define _ABSACC_H_ #define CBYTE (unsigned char volatile code *) 0)#define DBYTE (unsigned char volatile data *) 0)#define PBYTE (unsigned char volatile pdata *) 0)#define XBYTE (unsigned char vola
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務數(shù)據(jù)管理協(xié)議
- 電子郵件系統(tǒng)維護協(xié)議
- 制度模板-計劃生育并發(fā)癥管理制度
- 建材城商業(yè)商鋪租賃合同(15篇)
- 咖啡設備出售合同協(xié)議
- 咨詢合同補充協(xié)議書范本
- 正規(guī)銷售合同協(xié)議模板
- 正規(guī)司機勞動合同協(xié)議
- 和律師簽訂短期合同協(xié)議
- 懷孕女員工協(xié)議解除合同
- 揚塵治理培訓課件
- 5《以工匠精神雕琢時代品質(zhì)》說課稿 2024-2025學年統(tǒng)編版高中語文必修上冊
- 2024年新疆區(qū)公務員錄用考試《行測》真題及答案解析
- 《數(shù)字營銷》全套教學課件
- 2024年考研政治復習要點解析
- 人美版八年級美術(shù)下冊《1. 繪畫的多元化》說課稿
- 過敏性休克應急預案-2
- 渣土、余土運輸服務方案(技術(shù)方案)
- 2024ABB電機與發(fā)電機業(yè)務單元產(chǎn)品手冊
- 2024-2030年中國菊芋菊粉行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 十字相乘法解一元二次方程練習100題及答案
評論
0/150
提交評論