重中之重新手必看,單片機顯示原理

2022-03-31     大方老師單片機

原標題:重中之重新手必看,單片機顯示原理

重中之重新手必看,單片機顯示原理

一.接口

LCD1602是很多單片機愛好者較早接觸的字符型液晶顯示器,它的主控晶片HD44780或者其它兼容晶片。與此相仿的LCD12864液晶顯示器,它是一種圖形點陣顯示器,能顯示的內容LCD1602要豐富得多,除了普通字符外,還可以顯示點陣圖案,帶有漢字型檔的還可以顯示漢字,它的並行驅動方式LCD1602相差無幾,所以,在這裡花點時間是值得的。

一般來說LCD160216條引腳,據說還14條引腳的,16腳的相比缺少了背光電A(15)和地K(16)。這LCD1602的型號HJ1602A,是繪晶科技公司的產品,它16條引腳。如1所示:

1

再來一張它的背面的,如2所示:

2

16條引腳定義如下:

對這個表的說明:

1. VSS接電源地。

2. VDD+5V

3. VO是液晶顯示的偏壓信號,可10K3296精密電位器。或同樣阻值RM065/RM063藍白可調電阻。見3

3

4. RS是命/數據選擇引腳,接單片機的一I/ORS為低電平時,選擇命令;RS為高電平時,選擇數據。

5. RW/寫選擇引腳,接單片機的一I/ORW為低電平時,LCD1602寫入命令或數據;RW為高電平時,LCD1602讀取狀態或數據。如果不需要進行讀取操作,可以直接將其VSS

6. E,執行命令的使能引腳,接單片機的一I/O

7. D0D7,並行數據輸/輸出引腳,可接單片機P0P3任意8I/O口。如果P0P0口應該4.7K10K的上拉電阻。如果4線並行驅動,只須4I/O口。

8. A背光正極,可接一1047歐的限流電阻VDD

9. K背光負極,VSS。見4所示。

4

二.基本操作

LCD1602的基本操作分為四種:

1.讀狀態:輸RS=0RW=1E=高脈衝。輸出D0D7為狀態字。

2.讀數據:輸RS=1RW=1E=高脈衝。輸出D0D7為數據。

3.寫命令:輸RS=0RW=0E=高脈衝。輸出:無。

4.寫數據:輸RS=1RW=0E=高脈衝。輸出:無。

讀操作時序(5)

5

寫操作時序(6)

6

時序時間參(7)

7

DDRAMCGROMCGRAM

DDRAM(Display Data RAM)就是顯示數RAM,用來寄存待顯示的字符代碼。80個位元組,其地址和螢幕的對應關係如(8)

8

DDRAM相當於計算機的顯存,我們為了在螢幕上顯示字符,就把字符代碼送入顯存,這樣該字符就可以顯示在螢幕上了。同LCD160280個位元組的顯存,DDRAMLCD1602的顯示螢幕只16×2大小,因此,並不是所有寫DDRAM的字符代碼都能在螢幕上顯示出來,只有寫在上圖所示範圍內的字符才可以顯示出來,寫在範圍外的字符不能顯示出來。這樣,我們在程序中可以利用下面光標或顯示移動指使字符慢慢移動到可見的顯示範圍內,看到字符的移動效果。

前面說了,為了在液晶螢幕上顯示字符,就把字符代碼送DDRAM。例如,如果想在螢幕左上角顯示字A,那麼就把字A的字符代41HDDRAM00H地址處即可。至於怎麼寫入,後面會有說明。那麼為什麼把字符代碼寫DDRAM,就可以在相應位置顯示這個代碼的字符呢?我們知道LCD1602是一種字符點陣顯示器,為了顯示一種字符的字形,必須要有這個字符的字模數據,什麼叫字符的字模數據,看看下面的這個圖就明白(9)

9

上圖的左邊就是字A的字模數據,右邊就是將左邊數據01。從而顯示A這個字形。從下面的圖可以看出,字A4010040001,合在一起就01000001b41H。它恰好與該字符ASCII碼一致,這樣就給了我們很大的方便,我們可以PC上使P2=A這樣的語法。編譯後,正好是這個字符的字符代碼。

LCD1602模塊上固化了字模存儲器,就CGROMCGRAMHD44780內置192個常用字符的字模,存於字符產生CGROM(Character Generator ROM)中,另外還8個允許用戶自定義的字符產RAM,稱CGRAM(Character Generator RAM)。下(12)說明CGROMCGRAM與字符的對應關係。ROMRAM的名字我們也可以知道ROM是早已固化LCD1602模塊中的,只能讀取;RAM是可讀寫的。也就是說,如果只需要在螢幕上顯示已存在CGROM中的字符,那麼只須DDRAM中寫入它的字符代碼就可以了;但如果要顯CGROM中沒有的字符,比如攝氏溫標的符號,那麼就只有先CGRAM中定義,然後再DDRAM中寫入這個自定義字符的字符代碼即可。CGROM中固化的字符不同CGRAM中本身沒有字符,所以要DDRAM中寫入某CGROM不存在的字符,必須CGRAM中先定義後使用。程序退出CGRAM中定義的字符也不復存在,下次使用時,必須重新定義。

10

上面這個(10)說明的8點陣5×10點陣字符的字形和光標的位置。先來8點陣,它85列。那麼定義這樣一個字符需8個位元組,每個位元組的3個位沒有被使用。例如,定義攝氏溫標的符{0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}

11

