USB-IO LCD でユーザー定義文字を表示

「USB-IO LCD接続」で作成した『手作りUSB機器』に載っていた USB-IO 液晶表示機に
ユーザー定義文字を表示する Ruby スクリプトを書いた。
ユーザー定義文字が表示されるのを確認した。
画像

動作環境



  • Windows XP
  • テクノキット 汎用USB-I/Oキット USBIOV8/K
  • 秋月のシリアル制御液晶表示モジュールキットについていたLCD
  • 26P フラットケーブル
  • USBケーブル(ストレート)
  • 「USB-IO LCD接続」で作成した LCD 接続用基板
  • 電源・グランド接続用ミノムシクリップ
  • ruby 1.8.6 mswin32
  • vbausbio.dll

準備


以下を用意しておく。

以下を実行しておく

  • ruby-1.8.6-i386-mswin32.zip の展開
  • 制御用のスクリプトを置くディレクトリに vbausbio.dll を置く
  • コマンドプロンプト(DOS窓)で制御用のスクリプトを置くディレクトリに移動(例: cd c:\tmp)

スクリプトの作成


「USB-IO LCD Rubyからの制御」で書いた ruby スクリプトを変更して、
ユーザー定義文字を表示させるスクリプトを書いた。

ユーザー定義文字のデータ書き込みを関数 data_out と兼用したため、
最初のうちうまく動かず少してこずってしまった。
そのため、1時間くらいかかってしまった。

require 'dl/import'

module USB_IO
extend DL::Importable
dlload "vbausbio.dll"
extern "long uio_out(long, long, long)"
end

class LCD
RS_BIT = 0x02
E_BIT = 0x01

def initialize
@p1_save = 0xff

@p1_save = (@p1_save & ~RS_BIT) | E_BIT
USB_IO.uio_out(1, @p1_save, 0)

USB_IO.uio_out(0, 0x30, 1)
#sleep(5)
sleep(0.005)
USB_IO.uio_out(0, 0x30, 1)
USB_IO.uio_out(0, 0x30, 1)
USB_IO.uio_out(0, 0x38, 1)
USB_IO.uio_out(0, 0x08, 1)
USB_IO.uio_out(0, 0x01, 1)
USB_IO.uio_out(0, 0x06, 1)
USB_IO.uio_out(0, 0x0e, 1)
end

def cmd_out(cmd)
if (@p1_save & RS_BIT) != 0
@p1_save = @p1_save & ~RS_BIT
USB_IO.uio_out(1, @p1_save, 0)
end
USB_IO.uio_out(0, cmd, 1)
end

def locate_xy(ypos, xpos)
pos = (ypos * 0x40 + xpos) & 0x7f
cmd_out(pos + 0x80)
end

def clear
cmd_out(0x01)
end

def cgram(adr)
cmd_out(0x40 | adr)
end

def ddram(adr)
cmd_out(0x80 | adr)
end

def set_font(ary)
ary.each do |x|
data_out(x.join.to_i(2), true)
end
end

def cg_out(data)
data_out(data, true)
end

def data_out(data, through = false)
if !through && data == 0x0c
clear
elsif !through && data < 0x20
locate_xy(1, 0)
else
if (@p1_save & RS_BIT) == 0
@p1_save = @p1_save | RS_BIT
USB_IO.uio_out(1, @p1_save, 0)
end
USB_IO.uio_out(0, data, 1)
end
end

def message_out(mes)
mes.each_byte {|c| data_out(c)}
end
end

lcd = LCD.new
lcd.cgram(0)
lcd.set_font(
[[1, 1, 1, 1, 1,],
[0, 1, 0, 1, 0,],
[0, 1, 0, 1, 0,],
[0, 1, 0, 1, 0,],
[0, 1, 0, 1, 0,],
[0, 1, 0, 1, 0,],
[1, 1, 1, 1, 1,],
[0, 0, 0, 0, 0,]])

#lcd.cgram(8)
lcd.set_font(
[[1, 1, 1, 1, 1,],
[1, 0, 0, 0, 1,],
[1, 0, 0, 0, 1,],
[1, 0, 0, 0, 1,],
[1, 0, 0, 0, 1,],
[1, 0, 0, 0, 1,],
[1, 1, 1, 1, 1,],
[0, 0, 0, 0, 0,]])

lcd.ddram(0)
lcd.cg_out(0)
lcd.cg_out(1)
lcd.cg_out(2)
lcd.message_out("A")

追加・変更した関数は以下の通り。

  • 関数 cgram で CG RAM のアドレス(ユーザー定義文字のアドレス)を設定する
  • 関数 ddram で DD RAM のアドレス(通常の LCD 表示領域のアドレス)を設定する
  • 関数 set_font でユーザー定義文字を設定する
  • 関数 cg_out で指定アドレスのユーザー定義文字を出力する
  • 関数 data_out は、ユーザー定義文字のデータを書き込めるよう変更

以下のように動作する。

  1. 「lcd = LCD.new」で、LCD の初期化を行う
  2. 「lcd.cgram(0)」で、ユーザー定義文字のアドレスを 0 に設定する。以降、DD RAM のアドレスを指定するまで、CG RAM 領域とのデータのやりとりとなる。
  3. 「lcd.set_font()」で、ユーザー定義文字のデータを書き込む。アドレス 0 に書き込まれる
  4. 「lcd.set_font()」で、ユーザー定義文字のデータを書き込む。次のアドレスに書き込まれる
  5. 「lcd.ddram(0)」で、DD RAM のアドレス(通常の LCD 表示領域のアドレス)を 0 に設定する
  6. 「lcd.cg_out(0)」で、ユーザ定義文字 0 を表示。今回は、Ⅱのような図形が表示される
  7. 「lcd.cg_out(1)」で、ユーザ定義文字 1 を表示。今回は四角のような図形が表示される
  8. 「lcd.cg_out(2)」で、ユーザ定義文字 2 を表示。今回はデータ未登録
  9. 「lcd.message_out("A")」で文字「A」を表示

動作確認


USB-IO と LCD 接続用基板を接続するフラットケーブルには電源とグランドが入っていない。
LCD 接続用基板の電源とグランドを USB-IO の電源とグランドに接続してから動作させた。

コマンドプロンプト(DOS窓)で以下のように実行する。

> D:\tmp\soft\ruby-1.8.6-i386-mswin32\bin\ruby.exe lcd20.rb

以下のように「Ⅱ」と四角とその後に「A」が表示された。
画像

気がついたことなど

  • プログラムを何度動作させても一度登録したユーザー定義文字は残ったままだった
  • LCD データシートを見る限り、0x00~0x07 と 0x08~0x0f番地は同じ文字となっているようだ。ということは、8文字定義できるということか?確認し忘れた。
  • ユーザー定義文字の初期値は不定?それとも全部「1」?「0」?
  • 一番下の段はカーソル表示領域だが、カーソルを使いたいなら 0 埋めにする必要がある
  • 5x8(7) という小さい領域では、気のきいた文字をデザインできなかった…

まとめ



  • USB-IO 液晶表示機にユーザー定義文字を表示する Ruby スクリプトを書き、ユーザー定義文字が表示されるのを確認した。
  • ユーザー定義文字が8文字使えるのか、16文字使えるのか確認し忘れた。

この記事へのコメント

この記事へのトラックバック