文字が縦向き表示が簡単ですが、ちょっと工夫すると横向き表示もできます。
HELP #000 CHAR #700 PCG #800 VAR #900 VRAM #C00 LIST
こちら、HELPコマンドで出てくる、IchigoJamのメモリマップ。フォントパターンが1文字あたり8byte、メモリの0番地から入っています(CHAR)。
前回は1文字分8byteをそのままをPCGの#700(16進数で700、10進数では1792番地)にコピーし、OLEDに送信していましたが、どちらかに90度回転させたデータにすることで横向き表示が可能です。
200 @LPUTC 210 FOR X=0 TO 7 220 N=0 230 FOR Y=0 TO 7 240 N=N+PEEK(C*8+Y)>>X&1<<(7-Y) 250 NEXT 260 POKE#700+X,N 270 NEXT 280 ?I2CW(60,64,#700,8) 290 RETURN
90度回転させるプログラムができました。前回のプログラムに加えてみましょう。
C=ASC("A"):GSB@LPUTC
Aと横向きにでました。
GSB@CLS:S="IchigoJam":FORI=0TOLEN(S)-1:X=3:Y=12-I:GSB@LC:C=ASC(S+I):GSB@LPUTC:NEXT
IchigoJamと表示されます!
下ように短くかいておくと、プログラム容量が節約できます。(200〜290行は消してOK)
150 @LPUTC:FORX=0TO7:N=0:FORY=0TO7:N=N+PEEK(C*8+Y)>>X&1<<(7-Y):NEXT:POKE#700+X,N:NEXT:?I2CW(60,64,#700,8):RTN
ひとつの文字を表示するために、8x8、64回ループしているので、ちょっとゆっくりな表示ですね。
マシン語で高速化してみましょう。
1 LET[0],#B5F0,#2307,#021B,#18C9,#2308,#4358,#1812,#2500,#2701,#2600,#2407,#2000,#5D93,#40EB,#403B,#40A3,#18C0,#3C01,#3601,#2E08,#D1F6,#5548,#3501,#2D08,#D1EF,#BDF0 150 @LPUTC:?USR(#800,C):?I2CW(60,64,#700,8):RTN
配列の領域を使ってマシン語をいれておき、これを使ったサブルーチン@LPUTCに置き換えています。
asm15 assembly表記のArmマシン語はこんな感じです。
PUSH {LR,R4,R5,R6,R7} R3=7 R3=R3<<8 R1=R1+R3 R3=8 R0*=R3 R2=R2+R0 R5=0 'X R7=1 '1 @LOOP1 R6=0 'Y R4=7 '7-Y R0=0 'N @LOOP2 R3=[R2+R6] R3>>=R5 R3&=R7 R3<<=R4 R0=R0+R3 R4-=1 R6+=1 R6-8 IF !0 GOTO @LOOP2 [R1+R5]=R0 R5+=1 R5-8 IF !0 GOTO @LOOP1 POP {PC,R4,R5,R6,R7}
asm15、配列への代入形式、"bas (array hex)" を追加しました。
「ボクにもわかる IchigoJam用 I2C 有機ELディスプレイ OLED の接続方法」
こちらにまとめて転送することでもっと高速化する方法や、楽しいサンプルが紹介されていますので、合わせてどうぞ!