AVRマイコンのポートで4桁の7セグLEDを表示する(ATtiny2313)

電子工作熱が続いてますので、まだまだ続きそうです。
今回は4桁の7セグLEDにダイナミック点灯したいと思います。

ピン配、各接続です。

                                  ATtiny2313
                                 +-----------+
                                -|1        20|- VCC
                            PD0 -|2        19|- PB7 ---> 7
                            PD1 -|3        18|- PB6 ---> 10
                     8 <--- PA1 -|4        17|- PB5 ---> 11
                     9 <--- PA0 -|5        16|- PB4 ---> 5
                     6 <--- PD2 -|6        15|- PB3 ---> 4
                    12 <--- PD3 -|7        14|- PB2 ---> 3
                            PD4 -|8        13|- PB1 ---> 2
                            PD5 -|9        12|- PB0 ---> 1
                            GND -|10       11|- 
                                 +-----------+

                                      4 digit 7SEG(cathode common)
                                        12 11 10  9  8  7                      
                                         |  |  |  |  |  |                     
                   +-------------++-------------++-------------++-------------+
                   |             ||     d1  A  F||d2 d3 B      ||             |
                   |             ||             ||             ||             |
                   |  +---A---+  ||  +---A---+  ||  +---A---+  ||  +---A---+  |
                   |  |       |  ||  |       |  ||  |       |  ||  |       |  |
                   |  F       B  ||  F       B  ||  F       B  ||  F       B  |
                   |  |       |  ||  |       |  ||  |       |  ||  |       |  |
                   |  +---G---+  ||  +---G---+  ||  +---G---+  ||  +---G---+  |
                   |  |       |  ||  |       |  ||  |       |  ||  |       |  |
                   |  E       C  ||  E       C  ||  E       C  ||  E       C  |
                   |  |       |  ||  |       |  ||  |       |  ||  |       |  |
                   |  +---D---+  ||  +---D---+  ||  +---D---+  ||  +---D---+  |
                   |          DP ||          DP ||          DP ||          DP |
                   |             ||             ||             ||             |
                   |             ||      E  D DP||C  G  d4     ||             |
                   +-------------++-------------++-------------++-------------+
                                         |  |  |  |  |  |                     
                                         1  2  3  4  5  6                      

このようになりました。
7seg-4digit-001

ソースです。

#include <avr/io.h>
#include <util/delay.h>


char *digit[] ={
/* 0 */ "ABCDEF",       /*  +---A---+  */
/* 1 */ "BC",           /*  |       |  */
/* 2 */ "ABGED",        /*  F       B  */
/* 3 */ "ABCDG",        /*  |       |  */
/* 4 */ "FGBC",         /*  +---G---+  */
/* 5 */ "AFGCD",        /*  |       |  */
/* 6 */ "AFGCDE",       /*  E       C  */
/* 7 */ "FABC",         /*  |       |  */
/* 8 */ "ABCDEFG",      /*  +---D---+  */
/* 9 */ "ABCDGF",       /*          DP */
}; 

void anode(int pin)
{
	switch(pin){
	case	 1: PORTB |= 0b00000001;break;
	case	 2: PORTB |= 0b00000010;break;
	case	 3: PORTB |= 0b00000100;break;
	case	 4: PORTB |= 0b00001000;break;
	case	 5: PORTB |= 0b00010000;break;
	case	11: PORTB |= 0b00100000;break;
	case	10: PORTB |= 0b01000000;break;
	case	 7:
	default:    PORTB |= 0b10000000;break;
	}
}
void cathode(int pin)
{
	switch(pin){
	case	 6: PORTD &= ~0b00000100;break;
	case	 8: PORTA &= ~0b00000010;break;
	case	 9: PORTA &= ~0b00000001;break;
	case	12:
	default:    PORTD &= ~0b00001000;break;
	}
}

void clear()
{
	PORTB &= ~0b11111111;
	PORTA |= 0b00000011;
	PORTD |= 0b00001100;
}

void disp(int sel,int num)
{
	int pin;
	char loc;
	char* p;

	p = digit[num];

	while(loc=*p++){
		clear();
		switch(sel){
		case	1:	pin=12;	break;
		case	2:	pin= 9;	break;
		case	3:	pin= 8;	break;
		default:
		case	4:	pin= 6;	break;
		}
		cathode(pin);

		switch(loc){
		case	'A':	pin=11;	break;
		case	'B':	pin= 7;	break;
		case	'C':	pin= 4;	break;
		case	'D':	pin= 2;	break;
		case	'E':	pin= 1;	break;
		case	'F':	pin=10;	break;
		default:
		case	'G':	pin= 5;	break;
		}
			
		anode(pin);
		_delay_ms(1);
	}

}

int main()
{
	DDRB = 0b11111111;      //ATtiny2313 pin.12-19 PB0-7 OUT
	DDRD = 0b00111111;      //ATtiny2313 pin.2,3,6-9 PD0-5 OUT
	DDRA = 0b00111111;      //ATtiny2313 pin.4,5 PA0-1 OUT

	while(1){
		disp(1,1);
		disp(2,2);
		disp(3,3);
		disp(4,7);
	}

	return 0;
}

光りました。
7seg-4digit-002

コメント

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