電子工作熱が続いてますので、まだまだ続きそうです。
今回は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
このようになりました。
ソースです。
#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; }
光りました。
コメント