Propeller始めました(9) I2Cデバイスを利用する
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言語は超マイナー(プロペラ以外の使い道無し)ですが、
使いやすい言語です。
« Propeller始めました(8) スピーカーで音を出してみる | トップページ | Propeller始めました(10) ビデオ出力で日本語表示 »
「Propeller」カテゴリの記事
- プロペラ2の評価ボード(2019.03.12)
- プロペラでVT100端末の実装(2018.07.25)
- Propeller始めました(22) ポータブルゲーム機の実装 7(2016.02.19)
- Propeller始めました(21) ポータブルゲーム機の実装 6(2016.02.17)
- SPI接続のカラー液晶モジュールの動作確認(2016.02.14)
« Propeller始めました(8) スピーカーで音を出してみる | トップページ | Propeller始めました(10) ビデオ出力で日本語表示 »
コメント