稼働中

Raspberry Pi Pico(s_13)LCD 1602 用モジュール

LCD1602 LCD1602c.py

LCD 1602は2行16桁表示できる液晶ディスプレイ(Liquid Crystal Display)です。
※詳細はLCD 1602、HD44780のデータシートを参照ください。
Raspberry Pi PicoでLCD 1602センサーモジュールを使う自作の’LCD1602c.py’を作成しました。記事d_17を元に作成しています。使い方だけを記載します。’LCD1602c.py’は末尾にあります。

使い方

■ ファイル転送
Raspberry Pi Picoへ’LCD1602c.py’を送った後でimportして使います。
※LCD1602c.pyの末尾に、使用例(LCD1602_ex.py)の## example以降をコピペ追加しても動作確認できます。

■ メソッド
‘LCD1602c’をimportすると「lcd_init、lcd_cmd、lcd_chr、lcd_pos、lcd_print、lcd_clear、lcd_home、lcd_on、lcd_off、lcd_curL、lcd_curR、lcd_dspL、lcd_dspR」のメソッドが使えるようになります。

LCD1602(num=1,sda=10)で初期化します。
num:I2C0、I2C1の番号です。デフォルトは1(I2C1)
sda:SDAのGPIO番号です。デフォルトは10(GP10)

(01)lcd_init()
LCD 1602(HD44780U)を初期化します。4bitモード、2行、カーソル点滅に設定します。
(02)lcd_cmd(dat)
コマンドデータを送ります。
(03)lcd_chr(dat)
1文字のコードデータを送って表示します。ROM Codeにはカタカナもあります。
(04)lcd_print(pr)
英数字の文字列(pr)を表示します。
(05)lcd_pos(x, y)
カーソル位置をセットします。
(06)lcd_clear()
表示を消去します。
(07)lcd_home()
home(0,0)位置に戻ります。
(08)lcd_on()
表示をオンします。
(09)lcd_off()
表示をオフします。データは消えていません。
(10)lcd_curL()
カーソルを左にシフトします。
(11)lcd_curR()
カーソルを右にシフトします。
(12)lcd_dspL()
表示全体を左にシフトします。
(13)lcd_dspR()
表示全体を右にシフトします。

使用例

LCD 1602に文字列を表示させます。
0行1列から’0123456789012345’を表示
1行1列から’abcdefghABCDEFGH’を表示
0行1列から’!#$%&()=|@+-*/<>’を上書き表示
1行1列からコード0xb0~0xbf(-アイ…ソ)を上書き表示
homeに移動後、表示の消去
を試しています。


LCD1602c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import I2C,Pin
import time
from LCD1602c import LCD1602
# LCD 1602
# HD44780U (LCD-II) Dot Matrix Liquid Crystal Display Controller/Driver

## example
# 初期化
a=LCD1602(1,10)  #instance
a.lcd_init()
a.lcd_clear()   # clear
time.sleep(2)

# 0行1列から'0123456789012345'を表示
a.lcd_pos(0,0)
time.sleep(2)
moj='0123456789012345'
a.lcd_print(moj)

# 1行1列から'abcdefghABCDEFGH'を表示
a.lcd_pos(0,1)
time.sleep(2)
moj='abcdefghABCDEFGH'
a.lcd_print(moj)

# 0行1列から'!#$%&()=|@+-*/<>'を表示
a.lcd_pos(0, 0)
time.sleep(2)
moj='!#$%&()=|@+-*/<>'
a.lcd_print(moj)

# 1行1列からコード0xb0~0xbf(-アイ...ソ)を表示
a.lcd_pos(0, 1)
time.sleep(2)
for i in range(16):
    code=0xb0+i
    a.lcd_chr(code)

# 表示のクリア
a.lcd_home()        # cur home
time.sleep(2)
a.lcd_clear()   # clear

実行結果

実行すると以下のように表示されました。
最後にクリアをしていますが、LCDの表示内容は記事d_17と同じです。
LCD1602 実行結果

LCD1602モジュール用


LCD1602c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import I2C,Pin
import time
# LCD 1602
# HD44780U (LCD-II) Dot Matrix Liquid Crystal Display Controller/Driver
class LCD1602:
    def __init__(self,num=1,sda=10):
        self.adr_lcd=0x3f    # 0x50(80)~0x57(87)
        self.i2c=I2C(num, scl=Pin(sda+1), sda=Pin(sda), freq=100_000)

    def lcd_wr(self,dat):           # write
        buf = bytearray(1)          # 1byteごとに送る
        buf[0] = dat
        self.i2c.writeto(self.adr_lcd,buf)
        time.sleep_ms(2)

    # 4bitモード送信の型
    #|D7/3|D6/2|D5/1|D4/1|BL|EN|R/W|RS| 8bit
    def lcd_dat(self,dat,RS=0):     #デフォルトはコマンド送信(RS=0)、データ送信はRS=1
        f= (dat & 0xf0)|0x0C|RS     # |BL|EN|R/W|RS|=|1|1|0|RS| 
        s= (dat & 0xf0)|0x08|RS     # |BL|EN|R/W|RS|=|1|0|0|RS| 
        return f,s

    # 4bitモード 4回送信する
    def lcd_cmd(self,dat):
        f,s=self.lcd_dat(dat)
        self.lcd_wr(f)
        self.lcd_wr(s)

        f,s=self.lcd_dat(dat<<4)         # LSB4bitをシフト
        self.lcd_wr(f)
        self.lcd_wr(s)
        
    # 初期化 4-bit mode、2行、カーソル点滅
    def lcd_init(self):
        # Initialize 4-bit mode
        fset=[0x30,0x30,0x30,0x20]
        for c in fset:
            f,s=self.lcd_dat(c)
            self.lcd_wr(f)
            self.lcd_wr(s)

        # 28:4bit col2,disp-cur,blink,entry-increase,disp-clear
        bset=[0x28,0x0F,0x06,0x01]
        for c in bset:
            f,s=self.lcd_dat(c)
            self.lcd_wr(f)
            self.lcd_wr(s)
            
            f,s=self.lcd_dat(c<<4)
            self.lcd_wr(f)
            self.lcd_wr(s)

    # moji data 
    def lcd_chr(self,dat):
        #RS=1 
        f,s=self.lcd_dat(dat,RS=1)
        self.lcd_wr(f)
        self.lcd_wr(s)
        f,s=self.lcd_dat(dat<<4,RS=1)
        self.lcd_wr(f)
        self.lcd_wr(s)

    #***** カーソル位置 (DDRAM address)
    def lcd_pos(self,x, y):
        pos=(0x80 | (y* 0x40 + x))
        self.lcd_cmd(pos)

    #***** lcd に文字を表示 2行16文字 データ送信(RS=1)
    # eisuuji
    def lcd_print(self,pr):
        m_dat=pr.encode()
        for i in m_dat:
            self.lcd_chr(i)
## 他のコマンド
    #Clear display
    def lcd_clear(self):
        self.lcd_cmd(0x01)
    #Return home
    def lcd_home(self):
        self.lcd_cmd(0x02)
    #Display on
    def lcd_on(self):
        self.lcd_cmd(0x0f)
    #Display on
    def lcd_off(self):
        self.lcd_cmd(0x08)
    #cursor shift-L
    def lcd_curL(self):
        self.lcd_cmd(0x10)
    #cursor shift-R
    def lcd_curR(self):
        self.lcd_cmd(0x14)
    #display shift-L
    def lcd_dspL(self):
        self.lcd_cmd(0x18)
    #display shift-L
    def lcd_dspR(self):
        self.lcd_cmd(0x1c)