Спасибо Dimon456 ! вроде получилось !
Спойлер#include <mega8.h>
#include <delay.h>
#include <stdlib.h>
volatile unsigned int f=150, // время кадра z=1000; // ms для паузы после эффекта volatile unsigned char Lines, Phase=0;
flash char flasher_0[200] = { 4,0,0,0,0,0,0,0, 3,4,0,0,0,0,0,0, 2,3,4,0,0,0,0,0, 1,2,3,4,0,0,0,0, 0,1,2,3,4,0,0,0, 0,0,1,2,3,4,0,0, 0,0,0,1,2,3,4,0, 0,0,0,0,1,2,3,4, 0,0,0,0,0,1,2,3, 0,0,0,0,0,0,1,2, 0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0 }; volatile flash char *u; volatile char a; //==================== // Timer2 overflow interrupt service routine interrupt [TIM2_OVF] void timer2_ovf_isr(void) { unsigned char i;
if (Phase==0) { PORTD = 0xFF; PORTC = 0; Phase = 4; PORTC = Lines ; //выводим 1 на линию порта А, соответствующую счетчику линий. }
for (i=0; i<8; i++) { a = *(u+0*8+i); if (a==Phase) PORTD &= ~(1<<i);//выводим на соответствующую линию потра В нолик } Phase--; }
//==================== void view_pauza(void) { delay_ms(z); } //==================== void view_flasher_0(void) { int i;
Lines=rand()%6+1; // случайное число от 1 до 6
for (i =0; i<13;++i){ u = &(flasher_0[i*8]); delay_ms(f); } view_pauza(); }
//=================== main ========== void main(void) {
//настройка портов PORTB=0b00000000; DDRB=0b00000000; PORTC=0b00000000; //порт С 4 первые по умолчанию 1 DDRC=0b00000111; //порт С 4 первые ноги на вывод PORTD=0b00000000; //порт D по умолчанию все ноги на 0 DDRD=0b11111111; //порт D все ноги на вывод
TCCR2 |= (0<<CS02)|(1<<CS01)|(0<<CS00); TIMSK=0b01000000; // 0b11000001 // || | | // || | Timer0 // || Timer1 // |Timer2 //
#asm("sei") // Глобальные прерывания включения //====================
while (1) { view_flasher_0();
} }
|