何気なくaitendoを見ていたら、マイコンボードにちょうど良さげな表示器を見つけた。
aitendoで売ってるボードはたいていamazonでも売っているので調べたら、270円で売っていたのでAmazonで買った。今は2個で850円に値上がりしている。

TM1638はTitan Micro ElectronicsのLED表示用ICで、英語版のデータシートは(https://www.mikrocontroller.net/attachment/332035/TM1638_V1.3_EN.pdf)にある。
このICは7セグLED10桁の表示と、8x3のキー・マトリクスのスキャンができる。8279に似てると言ってわかるのはオジサンだろう。
インタフェースはSPIモドキ。 TM1638はSIとSOが分離していない(オープンドレイン)ので、SPIで接続するならMaster側のMOSIとMISOを接続して使う。出力が衝突する可能性があるのでMOSIに1kΩの抵抗を入れておく。

サンプルはたくさんある。特にarduino用のサンプルは検索するとたくさん見つかる。
Ichgojamでやってみた。 IchigojamはI2C用にオープンドレイン出力のOUT10(IN3)がある。これをDI/DOUTに使うと簡単だ。 STBとCLKはOUT1,OUT2でON/OFFする。
↓こんな感じ
1 REM TM1638
2 CLV: VIDEO 0
3 REM === ===
3 REM [0]-[7] :7SEG data:
3 REM [8] :LED data
3 REM [20]-[22] :key
3 REM [23]-[26] :key scan data
3 REM
3 REM === FONT ===
3 REM -- a dpgfe dcba dpgfe dcba dpgfe dcba dpgfe dcba
3 REM |f |b 0: 0011 1111 1: 0000 0110 2: 0101 1011 3: 0100 1111
3 REM -- g dpgfe dcba dpgfe dcba dpgfe dcba dpgfe dcba
3 REM |e |c 4: 0110 0110 5: 0110 1101 6: 0111 1101 7: 0000 0111
3 REM -- d .dp dpgfe dcba dpgfe dcba dpgfe dcba dpgfe dcba
3 REM 8: 0111 1111 9: 0110 1111 A: 0111 0111 B: 0111 1100
3 REM dpgfe dcba dpgfe dcba dpgfe dcba dpgfe dcba
3 REM C: 0011 1001 D: 0101 1110 E: 0111 1001 F: 0111 0001
3 LET [80],#3F,#06,#5B,#4F, #66,#6D,#7D,#07, #7F,#6F,#77,#7C, #C9,#5E,#79,#71
4 REM dpgfe dcba dpgfe dcba dpgfe dcba dpgfe dcba
4 REM H: 0111 0110 L: 0011 1000 G: 0011 1101 -: 0100 0000
4 LET [96],#76,#38,#3D,#40
5 D=3 :'Duty:1/16
6 'P=0 :'Position 0
7 'L=8 :'Length 8
100 REM === MAIN ===
120 REM I/O STB:1 CLK:2 DI:IN3/OUT10
120 OUT 1,1: OUT 2,1
130 GOSUB @DSPOFF
135 @SCRL
140 REM SCROOL
140 LET [0],0,0,0,[96],[94],[97],[97],[80] :'"HELLO"
150 @LOOP1
160 GOSUB @GETKEY: [8]=[20]
170 'PRINT BIN$([20],8);:FOR I=0 TO 7:?CHR$(8);:NEXT
180 N=N+1:
190 IF [20]=#81 THEN GOSUB @DSPNUM: GOTO @SCRL
200 'ELSE
210 P=0: L=8: GOSUB @DSP7SEG
220 W=[0]
230 FOR I=0 TO 6
240 [I]=[I+1]
250 NEXT
260 [7]=W
270 GOTO @LOOP1
500 REM Disp number
500 REM N:number
500 REM W:work Y:counter
500 @DSPNUM
510 W=N: LET[0],0,0,0
520 FOR Y=7 TO 3 STEP -1
530 IF W=0 THEN [Y]=0
540 [Y]=[80+W%10]: W=W/10
550 NEXT
560 P=3: L=5: GOSUB @DSP7SEG
570 RETURN
600 REM KeyScan
600 REM Command=#42:Rread key-scan data
600 REM [20]:K1 [21]:K2 [22]:K3 [23]-[26] scan data
600 REM S:SendData R:RecvData Y:counter
600 @GETKEY
610 S=#42: GOSUB @SENDC
620 FOR Y=23 TO 26
630 GOSUB @RECV
640 [Y] = R
650 NEXT
660 OUT 1,1 :'STB off
670 LET [20],0,0,0:
680 FOR Y=0 TO 3
690 [20]=[20]|([Y+23])>>Y
700 NEXT
720 RETURN
800 REM DISP OFF
800 REM S:Send data #80=Command:Display Off
800 @DSPOFF
810 S=#80+D: GOSUB @SENDC: OUT 1,1
820 RETURN
900 REM DISP 7SEG (address add mode)
900 REM D: Dimmer 0-7 #80:Disp OFF
900 REM P: Position
900 REM L: Length
900 REM [0]-[7]: 7SEGx8, [8]:LEDx8
900 @DSP7SEG
910 S=#40:GOSUB @SENDC :OUT 1,1 :'#40: write register | auto increment
920 S=#C0+P*2: GOSUB @SENDC :'address
930 FOR I=0 TO (L-1)
940 S=[P+I]: GOSUB @SENDD :'7SEG
950 S=([8]>>I)&1: GOSUB @SENDD:'LED
960 NEXT
970 OUT 1,1 :'STB off
980 @DSPON: S=#88 | D: GOSUB @SENDC: OUT 1,1 :'88H:disp on
990 RETURN
1000 REM R:Recv data
1000 @RECV
1010 OUT 10,-1 :'OUT10->IN3
1020 FOR X=1 TO 8
1030 OUT 2,0 :'OUT2:CLK
1040 R = R<<1: R=R+IN(3) :'IN3, DI
1050 OUT 2,1 :'OUT2:CLK
1060 NEXT
1070 RETURN
1100 REM S: Send data
1100 REM need STB ON
1100 @SENDC :'send command
1110 OUT 1,0 :'STB on
1120 @SENDD :'send data
1130 FOR X=1 TO 8
1140 OUT 2,0 :'OUT2:CLK
1150 OUT 10, S&1 :'OUT3:DIO
1160 OUT 2,1 :'OUT2:CLK
1170 S = S>>1
1180 NEXT
1190 RETURN
|
↑間違っていたので修正(2018/4/11) >(690 [20]=[20]|([Y+23]X)>>Y)
↑これでは1024バイトに収まらないので、省略形の命令に変えて、スペースを取って、マルチステートメントに変える。↓
10 ' TM1638
20 CLV:VIDEO 0
30 LET[80],#3F,#06,#5B,#4F,#66,#6D,#7D,#07,#7F,#6F,#77,#7C,#C9,#5E,#79,#71
40 LET[96],#76,#38,#3D,#40:D=3:OUT 1,1:OUT 2,1:GSB @DSPOFF
50 @SCRL:LET[0],0,0,0,[96],[94],[97],[97],[80]
60 @LOOP1:GSB @GETKEY:[8]=[20]:N=N+1:IF[20]=#81 GSB @DSPNUM:GOTO @SCRL
70 P=0:L=8:GSB @DSP7SEG:W=[0]:FOR I=0 TO 6:[I]=[I+1]:NEXT:[7]=W:GOTO @LOOP1
80 @DSPNUM:W=N:LET[0],0,0,0:FOR Y=7 TO 3 STEP-1:IF W=0[Y]=0
90 [Y]=[80+W%10]:W=W/10:NEXT:P=3:L=5:GSB @DSP7SEG:RTN
100 @GETKEY:S=#42:GSB @SENDC:FOR Y=23 TO 26:GSB @RECV:[Y]=R:NEXT:OUT 1,1
110 LET[20],0,0,0:FOR Y=0 TO 3:[20]=[20]|([Y+23]X)>>Y:NEXT:RTN
120 @DSPOFF:S=#80+D:GSB @SENDC:OUT 1,1:RTN
130 @DSP7SEG:S=#40:GSB @SENDC:OUT 1,1:S=#C0+P*2:GSB @SENDC:FOR I=0 TO(L-1):S=[P+I]
140 GSB @SENDD:S=([8]>>I)&1:GSB @SENDD:NEXT:OUT 1,1
150 @DSPON:S=#88|D:GSB @SENDC:OUT 1,1:RTN
160 @RECV:OUT 10,-1:FOR X=1 TO 8:OUT 2,0:R=R<<1:R=R+IN(3):OUT 2,1:NEXT:RTN
170 @SENDC:OUT 1,0
180 @SENDD:FOR X=1 TO 8:OUT 2,0:OUT 10,S&1:OUT 2,1:S=S>>1:NEXT:RTN
|
↑間違っていたので修正(2018/4/11) (110 LET[20],0,0,0:FOR Y=0 TO 3:[20]=[20]|([Y+23]X)>>Y:NEXT:RTN)
↓動かしたところ

ダウンロード TM1638.mp4 (1058.8K)
さすがに遅い。 ソフトでCLKをON/OFFしているのが原因だ。
もう少し早くなりそうだが。
【最近の投稿】【最近のCPUボード】【最近のIchigoJam】【2017の投稿】【2016の投稿】【2015の投稿】
当方、N88basic,TK80世代です。最近は、arduino,esp32,raspi等で遊んでいます。
定年後の最近は、特にrasppi-picoをいじっている中で、micropythonのportを色々な
boardで動かしていましたが、何かの拍子にpicomateなるBASICを見つけました。
Basic世代の懐かしさもあり、久しぶりにBASICに取り組んでみましたが、TM1638は
サポートされていないので、カスタムコントロールを検討していて、貴方の記事を見つけ
ました。久しぶりのことでBASIC文法のおさらいからですが、何とか移植出来ました。
ありがとうございます。CPU の性能が高く、速度的にも問題なさそうです。
電子工作の各種デバイスもサポートされていてなかなかの優れモノだと思います。
エディタ、専用コンソールが使えて、しばらく楽しめそうです。
投稿: H.yoshi(同じYoshiですね!短縮ですけど) | 2022年7月19日 (火) 21時41分
H.yoshiさんコメントありがとうございます。
お役に立てて何よりです。
昔のCPUは低速・小容量メモリだったので、テクニックを駆使していましたが、今時のCPUは高速・大容量メモリになったので、素直に書いてもそこそこ動きますね。
定年後は工作三昧と考えていたのですが再就職して、買ったままのボードやCPUが増えています。++)Raspberry Pi Picoも...
picomateに載っているMMBasicはかなり強力そうですね。
投稿: Yoshi | 2022年7月20日 (水) 00時13分