#define ANODEL PORTD.6 #define ANODER PORTD.7 #define RST PORTB.0 #define CH0 PORTB.1 #define CH1 PORTB.2 #define CH2 PORTB.3 #define CH3 PORTB.4 #define CH4 PORTB.5 register unsigned char pos=0, slot=0; unsigned char height[2] = {10,10}; unsigned char bar = 0; unsigned char delay=0; #define MAX_BAR 99 interrupt [TIM0_OVF] void timer0_ovf_isr(void){ TCNT0=180; // 70 ms between interrupts. // Allow timing signal interrupts #asm("sei") if(delay){ delay--; return; } pos++; slot++; if(pos > MAX_BAR){ CH0=0; CH1=0; CH2=0; CH3=0; CH4=0; bar=1-bar; if(bar){ ANODER=1; ANODEL=0; }else{ ANODEL=1; ANODER=0; } RST=1; pos=0; slot=0; delay=1; return; } if(pos>height[bar]){ ANODEL=0; ANODER=0; CH0=0; CH1=0; CH2=0; CH3=0; CH4=0; RST=0; return; } if(slot>4) slot=0; switch(slot){ case 1: CH0=1; CH1=0; CH2=0; CH3=0; delay_us(1); CH4=0; RST=0; return; case 2: CH1=1; CH2=0; CH3=0; CH4=0; RST=0; delay_us(1); CH0=0; return; case 3: CH2=1; CH0=0; CH3=0; CH4=0; RST=0; delay_us(1); CH1=0; return; case 4: CH3=1; CH0=0; CH1=0; CH4=0; RST=0; delay_us(1); CH2=0; return; case 0: CH4=1; CH0=0; CH1=0; CH2=0; RST=0; delay_us(1); CH3=0; return; } }