MCU單晶片韌體設計

2015年1月22日 星期四

Raspberry Pi b+ 用 Python 控制 LCD 16x2 (HD44780) 簡介 Part 2 基本指令介紹


LCD 基本動作指令/資料寫入


這邊要先說明一下怎麼透過這些GPIO pin腳來對LCD下達命令或是寫入一個個的8bit(1 byte)資料.

LCD模組一般來說有兩個基本動作--"寫入指令"和"寫入資料"--我們先來看看怎麼寫入指令:





假設想要移動游標的位置到第一行第一格的位置,查 Datasheep 可以知道我們要寫入的指令是0x80,轉換成二進位就變成 0b10000000 。

寫入指令可拆解成四個小動作來達成(假設想要寫入指令0x80),前兩個小動作送出一個byte中的前(高)4個bit,後兩個小動作送出一個byte中的後(低)4個bit

1. 第一次
寫入,準備好指令前面四個bit要寫入的指令:
    EN pin 設為 low
    RW pin 設為 low ==> 跟LCD說這是一個寫入的動作
    RS pin 設為 low ==> 跟LCD說這次的寫入的 "0x80" 是"指令"
    D7~D4 分別對應"指令"(0x80 == 0b1000 0000)的 bit7 ~ bit4
    
    所以: 
    D7 pin 設為 high (0b1000 0000)
    D6 pin 設為 low  (0b1000 0000)
    D5 pin 設為 low  (0b1000 0000)
    D4 pin 設為 low  (0b1000 0000)

2. 用EN pin送出確認信號通知LCD說資料已經準備好了
:
    EN pin 先設為high
    等一下
    EN pin 設為low


3. 第二次
寫入,準備好指令後面四個bit要寫入的指令,RS,RW都不動
    D7~D4 分別對應"指令"(0x80 == 0b10000000)的 bit3 ~ bit0    
    所以:
    D7 pin 設為 low  (0b1000 0000)
    D6 pin 設為 low  (0b1000 0000)
    D5 pin 設為 low  (0b1000 0000)
    D4 pin 設為 low  (0b1000 0000)


4. 用EN pin送出確認信號通知LCD說資料已經準備好了:
    EN pin 先設為high
    等一下
    EN pin 設為low

5. 等待一段時間,LCD需要一些時間來處理這個指令。(~ 50 micro second)

這樣就完成傳送一個指令到LCD的動作.用Python程式碼來呈現的話就是這樣:

def write_command(cmd): RS = 20 RW = 21 EN = 26 D4 = 19 D5 = 13 D6 = 6 D7 = 5 GPIO.output(EN,0) GPIO.output(RW,0) GPIO.output(RS,0) GPIO.output(D7, 1 if (0x80 & cmd) else 0) GPIO.output(D6, 1 if (0x40 & cmd) else 0) GPIO.output(D5, 1 if (0x20 & cmd) else 0) GPIO.output(D4, 1 if (0x10 & cmd) else 0) GPIO.output(EN,1) sleep(0.000001) GPIO.output(EN,0) sleep(0.000001) GPIO.output(D7, 1 if (0x08 & cmd) else 0) GPIO.output(D6, 1 if (0x04 & cmd) else 0) GPIO.output(D5, 1 if (0x02 & cmd) else 0) GPIO.output(D4, 1 if (0x01 & cmd) else 0) GPIO.output(EN,1) sleep(0.000001) GPIO.output(EN,0) sleep(0.00005) write_command(0x80)

參考Datasheet的話會發現總共有8指令配合各自的設定參數.有需要的時候再去查就好.

前述的指令"0x80"寫入之後,就會把游標移動到顯示螢幕上第一行第一格的位置。此時要在這個位置顯示ASCII字元(假設是"A",ASCII表中的16進位值為0x41二進位為0b0100 0001),哪要怎麼寫入"資料"?


其實所有的動作都和寫入"指令"的時候一樣,只是 RS pin 腳要設為high。詳細的動作如下:

1. 第一次寫入,準備好要寫入的前面四個bit:
    EN pin 設為 low
    RW pin 設為 low  ==> 跟LCD說這是一個寫入的動作
    RS pin 設為 high ==> 跟LCD說這次的寫入的 "0x41" 是"資料"
    D7~D4 分別對應"
