「8x8ドットマトリクスディスプレイの接続方法」のディスプレイですが、その仕組み上、ダイナミックに点灯させる必要があります。本来ならデコーダとか使うのでしょうけど、手元にICがありません。仕方なくポートで制御します。C/A-3880EGは、24ピンもありますので、ATtiny2313のポート数では足りません。2色表示は諦めます。
それぞれの端折ったピン配&接続図です。
ATtiny2313 +-----------+ -|1 20|- VCC 23 <--- PD0 -|2 19|- PB7 ---> 22 20 <--- PD1 -|3 18|- PB6 ---> 19 17 <--- PA1 -|4 17|- PB5 ---> 16 14 <--- PA0 -|5 16|- PB4 ---> 13 11 <--- PD2 -|6 15|- PB3 ---> 3 8 <--- PD3 -|7 14|- PB2 ---> 6 5 <--- PD4 -|8 13|- PB1 ---> 9 2 <--- PD5 -|9 12|- PB0 ---> 12 GND -|10 11|- +-----------+ A-3880EG +---------------------------+ COL5-b -|1 24|- COL1-b COL5-a -|2 23|- COL1-a ROW5 -|3 22|- ROW1 COL6-b -|4 21|- COL2-b COL6-a -|5 20|- COL2-a ROW6 -|6 19|- ROW2 COL7-b -|7 18|- COL3-b COL7-a -|8 17|- COL3-a ROW7 -|9 16|- ROW3 COL8-b -|10 15|- COL4-b COL8-a -|11 14|- COL4-a ROW8 -|12 13|- ROW4 +---------------------------+
繋げるとこのようになります。
そしてプログラム。
1 #include <avr/io.h> 2 #include <util/delay.h> 3 4 void anode(int row) 5 { 6 int shift=8-row; 7 PORTB |= (1<<shift); 8 } 9 10 void cathnode(int col) 11 { 12 switch(col){ 13 case 1: PORTD &= ~0b00000001;break; 14 case 2: PORTD &= ~0b00000010;break; 15 case 3: PORTA &= ~0b00000010;break; 16 case 4: PORTA &= ~0b00000001;break; 17 case 5: PORTD &= ~0b00100000;break; 18 case 6: PORTD &= ~0b00010000;break; 19 case 7: PORTD &= ~0b00001000;break; 20 default: PORTD &= ~0b00000100;break; 21 } 22 } 23 24 void clear() 25 { 26 // anode_off 27 PORTB = 0b00000000; 28 29 // cathode_off 30 PORTD |= 0b00111111; 31 PORTA |= 0b00000011; 32 } 33 34 void set(int row,int col) 35 { 36 clear(); 37 38 anode(row); 39 cathnode(col); 40 } 41 42 int main() 43 { 44 int row,col; 45 DDRB = 0b11111111; //ATtiny2313 pin.12-19 PB0-7 OUT 46 DDRD = 0b00111111; //ATtiny2313 pin.2,3,6-9 PD0-5 OUT 47 DDRA = 0b00111111; //ATtiny2313 pin.4,5 PA0-1 OUT 48 49 while(1) 50 for(row=1;row<=8;row++) 51 for(col=1;col<=8;col++){ 52 set(row,col); 53 _delay_ms(20); 54 } 55 56 return 0; 57 }
非表示状態は、カソードをポートでHにして、アノードをLにしています。
表示するときに、カソードをポートでLにして、アノードをHにしています。
これが正しい制御方法かは知りませんが、とりあえず暗闇で怪しく光るようになりました。
ソースはいつものようにgithubに登録しています。
takk@deb83:~$ git clone https://github.com/takkete/bread.git Cloning into 'bread'... remote: Counting objects: 69, done. remote: Compressing objects: 100% (44/44), done. remote: Total 69 (delta 12), reused 0 (delta 0), pack-reused 17 Unpacking objects: 100% (69/69), done. Checking connectivity... done. takk@deb83:~$ cd bread/mcu/avr/attiny2313/device/a-3880eg/ takk@deb83:~/bread/mcu/avr/attiny2313/device/a-3880eg$ ls hello.c makefile takk@deb83:~/bread/mcu/avr/attiny2313/device/a-3880eg$
コメント