フォト
無料ブログはココログ

MyList

« 若松通商で買い物 | トップページ | されど愛しきお妻様 <知っていても理解できない> »

2018年4月 8日 (日)

IchigoJam(10) <LED&KEY>

 何気なくaitendoを見ていたら、マイコンボードにちょうど良さげな表示器を見つけた。

aitendoで売ってるボードはたいていamazonでも売っているので調べたら、270円で売っていたのでAmazonで買った。今は2個で850円に値上がりしている。

Ledkey

 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Ωの抵抗を入れておく。

Connect_spi

 サンプルはたくさんある。特に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

ダウンロード TM1638.mp4 (1058.8K)

 さすがに遅い。 ソフトでCLKをON/OFFしているのが原因だ。

 もう少し早くなりそうだが。



最近の投稿】【最近のCPUボード】【最近のIchigoJam】【2017の投稿】【2016の投稿】【2015の投稿

« 若松通商で買い物 | トップページ | されど愛しきお妻様 <知っていても理解できない> »

CPUボード」カテゴリの記事

IchigoJam」カテゴリの記事

プログラミング」カテゴリの記事

コメント

当方、N88basic,TK80世代です。最近は、arduino,esp32,raspi等で遊んでいます。
定年後の最近は、特にrasppi-picoをいじっている中で、micropythonのportを色々な
boardで動かしていましたが、何かの拍子にpicomateなるBASICを見つけました。
 Basic世代の懐かしさもあり、久しぶりにBASICに取り組んでみましたが、TM1638は
サポートされていないので、カスタムコントロールを検討していて、貴方の記事を見つけ
ました。久しぶりのことでBASIC文法のおさらいからですが、何とか移植出来ました。
 ありがとうございます。CPU の性能が高く、速度的にも問題なさそうです。
 電子工作の各種デバイスもサポートされていてなかなかの優れモノだと思います。
 エディタ、専用コンソールが使えて、しばらく楽しめそうです。

H.yoshiさんコメントありがとうございます。
お役に立てて何よりです。

昔のCPUは低速・小容量メモリだったので、テクニックを駆使していましたが、今時のCPUは高速・大容量メモリになったので、素直に書いてもそこそこ動きますね。

定年後は工作三昧と考えていたのですが再就職して、買ったままのボードやCPUが増えています。++)Raspberry Pi Picoも...
picomateに載っているMMBasicはかなり強力そうですね。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

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

トラックバック


この記事へのトラックバック一覧です: IchigoJam(10) <LED&KEY>:

« 若松通商で買い物 | トップページ | されど愛しきお妻様 <知っていても理解できない> »