#LCDモジュールサンプルソース
#I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)ピッチ変換キット接続サンプル
#http://akizukidenshi.com/catalog/g/gK-08896/
# enzi <=> LCD
# 5V <=> V+
# SCL (右上) <=> SCL
# SDA (右上) <=> SDA
# GND <=> GND
#ST7032i
class I2CDisplay
LCD_ADRS = 0x3E
ROW_MAX = 2
COL_MAX = 16
BLANK_CHAR = 0x20
MOJI_TABLE = [
#["®",14],["©",15],
["§",18],["Δ",21],["θ",22],["Σ",26],["Ω",30],["α",31],
[" ",32],["!",33],["\"",34],["#",35],["$",36],["%",37],["&",38],["'",39],["(",40],[")",41],["*",42],["+",43],[",",44],["-",45],[".",46],["/",47],
["0",48],["1",49],["2",50],["3",51],["4",52],["5",53],["6",54],["7",55],["8",56],["9",57],[":",58],[";",59],["<",60],["=",61],[">",62],["?",63],
["@",64],["A",65],["B",66],["C",67],["D",68],["E",69],["F",70],["G",71],["H",72],["I",73],["J",74],["K",75],["L",76],["M",77],["N",78],["O",79],
["P",80],["W",81],["R",82],["S",83],["T",84],["U",85],["V",86],["W",87],["X",88],["Y",89],["Z",90],["[",91],["\\",92],["]",93],["^",94],["_",95],
["a",97],["b",98],["c",99],["d",100],["e",101],["f",102],["g",103],["h",104],["i",105],["j",106],["k",107],["l",108],["m",109],["n",110],["o",111],
["p",112],["w",113],["r",114],["s",115],["t",116],["u",117],["v",118],["w",119],["x",120],["y",121],["z",122],["{",123],["|",124],["}",125],["→",126],["←",127],
["。",161],["「",162],["」",163],["、",164],["・",165],["ヲ",166],["ァ",167],["ィ",168],["ゥ",169],["ェ",170],["ォ",171],["ャ",172],["ュ",173],["ョ",174],["ッ",175],
["ー",176],["ア",177],["イ",178],["ウ",179],["エ",180],["オ",181],["カ",182],["キ",183],["ク",184],["ケ",185],["コ",186],["サ",187],["シ",188],["ス",189],["セ",190],["ソ",191],
["タ",192],["チ",193],["ツ",194],["テ",195],["ト",196],["ナ",197],["ニ",198],["ヌ",199],["ネ",200],["ノ",201],["ハ",202],["ヒ",203],["フ",204],["ヘ",205],["ホ",206],["マ",207],
["ミ",208],["ム",209],["メ",210],["モ",211],["ヤ",212],["ユ",213],["ヨ",214],["ラ",215],["リ",216],["ル",217],["レ",218],["ロ",219],["ワ",220],["ン",221],["゛",222],["゜",223],
["×",247],["÷",248],["≦",249],["≧",250],["≪",251],["≫",252],["≠",253],["√",254],[" ̄",255],
]
def initialize(wire, vdd = :VDD_5V)
raise TypeError unless wire.is_a? Wire
@wire = wire
@moji = Array.new(ROW_MAX) do
Array.new(COL_MAX) do
BLANK_CHAR
end
end
@vdd = vdd
init_lcd
end
def setChar(row, col, char)
raise TypeError unless row.is_a? Integer
raise TypeError unless col.is_a? Integer
raise TypeError unless char.is_a? Integer
raise ArgumentError unless row >= 0 && row < ROW_MAX
raise ArgumentError unless col >= 0 && col < COL_MAX
raise ArgumentError unless char >= 0x00 && char <= 0xFF
@moji[row][col] = char
end
def bufferWrite
writeCommand(0x80)
@moji[0].each do |c|
writeData(c.to_i)
end
writeCommand(0x40 + 0x80)
@moji[1].each do |c|
writeData(c.to_i)
end
end
def clear
@moji.each do |line|
line.map! do |char|
0x20
end
end
end
def text=(text)
clear
setText(text)
end
def setText(text, row = 0, col = 0)
mbc = ""
text.each_char do |c|
mbc << c
code = convChar(mbc)
if code != -1
setChar(row, col, code)
elsif c == "\n"
col = COL_MAX - 1
else
next
end
mbc = ""
col += 1
if col >= COL_MAX
col = 0
row += 1
end
end
end
def writeData(data)
@wire.beginTransmission(LCD_ADRS)
@wire.write(0x40)
@wire.write(data)
@wire.endTransmission
delay(1)
end
def writeCommand(command)
@wire.beginTransmission(LCD_ADRS)
@wire.write(0x00)
@wire.write(command)
@wire.endTransmission
delay(10)
end
def init_lcd
delay(100)
writeCommand(0x38)
delay(20)
writeCommand(0x39)
delay(20)
writeCommand(0x14)
delay(20)
writeCommand(0x73)
delay(20)
if @vdd == :VDD_5V
#5V用
writeCommand(0x52)
elsif @vdd == :VDD_3_3V
#3.3V用
writeCommand(0x56)
end
delay(20)
writeCommand(0x6C)
delay(20)
writeCommand(0x38)
delay(20)
writeCommand(0x01)
delay(20)
writeCommand(0x0C)
delay(20)
end
def convChar(char)
MOJI_TABLE.each do |item|
if item[0] == char
return item[1]
end
end
return -1
end
end
#initialization
wire = Wire.new(0x00, Wire::DutyCycle_2)
lcd = I2CDisplay.new(wire, :VDD_5V)
loop do
#テスト表示
0.upto(15) do |i|
lcd.setChar(0, i, 0x41 + i)
lcd.setChar(1, i, 0xb1 + i)
end
lcd.bufferWrite
sleep(5)
#
lcd.setText "Effect LCD TEST", 0, 0
lcd.setText "2016/07/13Ver000", 1, 0
lcd.setChar(0, 6, 0x0F) #マルシー出力
lcd.bufferWrite
sleep(5)
#
lcd.text = "effect エフェクト"
lcd.bufferWrite
sleep(5)
#すべて消去
lcd.clear
lcd.bufferWrite
sleep(5)
end