#
# matrixled.rb - Matrix LED Demonstration
#
# --- Pin layout of OSL641501-ARA ---
# 13 3 4 10 6 11 15 16 < Anode (Pullup 100Ω)
# 9 o o o o o o o o
# 14 o o o o o o o o
# 8 o o o o o o o o
# 12 o o o o o o o o
# 1 o o o o o o o o
# 7 o o o o o o o o
# 2 o o o o o o o o
# 5 o o o o o o o o
# ^
# Cathode
#
# --- GPIO pin assign ---
# <Anode> <Cathode>
# Pin : GPIO Pin : GPIO
# 13 : A2 9 : D9
# 3 : D2 14 : A3
# 4 : D3 8 : D7
# 10 : D8 12 : A1
# 6 : D5 1 : D0
# 11 : A0 7 : D6
# 15 : A4 2 : D1
# 16 : A5 5 : D4
#
ROWS = 8
COLS = 8
# initialize GPIO pins
da = [A2,D2,D3,D8,D5,A0,A4,A5].map {|p| DigitalIO.new(p, OUTPUT)} # anode
dc = [D9,A3,D7,A1,D0,D6,D1,D4].map {|p| DigitalIO.new(p, OUTPUT)} # cathode
da.each {|d| d.low} # set anode to LOW
dc.each {|d| d.high} # set cathode to HIGH
# Dot matrix image 'We ♥ mruby!! '
vram = [
[1,0,0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,0, 0,0,0,0,0,0,0,0],
[1,0,0,0,0,0,1,0, 0,0,0,0,0,0, 0,1,1,0,1,1,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,0, 0,0,0,0,0,0,0,0],
[0,1,0,1,0,1,0,0, 0,1,1,1,0,0, 1,1,1,1,1,1,1,0, 1,0,1,1,0,1,1,0, 0,1,0,1,1,1,0, 1,0,0,0,1,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 1,0,1,0, 0,0,0,0,0,0,0,0],
[0,1,0,1,0,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,1,1,0, 0,1,0,0,1,0,0,1, 0,1,1,0,0,0,0, 1,0,0,0,1,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,1,0, 0,0,0,0,0,0,0,0],
[0,1,0,1,0,1,0,0, 1,1,1,1,0,0, 0,1,1,1,1,1,0,0, 0,1,0,0,1,0,0,1, 0,1,0,0,0,0,0, 1,0,0,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0, 0,0,0,0,0,0,0,0],
[0,0,1,0,1,0,0,0, 1,0,0,0,0,0, 0,0,1,1,1,0,0,0, 0,1,0,0,1,0,0,1, 0,1,0,0,0,0,0, 1,0,0,0,1,0,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0, 0,0,0,0,0,0,0,0],
[0,0,1,0,1,0,0,0, 0,1,1,1,1,0, 0,0,0,1,0,0,0,0, 0,1,0,0,1,0,0,1, 0,1,0,0,0,0,0, 0,1,1,1,0,1,0, 1,1,1,1,0,0, 0,0,0,0,1,0, 1,0,1,0, 0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0]
]
DISPTIME = 10
while true
# show VRAM image
DISPTIME.times {|t|
ROWS.times {|y|
# setup 1 line output values
COLS.times {|x| da[x].write(vram[y][x])}
# LED (1 line) turn on -> wait -> turn off
dc[y].low
delay 1
dc[y].high
}
}
# scroll VRAM
ROWS.times {|y| vram[y] << vram[y].shift}
end