LCD の使い方 ③ RP pico & Python 編 ①

11 Raspberry PI pico

まずは LCD と pico を繋ぎます
今回は 4bit モードで使うのでデータ線(図の緑)は4本だけです
バックライトは単体で点灯テストをやったところ
Vf 約 2.5mV、内蔵抵抗 約 100Ωでした。
文字を見えやすくするには10mA 程度流したいので
バックライトの線だけトランジスタを入れています
(そのままだと明るすぎたので、追加で100Ωの抵抗をいれました)

まずはピンの設定と定数(っぽいもの)の定義

from machine import Pin
import time

pin_RS = Pin(19, Pin.OUT)
pin_E = Pin(20, Pin.OUT)
pin_BackLight = Pin(17, Pin.OUT)

pin_D4 = Pin(4, Pin.OUT)
pin_D5 = Pin(5, Pin.OUT)
pin_D6 = Pin(6, Pin.OUT)
pin_D7 = Pin(7, Pin.OUT)

RS_COMMAND = 0
RS_DATA = 1

4bit のデータを出力する関数です。
受け取った 4bit のデータをシフトしながら各ピンに割り当てます
今回は速度よりも利便性をとって、この関数内にウエイトをいれました。
多くの情報ではウエイトはコマンドによって数十 usec ~ 1.6 ms で良いようですが
余裕をもって 2ms の固定ウエイトにしても上手く動きませんでした。
ネット情報を調べたところ、個体によってはもう少し長いウエイトが必要なようで
データを送るごとに 5ms のウエイトを置くようにしました
Enable ピンの ON → OFF も 10usec で十分なようですが
余裕を持たせて 1ms おいています

def lcd_write_4bit(data4):
    pin_D4.value((data4 >> 0) & 1)
    pin_D5.value((data4 >> 1) & 1)
    pin_D6.value((data4 >> 2) & 1)
    pin_D7.value((data4 >> 3) & 1)

    pin_E.value(1)
    time.sleep_ms(1)
    pin_E.value(0)
    time.sleep_ms(5)

実際には 8bit データを使う事が多いので
8bit データを 4bit ずつ2個に分けて 4bit 書き込み関数に送ります

def lcd_write_8bit(data8):
    data_upper = data8 >> 4
    data_lower = data8 & 0xF
    lcd_write_4bit(data_upper)
    lcd_write_4bit(data_lower)

画面消去関数
コマンドの名前は clear display ですが
同時にカーソルを左上に移動してくれます

def lcd_cls():
    pin_RS.value(RS_COMMAND)
    lcd_write_8bit(1) # clear display
#    lcd_write_8bit(2) # return home: clear display で return home も実行されるので不要でした

LCDの初期化関数です
詳しくは前回の LCD の使い方 ② 初期化 をご参照ください

def lcd_init():
    time.sleep_ms(100) # 電源投入直後のウエイト
    pin_RS.value(RS_COMMAND)
    pin_E.value(0)
    
    lcd_write_4bit(0b0011) # function set: 8bit mode
    time.sleep_ms(10)
    lcd_write_4bit(0b0011) # function set: 8bit mode
    time.sleep_ms(5)
    lcd_write_4bit(0b0011) # function set: 8bit mode
    time.sleep_ms(5)
    lcd_write_4bit(0b0010) # function set: 4bit mode

    lcd_write_8bit(0x28) # function set: 4bit, 2 lines, 5x8 font
    lcd_write_8bit(0x0C) # display on, cursor off
    lcd_write_8bit(0x06) # entry mode: cursor right
    
    lcd_cls()

メイン部分です
今回は LCD の初期化と文字列表示だけ行っています

lcd_init()

pin_RS.value(RS_DATA)
for c in "test string":
    lcd_write_8bit(ord(c))

上手く表示されたので
次回は表示位置指定などの便利関数を少し追加してみます

コメント