上面這個(11)說明的是設CGRAM地址指令。從這個指令的格式中我們可以看出,它共aaaaaa6位,一共可以表64個地址,64個位元組。一8點陣字符共占8個位元組,那麼64個位元組一共可以自定8個字符。也就是說,上面這個圖6位地址中DB5DB4DB3用來表8個自定義的字符DB2DB1DB0用來表示每個字符8個位元組。DB5DB4DB3所表示8個自定義字(0--7)就是要寫DDRAM中的字符代碼。我們知道,CGRAM中只能定8個自定義字符,也就是只078個字符代碼,但在下面的這個(12)中一共16個字符代(××××0000b--××××1111b)。實際上,如圖所示,它只能表8個自定義字 (××××0000b=××××1000b, ××××0001b=××××1001b依次類)。也就是說,寫DDRAM中的字符代0和字符代8是同一個自定義字符5×10點陣每個字符共占16個位元組的空間,所CGRAM中只能定4個這樣的自定義字符。

那麼如何CGRAM中自定義字符呢?在上面的介紹中,我們知道有一個設CGRAM地址指令,同DDRAM指令相似,只須設置好某個自定義字符的字模數據,然後按照上面介紹的方法,設置CGRAM地址,依次寫入這個字模數據即可。我們在後面的例子中再進行說明。

12

LCD1602指令

1.工作方式設置指(13)

13

×:不關心,也就是說這個位01都可以,一般0

DL:設置數據接口位數。

DL=18位數據接(D7D0)

DL=04位數據接(D7D4)

N=0:一行顯示。

N=1:兩行顯示。

F=08點陣字符。

F=15×10點陣字符。

說明:因為是寫指令字,所RSRW0LCD1602只能用並行方式驅動,不能用串行方式驅動。而並行方式又可以選8位數據接口4位數據接口。這裡我們選8位數據接(D7D0)。我們的設置8位數據接口,兩行顯示8點陣,0b00111000也就0x38(注意NF1011的效果是一樣的,都是兩8點陣。因為它不能以兩5×10點陣方式進行顯示,換句話說,這裡0x380x3c是一樣)

2.顯示開關控制指(14)

14

D=1:顯示開D=0:顯示關。

C=1:光標顯示C=0:光標不顯示。

B=1:光標閃爍B=0:光標不閃爍。

說明:這裡的設置是顯示開,不顯示光標,光標不閃爍,設置字0x0c

3.進入模式設置指(1516)

15

I/D=1:寫入新數據後光標右移。

I/D=0:寫入新數據後光標左移。

S=1:顯示移動。

S=0:顯示不移動。

16

說明:這裡的設置0x06

4.光標或顯示移動指(1718)

17

18

說明:在需要進行整屏移動時,這個指令非常有用,可以實現螢幕的滾動顯示效果。初始化時不使用這個指令。

5.清屏指(19)

19

說明:清除螢幕顯示內容。光標返回螢幕左上角。執行這個指令時需要一定時間。

6.光標歸位指(20)

20

說明:光標返回螢幕左上角,它不改變螢幕顯示內容。

7.設CGRAM地址指(21)

21

說明:這個指令在上面已經介紹過。用法在後面例子中說明。

8.設DDRAM地址指(22)

22

說明:這個指令用於設DDRAM地址。在DDRAM進行讀寫之前,首先要設DDRAM地址,然後才能進行讀寫。前面我們說過DDRAMLCD1602的顯示存儲器。我們要在它上面進行顯示,就要把要顯示的字符寫DDRAM。同樣,我們想知DDRAM某個地址上有什麼字符,也要先設DDRAM地址,然後將它讀出到單片機。

9.讀忙信號和地址計數AC(23)

23

說明:這個指令用來讀LCD1602狀態。對於單片機來說LCD1602屬於慢速設備。當單片機向其發送一個指令後,它將去執行這個指令。這時如果單片機再次發送下一條指令,由LCD1602速度較慢,前一條指令還未執行完畢,它將不接受這新的指令,導致新的指令丟失。因此這條讀忙指令可以用來判LCD1602是否忙,能否接收單片機發來的指令。BF=1,表LCD1602正忙,不能接受單片機的指令;BF=0,表LCD1602空閒,可以接收單片機的指令RS=0,表示是指令RW=1,表示是讀取。這條指令還有一個副產品:即可以得到地址記數AC(address counter)LCD1602維護了一個地址計數AC,用來記錄下一次讀CGRAMDDRAM的位置。需要強調的是:這條指令我一次也沒有執行成功。很多網友似乎也是這樣。好在我們有另外的辦法,也就是延時。通過查看每條指令的執行時間,再經過一些試驗,可以確定指令的延時。這樣就可以在上一條指令執行完畢後再執行下一條指令了。

10.寫數據CGRAMDDRAM(24)

24

說明RS=1,數據RW=0,寫。指令執行時,要DB7DB0上先設置好要寫入的數據,然後執行寫命令。

11CGRAMDDRAM讀數據指(25)

25

說明RS=1,數據RW=1,讀。先設置CGRAMDDRAM的地址,然後執行讀取命令。數據就被讀入DB7DB0

五.實例

下面我們就以一個實例來結束這篇文章。先介紹一下背景:單片機最小系(擴充了外RAM 62256)。采STC89C52RC,晶22.1184MHZ8點陣16×28位數據埠。首先在第一行顯I love MCU!,第二行顯LCD1602 Test!。延時一段時間,清屏。然後在第一行顯示自定義字符:攝氏溫標標誌。第二行顯示圓周(pai)標誌。再延時一段時間,清屏。最後在第一行顯Welcome to my blog!,顯示方式是從螢幕右面移入,左面移出。周而復(26)

說了這麼多,大家記得留意下方評論第一條(或者私信我)有干~

文章來源: https://twgreatdaily.com/zh-cn/787e8f80f9b110454e71340c02fdc94a.html