資料"(0x41 == 0b0100 0001)的 bit7 ~ bit4    
    所以: 
    D7 pin 設為 low  (0b0100 0001)
    D6 pin 設為 high (0b0100 0001)
    D5 pin 設為 low  (0b0100 0001)
    D4 pin 設為 low  (0b0100 0001)

2. 用EN pin送出確認信號通知LCD說資料已經準備好了
:
    EN pin 先設為high
    等一下
    EN pin 設為low


3. 第二次
寫入,準備好指令後面四個bit要寫入的資料RS,RW都不動
    D7~D4 分別對應"資料"(0x41 == 0b01000001)的 bit3 ~ bit0    
    所以:
    D7 pin 設為 low  (0b0100 0001)
    D6 pin 設為 low  (0b0100 0001)
    D5 pin 設為 low  (0b0100 0001)
    D4 pin 設為 high (0b0100 0001)


4. 用EN pin送出確認信號:
    EN pin 先設為high
    等一下
    EN pin 設為low

寫成程式碼後會變成下面這樣...

def write_data(data): RS = 20 RW = 21 EN = 26 D4 = 19 D5 = 13 D6 = 6 D7 = 5 GPIO.output(EN,0) GPIO.output(RW,0) GPIO.output(RS,1) # <<===== 這裡RS要設為high GPIO.output(D7, 1 if (0x80 & data) else 0) GPIO.output(D6, 1 if (0x40 & data) else 0) GPIO.output(D5, 1 if (0x20 & data) else 0) GPIO.output(D4, 1 if (0x10 & data) else 0) GPIO.output(EN,1) sleep(0.000001) GPIO.output(EN,0) sleep(0.000001) GPIO.output(D7, 1 if (0x08 & data) else 0) GPIO.output(D6, 1 if (0x04 & data) else 0) GPIO.output(D5, 1 if (0x02 & data) else 0) GPIO.output(D4, 1 if (0x01 & data) else 0) GPIO.output(EN,1) sleep(0.000001) GPIO.output(EN,0) sleep(0.00005) write_data(0x41) # 或是write_data(ord('A'))

於是乎,"A"的值就會出現在0x80的位置,也就是螢幕上第一行第一格的地方。

了解到這裡後,馬上安裝LCD然後下指令就會發現...LCD還是沒反應...這並不表示前面講的有問題,也不是LCD出問題。而是Datasheet通常不會一開始就說清楚講明白的"開機"動作。

Datasheet通常會在很後面的時候才告訴你,LCD在通電之後正常運作之前,還需要一些 "開機" 和 "設定動作" 才能開始正常使用。

所以下面要來介紹如何才能成功幫LCD "開機"....

下一篇 part3: 初始化動作

--part1: 硬體設定篇
--part2: 基本指令介紹
--part3: 初始化動作
--part4: 自訂字形

Python 控制 LCM模組的Code 可在 Github 下載。
https://github.com/itrobotics/python_LCM_control


2 則留言 :

  1. 最後的連結連到Google code有誤喔

    回覆刪除
  2. Thanks for sharing, nice post!

    Đến Casanova đây là quan cafe san vuon dep bạn không nên bỏ qua hay bạn muốn học bài thì cafe yên tĩnh học bài cực thú vị đấy hay quán quán cafe view đẹp bạn không nên bỏ qua hay quán cafe có đàn piano ở tphcm siêu lãng mạn hay casanovacafe là 1 trong quán cafe giá rẻ bạn nên đến 1 lần, hay tổng hợp những quán những quán cà phê dễ thương ở sài gòn hay những quán cafe nhỏ xinh đến là mê hay quán cafe độc đáo ở sài gòn hay quán cafe sang chảnh ở sài gòn bạn nên trải nghiệm hay quán cafe độc lạ ở tphcm cực đẹp hay quan cafe nhac acoustic o sai gon cực lãng mạn hay máy đưa võng tự động giúp bé ngủ ngon hay đây là quán cafe phong cách lạ bạn nên đến hay bạn muốn hội họp thì đây là cafe may chieu cho bạn làm việc hay quán cafe phòng riêng cho làm offline làm việc hay điểm danh quan cafe thu cung bạn nên đến hay quan cafe boi bai tarot cực thú vị hay ship hang tu amazon ve vietnam hay an toàn không hay dịch vụ nhận mua hàng từ amazon uy tín, giá rẻ hay dịch vụ nhận đặt hàng trên amazon uy tín hay order hàng trên amazon tốt nhất hay

    回覆刪除