Propeller搭載 QuickStartボードを使って初めてのI2Cを使ってみました。
IcihgoJam用に製作したHT16K33を使った8x16LEDマトリックモジュールを繋げてみました。
Propeller用のI2Cライブラリはいくつかありますが、今回はSpin言語のみで実装している
Basic_I2C_Driverを使ってみました。
プログラムは下記の通りです。
{{ File: LED_Matrix.spin
8x16LEDマトリック表示制御 by たま吉さん 2015/11/28
I2C接続LEDドライバHT16K33を使った8x16のLEDマトリックスを制御する
}}
CON
{システムクロック設定 5Hhz×16=80Mhz}
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000
{HT16K33 利用ピン,アドレス}
SCL_PIN = 5 'I2C SCLピン
SDA_PIN = 6 'I2C SDAピン
I2CADR = $70<<1 'HT16K33のアドレス(8ビットアドレス)
{HT16K33 コマンド}
HT_CMS_DATA = $00 'データ送信
HT_CMD_SYSSET = $20 'システムセットアップ
HT_CMD_BLINK = $80 '点滅表示周期の設定
HT_CMD_BRIGHTNESS = $E0 '明るさの設定
{HT16K33 レジスタ設定値}
HT_SYSSET_OSC_ON = 1
{HT16K33 点滅表示周期 設定値}
HT_BLINK_OFF = %00000000
HT_BLINK_DISPLAY_ON = %00000001
HT_BLINK_2HZ = %00000010
HT_BLINK_1HZ = %00000100
HT_BLINK_05HZ = %00000110
VAR
word buf[8] 'HT16K33 表示パターンバッファ 横16ドットx縦8ドット
byte str[16]
OBJ
i2c : "Basic_I2C_Driver_1"
debug : "Parallax Serial Terminal"
f : "Float32.spin"
{メイン処理}
PUB main | i,x,y,d,f_rd, f_x, f_y,f_dv,f_dx
debug.Start (115200)
i2c.Initialize(SCL_PIN)
f.start
ht_clear
ht_init
repeat
repeat i from 0 to 7
ht_clear_buffer
ht_write_at(@msg_saitama[0], i-7, 0)
ht_write_at(@msg_saitama[8], 15-i, 0)
ht_update
waitcnt(clkfreq/1000 * 100 + cnt)
waitcnt(clkfreq/1000 * 500 + cnt)
repeat i from 0 to 7
ht_clear_buffer
ht_write_at(@msg_saitama[0], 0, -i)
ht_write_at(@msg_saitama[8], 8, i)
ht_update
waitcnt(clkfreq/1000 * 100 + cnt)
waitcnt(clkfreq/1000 * 2000 + cnt)
f_rd := 0
f_x := 0.0
f_dv := f.FDiv (PI, 5.0)
f_dx := f.FDiv (16.0, 80.0)
'repeat
repeat 2
f_rd := 0.0
f_x := 0.0
repeat i from 0 to 80
f_x := f.FAdd (f_x, f_dx)
f_y := f.FAdd (f.FMul (f.Cos (f_rd), 8.0), 8.0)
ht_clear_buffer
ht_write_at(@msg_saitama[0], f.FTrunc (f_x) , f.FTrunc (f_y))
ht_update
waitcnt(clkfreq/1000 * 100 + cnt)
f_rd := f.FAdd (f_rd, f_dv)
waitcnt(clkfreq/1000 * 500 + cnt)
d := 1
repeat 2
repeat y from 0 to 7
repeat x from 0 to 15
ht_set_dot(x, y, d)
ht_update
waitcnt(clkfreq/1000 * 20 + cnt)
d:= !d & 1
{HT16K33 初期化}
PUB ht_init
ht_cmd(HT_CMD_SYSSET, HT_SYSSET_OSC_ON) 'システムオシレータをONにする
ht_cmd(HT_CMD_BLINK, HT_BLINK_DISPLAY_ON | HT_BLINK_OFF) '点滅表示周期の設定
ht_cmd(HT_CMD_BRIGHTNESS, 0) '明るさの設定
{HT16K33 コマンド送信}
PUB ht_cmd(cmd, prm)
i2c.Start(SCL_PIN)
i2c.Write(SCL_PIN, I2CADR)
i2c.Write(SCL_PIN, cmd|prm)
i2c.Stop(SCL_PIN)
{表示パターンの送信}
PUB ht_update | i
i2c.Start(SCL_PIN)
i2c.Write(SCL_PIN, I2CADR)
i2c.Write(SCL_PIN, HT_CMS_DATA)
{16バイト分パターンデータ送信}
repeat i from 0 to 7
i2c.Write(SCL_PIN, buf[i]& $FF)
i2c.Write(SCL_PIN, buf[i]>>8)
i2c.Stop(SCL_PIN)
{バッファクリア}
PUB ht_clear_buffer | i
wordfill(@buf, 0, 8)
{表示のクリア}
PUB ht_clear
ht_clear_buffer
ht_update
{バッファの指定座標のON/OFF}
PUB ht_set_dot(x, y, d)
if d
buf[y] |= $80_00 >>x
else
buf[y] &= !($80_00 >>x)
{バッファ上の指定座標に8x8パターンをセット(負座標指定可能)}
PUB ht_write_at(fptr, x, y) | i
if (x > 15) or (y > 7) or (x < -7) or (y < -7)
return
repeat i from 0 to 7
if i + y => 0 and i + y < 8
if x =< 8
buf[i + y] |= byte[fptr][i]<<(8 - x)
else
buf[i + y] |= byte[fptr][i]>>(x-8)
DAT
msg_saitama byte $08,$08,$7E,$04,$24,$40,$3C,$00 'さ
byte $00,$88,$84,$82,$82,$50,$20,$00 'い
byte $20,$F0,$2E,$40,$48,$50,$8E,$00 'た
byte $08,$7E,$08,$7E,$08,$7C,$7A,$00 'ま
Spin言語は超マイナー(プロペラ以外の使い道無し)ですが、
使いやすい言語です。
最近のコメント