2012年12月5日 星期三

LCD原理與控制


源自於 http://faculty.stut.edu.tw/~wjshieh/lcd.html
LCD原理與控制
一.種類:可分為
  1.文字型:已經有內建文字圖形(通常只有英文字母大小寫、阿拉伯數字、標點符號),
    只要輸入對應的字形碼(ASCII  code),LCD便會將該字的圖形顯示於LCD,可參考課
 本第三篇第三章。
  2.繪圖型:只能用繪圖的方式將資料顯示於LCD,所以必須先將要顯示文字的圖形依LCD所
    需的格式事先存起來,如一個16x15的中文字便需儲存30byte的資料,將此30byte的資
 料依序填入LCD即可顯示對應文字圖形,可參考課本第四篇第二章。
  3.文字繪圖兩用型:可依使用者需要切換成文字型或繪圖型。
    在此我們只討論如何控制文字型LCD

二.原理
下圖為目前市面上常見的文字型LCD基本的方塊圖,
其LCD接腳的功能為
1
Vss
接地(0 V)
2
Vdd
電源 (+5 V)
3
Vo
LCD亮度控制(0 V最亮)
4
RS
暫存器選擇:1 資料
0 指令
5
R/W
讀/寫選擇:1 從LCD讀取資料
           0 寫資料給LCD
6
E
致能LCD,負緣動作
7
D0
LCD 資料線
8
D1
9
D2
10
D3
11
D4
12
D5
13
D6
14
D7

LCD字型編碼表(此圖版權屬張義和,例說89S51-C語言,新文京開發出版社所有)

因為LCD本身並不會發亮,為了使夜間能看清楚LCD內容,某些LCD模組另外提供A、K做為背光用的電源接腳,有些廠商為了控制簡化,已將此兩接腳及相關電路接到LCD的電源腳,所以LCD只要1、2接上電源就LCD背光就會亮。
目前常見控制LCD的晶片最高可控制顯示80個字元,但實際LCD面板尺寸依價錢及使用者需求而有不同的規格,目前市面較常見的規格有16字x2行或20字x2行。
三.控制方法
8051可以透過LCD接腳D0~D7存取命令或資料,接腳RS、R/W依其排列組合可產生下列功能:
RS
R/W
功   能
0
0
寫命令到LCD
0
1
讀取忙碌旗號和位址計數器AC(記錄目前游標位址)內容
1
0
寫資料到DDRAM(要顯示的文字)或CGRAM(要造字的字形)
1
1
從DDRAM或CGRAM讀取資料
  在寫入狀態(R/W=0)時,當接腳E產生負緣訊號,LCD便將資料線D0~D7取入LCD處理,依照RS設定狀態,
  決定此資料為控制命令(RS=0)或是要顯示或造字的資料。
  在讀取狀態(R/W=1)時,當接腳E產生負緣訊號,LCD便依照RS設定狀態,將資料從 D0~D7送出來。
  
  PS:8051如何產生負緣訊號給LCD接腳E?
  
       SETB      E
       CLR       E    ;where E is the pin of 8051  which connect to LCD
  
  在多數應用的場合中,我們常直接將接腳R/W接地,使其一直處於寫入狀態,這樣8051可節省一隻接腳去控
  制它,但以後寫資料或命令給LCD時,需保留足夠的處理時間給LCD(因為無法判斷LCD是否已處理好,且用
  讀取LCD忙碌旗號來判斷是否處理完的程式並不會比較好寫),另外游標實際所在的位置也需處理好。
 


 若已知8051與LCD的接法如下圖所定義,將接腳R/W接地,使其處於寫入命令或資料的狀態,這樣在控制時,單晶片可節省

一支接腳,但須注意控制資料及命令寫入之後的延遲時間,寧可時間長一些,以避免LCD在未處裡完成前給予下一筆資料。

我們便可依上述說明及電路接法設計寫資料和命令給LCD的副程式。
  ;定義接腳名稱 
  LCDBUS  EQU    P0            ;LCD位置
  RS      EQU    P2.6
  ENABLE  EQU    P2.7
  ;-----  WRITE 資料 TO  LCD --------------
  WRDR:   SETB   RS           ;RS=1 => 寫資料到LCD
          SETB   ENABLE       ;E=1
          MOV    LCDBUS,A 
          MOV    R7,#5        ;等待約10us等8051輸出電壓穩定 
          DJNZ   R7,$   
          CLR    ENABLE        ;E=0  => 接腳E產生負緣訊號 
          MOV    R7,#25        ;等待約50us等LCD將資料處理完畢
          DJNZ   R7,$ 
          RET 
  
  ;-----  WRITE 命令 TO  LCD --------------
  WRIR:   CLR    RS            ;RS=0 => 寫命令到LCD
          SETB   ENABLE
          MOV    LCDBUS,A 
          MOV    R7,#5
          DJNZ   R7,$ 
          CLR    ENABLE 
          MOV    R7,#25
          DJNZ   R7,$ 
          RET 


  
