2009-10 << 2009-11 >> 2009-12

2009-11-08 (日)

金曜の夜から微熱が続いている.なんか,週末になると体調悪くなるなぁ.

CIMG0010.jpg

鈴商で買った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;
        }
    }
}