豊四季 Tiny BASIC for Arduino STM32でOLED(SSD1306)の制御
豊四季 Tiny BASIC for Arduino STM32をつかった
OLED(SSD1306)ディスプレイの制御です。I2Cにて接続しています。
以前V0.83用に作成したものを、V0.84でも問題なく動くかの動作確認を行いました。
このOLED、横向きに文字を表示するにはフォント回転が必要です。
その回転もBASICでは苦しいかと思ましたが、問題なくリアルタイム表示出来ました。
プログラムソースは、ちょっと長めです。
https://gist.github.com/Tamakichi/36896640d6e8ac94e618f78f9a5bddd8
1 'SSD1306_2(PB6=SCL,PB7=SDA) 10 M=MEM:A=$3C:CLS 20 GOSUB "@INIT":GOSUB "@CLS" 30 X=0:Y=0:C=ASC("A"):GOSUB "@OUT(X,Y,C)" 40 X=1:Y=1:C=ASC("B"):GOSUB "@OUT(X,Y,C)" 50 X=2:Y=2:C=ASC("C"):GOSUB "@OUT(X,Y,C)" 60 X=0:Y=5:S="Hello Tiny BASIC":GOSUB "@PRN(X,Y,S)" 70 'WAIT 2000 80 'GOSUB "@CLS" 90 GETTIME E,F,G 100 LOCATE 0,0:?#-2,E;":";F;":";G 110 X=0:Y=7 120 FOR b=0 TO 7 130 C=VPEEK(X,0) 140 GOSUB "@OUT(X,Y,C)" 150 X=X+1 160 NEXT b 170 WAIT 1000 180 GOTO 90 190 END 5000 "@INIT" 5010 POKE M,$00,$B0,$21,$00,$7F,$40,$80 5020 POKE M+7,$AE,$A8,$3F,$D3,$00,$40,$A1,$C8 5030 POKE M+15,$DA,$12,$81,$FF,$A4,$A6,$D5,$80 5040 POKE M+23,$2E,$20,$10,$21,$00,$7F,$22,$00 5050 POKE M+31,$07,$8D,$14,$AF 5060 FOR I=0 TO 27:R=I2CW(A,M,1,M+7+I,1):NEXT I 5070 RETURN 5080 "@OUT(X,Y,C)" 5090 POKE M+3,X*8:POKE M+1,Y|$B0 5100 GOSUB "@ROTATE(C)" 5110 R=I2CW(A,M,1,M+1,4) 5120 R=I2CW(A,M+5,1,M+50,8) 5130 RETURN 5140 "@CLS" 5150 POKE M+3,0:POKE M+1,0|$B0 5160 R=I2CW(A,M,1,M+1,4) 5170 FOR I=0 TO 127 5180 R=I2CW(A,M+5,1,FNT,8) 5190 NEXT I 5200 RETURN 5210 "@PRN(X,Y,S)" 5220 L=LEN(S) 5230 FOR I=1 TO L 5240 C=ASC(S,I) 5250 GOSUB "@OUT(X,Y,C)" 5260 X=X+1:IF X>15 X=0:Y=Y+1 5270 NEXT I 5280 RETURN 5290 "@ROTATE(C)" 5300 F=FNT+C*8 5310 FOR J=0 TO 7 5320 D=0 5330 FOR K=7 TO 0 STEP -1 5340 D=D+((PEEK(F+K)>>(7-J))&1)<<K 5350 NEXT K 5360 POKE (M+50+J),D 5370 NEXT J 5380 RETURN
5000~5380行はサブルーチンです。
ラベル指定呼び出しで5つのサブルーチンを定義しています。
・"@INIT"
OLEDモジュールの初期設定を行うサブルーチンです。
・"@CLS"
OLEDの画面の表示を全消去します。
・"@OUT(X,Y,C)"
指定した座標に文字を表示します。
変数Xに横座標、Yに縦座標、Cに文字コードを指定します。
・"@PRN(X,Y,C)"
指定した座標に文字列を表示します。
変数Xに横座標、Yに縦座標、Sに文字列を指定します。
・"@ROTATE(C)"
"@OUT(X,Y,C)"から利用されるサブルーチンです。
指定した文字コードのフォントデータを回転してメモリに格納します。
10~190行がメインルーチンです。
サブルーチンを利用して文字、文字列、時刻の表示を行っています。
プログラムがちょと長いですねぇ
長いとNTSCのビデオ出力画面でのプログラム作成は辛いです。
テキストエディタで作成して転送になっちゃいますね。
そこで、 V0.84(現在動作確認中)では長いプログラムを作成しやすくするために、
次の機能を盛り込みました。
1)プログラム編集機能の改善
・ターミナル上で最大横128文字x縦50行のスクリーン編集をサポート
・プログラムソースの上下スクリール表示
2)プログラムソースの部分保存・読み込み
例:上記ソース5000行~5380行(サブルーチン部)だけを保存・読み込みする
3)RENUMコマンドで範囲指定の番号振り直し対応
例; 上記ソースの10行~190行だけを行番号の振り直しする
A~Zではちょと足りないので、A0、A1のように数字を付けた変数名もOK
色々と長いプログラム作成の改善方法を模索したのですが、
幾つか長いプログラムを作成してみると、
「行番号付けるのうざい、行番号要らなくねぇ?」
と、感じる今日この頃です。
行番号廃止
これが一番の改善策と思えてきました。
行番号が無ければ、番号の振り直しとか不要ですし...
行番号の付け間違えで、行が消えたり等弊害もあります。
たしか、BASICの親戚(親?)のFORTRANは必要な時だけ(GOTOの飛び先)、
行番号を付けていたはずです。
行番号ではなく、単に行(先頭からの行の連番)だけでもイケないだろうか模索中です。
何れは、号番号廃止したいなぁと思っています。
また、引数を伴うサブルーチン呼び出しも
CALL "@PRN", X,Y,S
みたいな呼び出しと
SUB "@PRN" X0,Y0,S0
・・・
RETURN
みたいなサブールーチンの定義にしたいです。
« Maker Faire Tokyo 2017に行ってきました | トップページ | 豊四季 Tiny BASIC for Arduino STM32、 V0.84に更新しました »
「arduino」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
「表示器制御関連」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる(2024.03.14)
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
「ARM」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- PocketGoで遊んでみる(1)(2020.03.24)
- Arduino用 MML文演奏ライブラリの作成 その1(2019.04.01)
- BluePillボードで4桁7セグLEDの制御(2019.03.21)
「STM32」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- 「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!(2021.03.26)
- SPI接続フラッシュメモリモジュールを入手しました(2020.05.13)
- Arduino STM32でキャラクタ液晶ディスプレイを使う(2019.06.01)
« Maker Faire Tokyo 2017に行ってきました | トップページ | 豊四季 Tiny BASIC for Arduino STM32、 V0.84に更新しました »
コメント