TG12864Bという128x64ドット表示の グラフィックLCDが遊んでいたので、 RasPiにつないで、門真なむ様公開の 8x12のフォントを使い、自由に 漢字表示するプログラムを作りました。
参考にしたのは、ここですが、
次の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行表示にしています。とても読み易い感触です。
美咲フォントのダウンロードと、bmp への変換が必要になりましたね。
https://littlelimit.net/k8x12.htm