項目2 通用型1602LCD液晶操作方法
液晶顯示器的英文名是Liquid Crystal Display, 簡稱 LCD。 液晶顯示器作為顯示器件具有體積小、重量輕、功耗低等優點,所以 LCD 日漸成為各種便攜式電子產品的理想顯示器,如計算器,電子表,汽車電子儀表等。根據LCD的顯示內容劃分,可以分為段式LCD、字符式LCD和點陣式LCD 3種。其中,字符式LCD以其廉價、顯示內容豐富、美觀、使用方便等特點,成為LED數碼管的理想替代品。
1. 1602字符型液晶簡介
字符型LCD專門用于顯示數字、字母、圖形符號以及少量自定義符號。這類顯示器把LCD控制器、點陣驅動器、字符存儲器等做在一塊板上,再與液晶屏一起組成一個顯示模塊。如下圖所示。
file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
圖1 LCD1602的外形圖
目前字符型LCD常用的有16字X1行、16字X2行、20字X2行、20字X4行等液晶模塊,型號通常用 XXX1602、XXX1604、XXX2002、XXX2004等 其中XXX為廠家商標名稱 16代表液晶每行可以顯示16個字符;02代表共有2行,也就是說這個液晶一共可以顯示32字符。
2 通用型1602液晶操作方法
1602液晶也叫1602字符型液晶 它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊 它有若干個5X7或5X11點陣字符位組成,每個點陣字符位都可以顯示一個字符。每位之間有一個點距的間隔 每行之間也有間隔 起到了字符間距和行間距的作用,正因為如此 所以他不能顯示圖形(用自定義CGRAM,顯示效果也不好)1602LCD是指顯示的內容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數字)。目前市面上字符液晶絕大多數是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應用于市面上大部分的字符型液晶。 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 圖2 LCD1602的背面引腳圖如圖2所示,字符型LCD1602通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),從左到右分別是1引腳到16引腳
1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表1
編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 | 1 | VSS | 電源地 | 9 | D2 | 數據 | 2 | VDD | 電源正極 | 10 | D3 | 數據 | 3 | VL | 液晶顯示偏壓 | 11 | D4 | 數據 | 4 | RS | 數據/命令選擇 | 12 | D5 | 數據 | 5 | R/W | 讀/寫選擇 | 13 | D6 | 數據 | 6 | E | 使能信號 | 14 | D7 | 數據 | 7 | D0 | 數據 | 15 | BLA | 背光源正極 | 8 | D1 | 數據 | 16 | BLK | 背光源負極 |
表1 LCD1602接口信號說明
第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腳:背光源負極。
3 下面幾個表是1602指令集
1)寄存器選擇功能
file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
表2 寄存器選擇功能
2)11條指令表
指令 | 指令碼 | 說明 | 指令周期 fosc=250kHz | RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | 清屏 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 清除屏幕,置AC為0,光標回位。 | 1.64ms | 光標返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * | DDRAM地址為0,顯示回原位,DDRAM內容不變. | 1.64ms | 設置輸入 方式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 設置光標移動方向并指定顯示是否移動。 | 40µs | 顯示開關 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | 設置顯示開或關D、光標開關C、光標所在字符閃爍B. | 40µs | 移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * | 移動光標及整體顯示,同時不改變DDRAM內容。 | 40µs | 功能設置 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * | 設置接口數據位數DL、顯示行數L、字符字體F。 | 40µs | CGRAM 地址設置 | 0 | 0 | 0 | 1 | ACG | 設置CGRAM地址。設置后發送接收數據。 | 40µs | DDRAM 地址設置 | 0 | 0 | 1 | ADD | 設置DDRAM地址。設置后發送接收數據。 | 40µs | 忙標志/讀地址計數器 | 0 | 1 | BF | AC | 讀忙標志BF標志正在執行內部操作并讀地址計數器內容。 | 0µs | CGRAM/DDRAM數據寫 | 1 | 0 | 寫數據 | 從CGRAM或DDRAM寫數據。 | 40µs | CGRAM/DDRAM數據讀 | 1 | 1 | 讀數據 | 從CGRAM或DDRAM讀數據。 | 40µs | | | | | | I/D=1:增量方式;I/D=0:減量方式 S=1:移位 S/C=1:顯示移位;S/C=0:光標移位 R/L=1:右移;R/L=0:左移 DL=1:8位;DL=0:4位 N=1:2行;N=0:1行 F=1:5 x 10字體 F=0:5 x 7字體 BF=1:執行內部操作;BF=0可接收指令 | DDRAM:顯示數據RAM CGRAM:字符發生器RAM ACG:CGRAM地址 ADD:DDRAM地址及光標 地址 AC:地址計數器,用于 DDRAM和CGRAM | 執行周期主頻改變而改變。 例如當fcp或 fosc=270KHZ 時:40μs x 250/270=37μs |
表3 11條指令表
3)標準字符庫
High 4BIT | MSB | 2 | 3 | 4 | 5 | 6 | 7 | 8 | A | B | C | D | E | F | LOW 4BIT | RAM0000 | 0 | (1) | | 0 | @ | P | ˋ | p | | | ー | タ | ミ | α | p | 1 | (2) | ! | 1 | A | Q | a | q | | 。 | ア | チ | ム | ä | q | 2 | (3) | “ | 2 | B | R | b | r | | ┌ | イ | ッ | メ | β | θ | 3 | (4) | # | 3 | C | S | c | s | | ┘ | ウ | テ | モ | ε | ∞ | 4 | (5) | $ | 4 | D | T | d | t | | 、 | エ | ト | ャ | μ | Ω | 5 | (6) | % | 5 | E | U | e | u | | • | オ | ナ | ュ | σ | ü | 6 | (7) | & | 6 | F | V | f | v | | ゝ | カ | ニ | ヨ | ρ | Σ | 7 | (8) | ’ | 7 | G | W | g | w | | ァ | キ | ヌ | ラ | g | π | 8 | (1) | ( | 8 | H | X | h | x | | ィ | ク | ネ | リ | √ | _х | 9 | (2) | ) | 9 | I | Y | i | y | | ゥ | ケ | ノ | ル | ¨ | y | A | (3) | * | : | J | Z | j | z | | ェ | コ | ハ | レ | j | 千 | B | (4) | + | ; | K | [ | k | { | | ォ | サ | ヒ | ロ | ` | 萬 | C | (5) | , | < | L | ¥ | l | | | | ャ | シ | フ | ヮ | φ | 円 | D | (6) | - | = | M | | m | } | | ュ | ス | ヘ | ン | キ | ÷ | E | (7) | . | > | N | ^ | n | → | | ョ | セ | ホ | ゛ | _n | | F | (8) | / | ? | O | _ | o | ← | | ッ | ソ | マ | ゜ | | |
表4 標準字符庫
DDRAM就是顯示數據RAM, 用來寄存待顯示的字符代碼,共80個字節,其地址和對應的關系如下表:也就是說在屏幕上第一行第一列要顯示“A“字,就要向DDRAM中的00H處寫入A的代碼就行,但具體的寫入要按LCD1602的指令格式來進行,一行有40個地址,我們就用前16個就行,第二行也同樣用前16個就行。對應如下:
顯 示 位 序 號 | 1 2 3 4 5 …………………… 40 | DD RAM 地 址(HEX) | 第 一 行 | 00 01 02 03 04 ..……………….. 27 | 第 二 行 | 40 41 42 43 44 ………………….. 67 |
表5 顯示位與DDRAM地址的對應關系
1602型LCD顯示字符的過程
。
在這里要說明的是:
1) 要用1602型LCD顯示字符必須解決3個問題:(1)待顯示字符ASCII標準碼產生;(2)液晶顯示模式的設置;(3)字符顯示位置的指定
2) 若想在00H處顯示數據的話,則必須將00H加上80H,即0x00H+0x80H,若要在01H處顯示數據,也必須加0x80H, 例如要將某字符顯示在第2行第5列,則確定地址的指令代碼應為80H+44H=C4H。依次類推
3) CGRAM是用戶自定義的字符圖形,可以定義8個
4) LCD1602只有11條指令,學會使用這11條指令,就可以輕松控制。
5) 要讓液晶顯示字符,必須對有無光標、光標的移動方向、光標是否閃爍及字符的移動方向等進行設置,才能獲得所需的顯示效果。1602液晶顯示模式的設置是通過控制指令對內部的控制器控制而實現的,常用的控制指令見表8-5.例如,要將顯示模式設置為“16X2顯示,5X7點陣,8位數據接口”,只要向液晶模塊寫二進制指令代碼00111 000B,即16進制代碼38H就可以了。
6) LCD是一個慢顯示器件,所以在寫每條指令前一定要先讀LCD的忙碌狀態。如果LCD正忙于處理其他指令,就等待;如果不忙,再執行寫指令。為此,1602型LCD專門設了一個忙碌標志位BF,該位鏈接在8位雙向數據線的DB7位上。如果BF為低電平“0”,表示LCD不忙;如果BF為高電平“1”,則表示LCD處于忙碌狀態,需要等待。假定1602型LCD的8位雙向數據線(DB0~DB7)是通過單片機的P0口進行數據傳遞的,那么只要檢測P0口的P0.7引腳電平(DB連P0.7)就可以知道忙碌標志位BF的狀態
4. 對照上面的表格,我們對11條指令作如下分解:
● 對DDRAM的內容和地址操作,HD44780的指令集及其設置說明,共有11條指令:1)清屏指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg功能:<1> 清除液晶顯示器,即將DDRAM的內容全部填入“空白”的字符<2> 光標歸位,即將光標撤回液晶顯示屏的左上方;
<3> 將地址計數器(AC)的值設為0。 2)光標歸位指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg功能:<1> 把光標撤回到顯示器的左上方;
<2> 把地址計數器(AC)的值設置為0;
<3> 保持DDRAM的內容不變 3).輸入模式設置指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg功能:設定每次寫入1位數據后光標的移位方向,并且設定每次寫入的一個字符是否移動。參數設定的情況如下所示:
I/D=0寫入新數據后光標左移 I/D=1寫入新數據后光標右移
S=0寫入新數據后顯示屏不移動 S=1寫入新數據后顯示屏整體右移或左移,以得到光標不移動而屏幕移動 效果 4)顯示開關控制指令file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg功能:控制顯示器開/關、光標顯示/關閉以及光標是否閃爍。參數設定的情況如下:
D=0顯示功能關 D=1顯示功能開
C=0無光標 C=1有光標
B=0光標不閃爍 B=1光標閃爍 5).設定顯示屏或光標移動方向指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg
S/C | R/L | 設定情況 | 0 | 0 | 光標左移1格,且AC值減1 | 0 | 1 | 光標右移1格,且AC值加1 | 1 | 0 | 顯示器上字符全部左移一格,但光標不動 | 1 | 1 | 顯示器上字符全部右移一格,但光標不動 |
6).功能設定指令 (非常重要的指令)file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image017.jpg 功能:設定數據總線位數、顯示的行數及字型。參數設定的情況如下:
DL=0 數據總線為4位 DL=1數據總線為8位
N=0 顯示1行 N=1 顯示2行
F=0 5×7點陣/每字符 F=1 5×10點陣/每字符7).設定CGRAM地址指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg功能:設定下一個要存入數據的CGRAM的地址8).設定DDRAM地址指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image021.jpg功能:設定下一個要存入數據的CGRAM的地址。 (注意這里我們送地址的時候應該是0x80+Address,這也是前面說到寫地址命令的時候要加上0x80的原因) 9).讀取忙信號或AC地址指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg功能:<1> 讀取忙碌信號BF的內容,BF=1表示液晶顯示器忙,暫時無法接收單片機送來的數據或指令; 當BF=0時,液晶顯示器可以接收單片機送來的數據或指令; <2> 讀取地址計數器(AC)的內容。 10).數據寫入DDRAM或CGRAM指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg功能:<1> 將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應的字符; <2> 將用戶自己設計的圖形存入CGRAM。 11)從CGRAM或DDRAM讀出數據的指令 file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg功能:讀取DDRAM或CGRAM中的內容。
基本操作時序:
讀狀態 輸入:RS=L,RW=H,E=H 輸出:DB0~DB7=狀態字
寫指令 輸入:RS=L,RW=L,E=下降沿脈沖,DB0~DB7=指令碼
輸出:無
讀數據 輸入:RS=H,RW=H,E=H 輸出:DB0~DB7=數據
寫數據 輸入:RS=H,RW=L,E=下降沿脈沖,DB0~DB7=數據
輸出:無說明:平時我們只用到常用的3—4條指令,學生不需去記錄,只需以后做項目時用到去查這些指令即可。5.讀寫操作時序圖:
1)讀操作時序(用的不多)
file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg2)寫操作時序
file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg
下面我們親自操作LCD1602,在我們是實驗板上實現如下描述
6. 舉例說明
1)用LCD循環右移顯示"Welcome to china"
2)實驗電路圖
file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg
注意:1602VR 是1602液晶的對比度調節電位器,如果液晶不顯示或者顯示文字不清晰,可以調節此電位器,來達到最理想的顯示效果。
15腳是背光燈正極引腳 接到實驗的JPBG跳線端 通過JPBG來控制背光燈的亮滅。
3 )操作步驟
將 JPP0跳線端的跳線帽拔掉 以免干擾1602液晶顯示
將JPSMG 數碼管控制跳線拔掉 使數碼管停止工作。
插上1602LCD液晶
將JPBG液晶背光跳線插上
4) 液晶顯示流程圖
file:///C:/Users/d/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
5) C語言源程序
//用LCD循環右移顯示"Welcome to China"#include<reg52.h> //包含單片機寄存器的頭文件#include<intrins.h> //包含_nop_()函數定義的頭文件sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳unsigned char code string[ ]={"Welcome to China"}; /*****************************************************函數功能:延時1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒***************************************************/void delay1ms(){ unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /*****************************************************函數功能:延時若干毫秒入口參數:n***************************************************/ void delay(unsigned char n) { unsigned char i; for(i=0;i<n;i++) delay1ms(); }/*****************************************************函數功能:判斷液晶模塊的忙碌狀態返回值:result。result=1,忙碌;result=0,不忙***************************************************/ unsigned char BusyTest(void) { bit result; RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態 RW=1; E=1; //E=1,才允許讀寫 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四個機器周期,給硬件反應時間 result=BF; //將忙碌標志電平賦給result E=0; return result; }/*****************************************************函數功能:將模式設置指令或顯示地址寫入液晶模塊入口參數:dictate***************************************************/void WriteInstruction (unsigned char dictate){ while(BusyTest()==1); //如果忙就等待 RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令 RW=0; E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖, // 就是讓E從0到1發生正跳變,所以應先置"0" _nop_(); _nop_(); //空操作兩個機器周期,給硬件反應時間 P0=dictate; //將數據送入P0口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四個機器周期,給硬件反應時間 E=1; //E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四個機器周期,給硬件反應時間 E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令 }/*****************************************************函數功能:指定字符顯示的實際地址入口參數:x***************************************************/ void WriteAddress(unsigned char x) {WriteInstruction(x|0x80);//顯示位置的確定方法規定為"80H+地址碼x" }/*****************************************************函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊入口參數:y(為字符常量)***************************************************/ void WriteData(unsigned char y) { while(BusyTest()==1); RS=1; //RS為高電平,RW為低電平時,可以寫入數據 RW=0; E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖, // 就是讓E從0到1發生正跳變,所以應先置"0" P0=y; //將數據送入P0口,即將數據寫入液晶模塊 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四個機器周期,給硬件反應時間 E=1; //E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四個機器周期,給硬件反應時間 E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令 }/*****************************************************函數功能:對LCD的顯示模式進行初始化設置***************************************************/void LcdInitiate(void){ delay(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間 WriteInstruction(0x38)//顯示模式設置:16×2顯示,5×7點陣,8位數據接口 delay(5); //延時5ms WriteInstruction(0x38); delay(5); WriteInstruction(0x38); delay(5); WriteInstruction(0x0f);//顯示模式設置:顯示開,有光標,光標閃爍 delay(5); WriteInstruction(0x06); //顯示模式設置:光標右移,字符不移 delay(5); WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除 delay(5); }void main(void) //主函數 { unsigned char i; LcdInitiate(); //調用LCD初始化函數 delay(10); while(1) { WriteInstruction(0x01);//清顯示:清屏幕指令 WriteAddress(0x00); // 設置顯示位置為第一行的第5個字 i = 0; while(string != '\0') { WriteData(string); i++; delay(150); } for(i=0;i<4;i++) delay(250); } }
7.實時演練操作
演練1: 1)LCD第一行顯示: CHINESE
LCD第二行顯示: NEWYEAR
2)先將兩行字符寫入DDRAM中,然后從右至左逐字移出顯示。
3)在指定位置停留1.6秒后,閃爍2次,清屏。
4)反復循環上述顯示方式。
|