RasPIのミニLCD漢字表示

DSC_0672TG12864Bという128×64ドット表示の
グラフィックLCDが遊んでいたので、
RasPiにつないで、門真なむ様公開の
8×12のフォントを使い、自由に
漢字表示するプログラムを作りました。

参考にしたのは、ここですが、
次の4点を改良しました。

1)漢字コード系を自由に扱いたく、Python言語で書き替えました。
2)8×12の、割ときれいなフォントを扱うことができます。
3)GPIOピンの割り当てを自在にしました。
4)コマンドラインからも簡単に表示できます。

$ sudo python kanji812.py ☆グラフィック液晶に日本語表示☆8×12のビットマップフォントを使用して16文字を4行表示にしています。とても読み易い感触です。

<kanji812.py>

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import sys
import time

# コマンドの発行
def command(value, mode):
 GPIO.output(pinRS, mode)
 for i in range(len(pinDB)):
 GPIO.output(pinDB[i], (value >> i) & 0x01)

 GPIO.output(pinE,True)
 GPIO.output(pinE,False)

# ページの設定(縦アドレス0~7)
def setPage(value):
 command(0xb8 | (value & 0x07), False)

# カラムの設定(横アドレス0~63)
def setColumn(value):
 command(0x40 | (value & 0x3f), False)

# 8ビットのデータを書き込む
# 書込んだ後、カラムアドレスは自動的に次へ移動する
def writeData(value):
 command(value, True)

# ディスプレイのICチップを選択
def selectIC(value):
 # 1=左側ディスプレイのIC1チップ 2=右側ディスプレイのIC2チップ
 if(value == 1):
   GPIO.output(pinCS1, True)
   GPIO.output(pinCS2, False)
 else:
   GPIO.output(pinCS1, False)
   GPIO.output(pinCS2, True)

# 初期化
def init():
 GPIO.setwarnings(False)
 GPIO.setmode(GPIO.BCM)
 time.sleep(0.05)
 GPIO.setup(pinRS, GPIO.OUT)
 GPIO.setup(pinE, GPIO.OUT)
 GPIO.setup(pinCS1, GPIO.OUT)
 GPIO.setup(pinCS2, GPIO.OUT)
 for i in pinDB:
   GPIO.setup(i, GPIO.OUT)

 GPIO.output(pinRS, False)
 GPIO.output(pinE, False)
 GPIO.output(pinCS1, False)
 GPIO.output(pinCS2, False)
 for i in pinDB:
   GPIO.output(i, False)

 for i in [1, 2]:
   selectIC(i)
   command(0xc0, False) # Display start line コマンド
   command(0x3f, False) # Display On コマンド

# 画面クリア
def cls():
 for i in [1, 2]:
   selectIC(i)
 for j in range(9):
   setPage(j)
   setColumn(0)
 for k in range(65):
   writeData(0x00)

yoko = int(1128/8-30)
tate = 752
img = [[0 for x in range(yoko)] for y in range(tate)]
# BMPデータを取り込む
def readBMAP():
 f = open("k8x12L_jisx0208.bmp", "rb")

 # ヘッダースキップ
 c = f.read(62)

 # 配列に読み込み
 global img
 for y in range(tate):
   c = f.read(30) # 未使用部分スキップ
   for x in range(yoko):
     img[y][x] = ord(f.read(1))
   c = f.read(3) # 詰め物スキップ
 f.close()

# 画面に描画
lcdLine = 0
def dispEUC(c1,txt):
 difku = (ord(txt[0:1]) -0xA1) & 0xFF
 difb = difku+(difku>>1)
 difcd = ord(txt[1:2]) -0xA1
 difcd *= 8
 c = c1 - 1
 selectIC(((c&0x8)>>3)+1)
 setPage(lcdLine)
 setColumn(8*(c&0x7))
 for y in range(8):
   bb1 = img[tate-1-difcd-y][yoko-2-difb]
   bb2 = img[tate-1-difcd-y][yoko-1-difb]
   bb = ((bb1<<8) | bb2) >> 4
   writeData(~(bb & 0xFF) if (difku%2==1) else ~bb2)
 setPage(lcdLine+1)
 setColumn(8*(c&0x7))
 for y in range(8):
   bb1 = img[tate-1-difcd-y][yoko-2-difb]
   writeData(~(((bb1>>4) if (difku%2==1) else bb1) | 0xF0))

# 文字列の入力と変換
def inputUTF():
 strg=raw_input(' 文字列を入力してください=> ')
 reptEUC(strg)
def reptEUC(txt):
 global lcdLine
 strg=txt.decode('utf-8').encode('euc-jp')
 skip=0
 c=0
 for i in range(len(strg)):
   if (skip==1):
     skip=0
     continue
   if(((c%16)==0) & (c>0)):
     lcdLine+=2
   code=ord(strg[i:i+1]) & 0xFF
   if (code<0x2F):
     if (code==0):
       break
     else:
       continue
   c+=1
   if (code<0x7F):
     if (code==0x5C):
       lcdLine+=2
       c=0
       skip=1
       continue
     dispEUC(c,chr(0xA3)+chr(code|0x80))
     continue
   dispEUC(c,strg[i:i+2])
   skip=1

pinRS = 14
pinE = 15
pinCS1 = 17
pinCS2 = 18

pinDB = 8 * [0]
pinDB[0] = 7
pinDB[1] = 8
pinDB[2] = 9
pinDB[3] = 10
pinDB[4] = 11
pinDB[5] = 22
pinDB[6] = 23
pinDB[7] = 24

param = sys.argv
init()
cls()
readBMAP()
if (len(param)<2):
 inputUTF()
else:
 reptEUC(param[1])
GPIO.cleanup()

$ sudo python kanji812.py ☆グラフィック液晶に日本語表示☆8×12のビットマップフォントを使用して16文字を4行表示にしています。とても読み易い感触です。

カテゴリー: RaspberryPi, つれづれ パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です