下表為有關LCD的控制命令表:(詳細說明請參考課本)
    
命令
指令編碼

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1.清除顯示器
0
0
0
0
0
0
0
0
0
1
2.游標歸位
0
0
0
0
0
0
0
0
1
X
3.進入模式設定
0
0
0
0
0
0
0
1
I/D
S
4.顯示器ON/Off控制
0
0
0
0
0
0
1
D
C
B
5.顯示器或游標移動
0
0
0
0
0
1
S/C
R/L
X
X
6.功能設定
0
0
0
0
1
DL
N
F
X
X
7.CGRAM 位址設定
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
8.DDRAM 位址設定
0
0
1
AD6
AD5
AD4
AD3
AD2
AD1
AD0
 
 
1.清除顯示器

  功能:LCD畫面清除,LCD位址計數器AC=0,即游標移到左上角。 
  
  範例: 
         MOV     A,#1
         CALL    WRIR
  
  依照課本說明完成此命令需1.64ms,為安全起見,下達此命令後須等2ms以上,等LCD處理完此命令後,
  才能再給LCD下一命令或資料,否則在LCD尚未處理完之前給的任何命令或資料均屬無效。 


2.游標歸位

  功能:LCD畫面不變,LCD位址計數器AC=0,游標移到左上角。 
  
  範例: 
         MOV     A,#00000010B
         CALL    WRIR
  依照課本說明完成此命令需1.64ms,時間較長,可以用第8個命令取代,亦可達到相同效果,
  所花時間只要40us。 
  
         MOV     A,#10000000B   ;設定游標移至位址00的地方
         CALL    WRIR


3.進入模式設定 


6. 功能設定
   早期的CPU有4位元及8位元2種,這個命令主要是配合不同CPU介面設計,當設定CPU介面為4位元時,
   只有DB7~DB4有作用,以後要送8位元資料時,都要將資料拆成2筆4位元資料,再分2次給LCD。目前
   CPU都是8位元,LCD也幾乎都是2行的,所以標準命令如下


         MOV     A,#00111000B   ;設定LCD介面長度為8位元,2行,5x7字型
         CALL    WRIR
         
        (因為需先確定LCD與CPU間的介面形式,所以此命令必須最先執行)


7.CGRAM 位址設定
  此命令提供使用者自行造字之功能,若LCD字型編碼表上沒有想顯示的字,使用者可自行造字,最多可
  造8個字,此命令共保留6個位元,前3位元表示第n個字(n<=8), 後3位元代表該字的第幾行(共8行,最
  後一行要填0),每一行的資料只有5位元,前3位元沒用到可直接給0或省略不寫,結果相同。
  

         MOV     A,#01000000B   ;設定寫入字型資料, 從第一字的第一行開始
         CALL    WRIR


LCD造字範例(此圖版權屬張義和,例說89S51-C語言,新文京開發出版社所有)
範例程式(ASM)

以下練習所使用之實驗版,茲節錄控制電路如後。

注意事項:
1.笙泉的82G516執行速度較快,如果將其他8051系列的LCD控制程式移植到82G516上執行,須調整寫入後的延遲時間,
  否則可能會無法正常工作。
2.如果要在程式一開始就直接規劃LCD,建議先加一小段延遲程式,否則可能因LCD穩定時間較慢,單晶片在LCD還沒穩
  定前所做的規劃是沒有意義的,LCD當然不能正常工作。一般在使用ICE測試時,電源早已啟動,不會有這個問題,
  等實際燒錄作測試,需再按RESET才可正常工作時,通常是因為這個原因。
範例下載1(ASM)下載2(ASM)
範例下載(C)
在LCD上顯示時間(時分秒)
範例下載(ASM)
注意:為便於觀察,LCD上顯示時間比實際快10倍,請自行調整中斷程式內的參數。
練習:時鐘程式,在LCD上顯示時間,包含小時、分鐘及秒,含分隔符號(冒號:)共8位數(HH:MM:SS),靠第一行右邊顯示。
按0時,小時加1
按1時,分鐘加1
按2時,秒歸0
參考範例(ASM)
上述範例每按一次按鍵調整一次數值,有點不方便,為了調整成按著不放可以時間連續累加,直到接近所要的數值為止,我們可在程式加一段判斷程式,
第一次延遲時間長一點,若按住超過一段時間(程式中是設定成0.8秒),可連續累加(程式中是設定成0.15秒加1),各位可自行比較兩個程式不同的地方。
(控制參數命名為RPT,可用搜尋方式尋找)
參考範例(ASM)

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...