2009-11-08 (日)
金曜の夜から微熱が続いている.なんか,週末になると体調悪くなるなぁ.
鈴商で買ったBA823を使ってみる.ドットごとの明るさを制御するなら,MAX7219を使うよりずっと楽です.200mA以上流せるので外付けのトランジスタもいりません.何よりもICの値段が1/10.
#define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile uint8_t framebuf[] = { 0,2,4,6,8,10,12,16, 16,1,2,4,6,8,10,12, 12,16,1,2,4,6,8,10, 10,12,16,1,2,4,6,8, 8,10,12,16,1,2,4,6, 6,8,10,12,16,1,2,4, 4,6,8,10,12,16,1,2, 2,4,6,8,10,12,16,1, }; // タイマ割り込み ISR(TIMER0_OVF_vect) { static uint8_t cnt = 0; static uint8_t frame = 0; if ((PORTD&2)==0) { PORTD|= 2; // CLK H uint8_t d=0; uint8_t i; for (i=0;i<8;i++) { d>>=1; if (frame<framebuf[cnt*8+i]) d|=0x80; } PORTB=d; cnt=(cnt+1)&7; } else { PORTD&= ~2; // CLK L PORTB=0x00; if (cnt==0) { frame=(frame+1)&15; PORTD|= 1; // DAT H } else { PORTD&=~1; // DAT L } } } // 指定された時間だけ待つ void delay_ms(uint16_t w){ while (w-->0) _delay_ms(1); } int main() { DDRB = 0xff; // LED matrix anode(0-7) DDRD = 0x0f; // LED cathode(BA823) PD0->dat PD1->clk PORTD=0x00; PORTB=0x00; TCCR0B = _BV(CS00); TIMSK = _BV(TOIE0); sei(); for(;;) { uint8_t t; uint8_t i; for (i=0;i<64;i++) { delay_ms(20); t=framebuf[i]; framebuf[i]=framebuf[(i+23)&63]; framebuf[(i+23)&63]=t; } } }