フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« Maker Faire Tokyo 2017に行ってきました | トップページ | 豊四季 Tiny BASIC for Arduino STM32、 V0.84に更新しました »

2017年8月 7日 (月)

豊四季 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行だけを行番号の振り直しする

  4)利用可能変数の追加
    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」カテゴリの記事

表示器制御関連」カテゴリの記事

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 豊四季 Tiny BASIC for Arduino STM32でOLED(SSD1306)の制御:

« Maker Faire Tokyo 2017に行ってきました | トップページ | 豊四季 Tiny BASIC for Arduino STM32、 V0.84に更新しました »