ATtiny2313のポート出力でC/A-3880EGを表示する

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
                        +---------------------------+

繋げるとこのようになります。
avr-port-dmdisplay-001

そしてプログラム。

     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にしています。
これが正しい制御方法かは知りませんが、とりあえず暗闇で怪しく光るようになりました。

avr-port-dmdisplay-002

ソースはいつものように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$ 

コメント

タイトルとURLをコピーしました