LCD1602に日本語(カタカナ)を表示させる方法
 
			      					前回、LCD1602モジュールを使って数字やアルファベットを表示させました。
LCD1602はカタカナも表示させることができます。
しかし、前回のプログラムでは上手くいきませんでした。
今回は、カタカナを表示させるにはどうすればよいかを解説していきます。
カタカナが表示されない理由
前回使ったサンプルプログラムでは、表示させたい文字をord関数でunicodeに変換しています。
「A」を変換すると、01000001なのでCGROMのアドレスと一致します。
 
しかし、「ア」を変換すると11000010100010なのでCGROMのアドレス外になってしまい表示されないのです。
CGROMアドレスを直接指定して表示する
カタカナを表示させるには、ord関数を使わずにCGROMアドレスを直接指定すればいいのです。
試しにリョウノスケと表示させてみたいと思います。
対応表は次の通りです。
| 文字 | CGROMアドレス | |
|---|---|---|
| 2進数 | 16進数 | |
| リ | 11011000 | D8 | 
| ョ | 10101110 | AE | 
| ウ | 10110011 | B3 | 
| ノ | 11001001 | C9 | 
| ス | 10111101 | BD | 
| ケ | 10111001 | B9 | 
Pythonコード
前回のコードをベースに、このようなプログラムにしました。
import smbus
import time
# パラメータ設定
I2C_ADDR  = 0x27       # PCF8574のアドレス
LCD_WIDTH = 16         # 1行に表示する文字数の上限
LCD_CMD = 0x00         # コマンド送信モード
LCD_CHR = 0x01         # データ送信モード
LCD_LINE_1 = 0x80      # 1行目のRAMアドレス
LCD_LINE_2 = 0xC0      # 2行目のRAMアドレス
LCD_BACKLIGHT  = 0x08  # バックライトOFF
bus = smbus.SMBus(1)   # SMBusの引数に1を指定する。ラズパイのI2Cバスの番号
def lcd_init():
  lcd_byte(0x33,LCD_CMD,0.005,0.0001)  # 初期化(0011を2回)
  lcd_byte(0x32,LCD_CMD,0.0001,0.0001) # 初期化(0011、0010で4bitモードに設定)
  lcd_byte(0x06,LCD_CMD,0.0001,0.0001) # データ書き込み時にカーソルを右にシフト
  lcd_byte(0x0C,LCD_CMD,0.0001,0.0001) # ディスプレイ・オン、カーソル&BLINK・オフ
  lcd_byte(0x28,LCD_CMD,0.0001,0.0001) # 2列 5x7ドット
  lcd_byte(0x01,LCD_CMD,0.0001,0.002)  # 全表示クリア、カーソルをホーム位置に戻す
  time.sleep(0.0005)
  
def lcd_byte(bits, mode, tw1, tw2):
  upper_bits = mode | (bits & 0xF0) | LCD_BACKLIGHT         # 上位4bit(下位4bitを0にする)
  lower_bits = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT    # 下位4bit(4bitシフトさせてから下位4bitを0にする)
  bus.write_byte(I2C_ADDR, upper_bits)                      # 上位4bitを書き込み
  lcd_toggle_enable(upper_bits, tw1, tw2)
  bus.write_byte(I2C_ADDR, lower_bits)                      # 下位4bitを書き込み
  lcd_toggle_enable(lower_bits, tw1, tw2)
# E(Enable)信号をトグル(LOW→HIGH→LOW)
def lcd_toggle_enable(bits, tw1, tw2):
  time.sleep(0.0005)
  bus.write_byte(I2C_ADDR, (bits | 0b00000100))
  time.sleep(tw1)
  bus.write_byte(I2C_ADDR,(bits & 0b11111011))
  time.sleep(tw2)
def lcd_string():
  lcd_byte(LCD_LINE_1,LCD_CMD,0.0001,0.0001)
  lcd_byte(0xD8,LCD_CHR,0.0001,0.0001) # リ
  lcd_byte(0xAE,LCD_CHR,0.0001,0.0001) # ョ
  lcd_byte(0xB3,LCD_CHR,0.0001,0.0001) # ウ
  lcd_byte(0xC9,LCD_CHR,0.0001,0.0001) # ノ
  lcd_byte(0xBD,LCD_CHR,0.0001,0.0001) # ス
  lcd_byte(0xB9,LCD_CHR,0.0001,0.0001) # ケ
  time.sleep(10)
if __name__ == '__main__':
  try:
    lcd_init()
    lcd_string()
  except KeyboardInterrupt:
    pass
  finally:
    LCD_BACKLIGHT = 0x00                 # バックライトOFF
    lcd_byte(0x01,LCD_CMD,0.0001,0.0001) # LCDの表示内容をクリア42~47行目でカタカナを指定しています。
実行結果
カタカナが表示されました!
 
			