/*

C автоматическим определением скорости 1995kenny

4MHz

*/

#include <mega8.h>
#include <delay.h>
#include <interrupt.h>
// SPI functions 
#include <spi.h>
#include <io.h>

#define RES PORTD.7       // пин сброса регистров
#define TRANZ PORTD.6     //включения отображения             
// Declare your global variables here 

char num; 

const char table[256][3]= {  //матрица данных для вывода
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0,0xFF},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0,0xFF},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0,0xFF},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0xFF,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0xFF,0},
{0,0,0xFF},
{0,0,0},
{0,0,0xFF} };
                     


/// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)     //внешн 
{
OCR2=TCNT1H;
TCNT1H=0;
TCNT1L=0;
TCNT2=0;
delay_us(3);



}   
void res(void){   //сброс регистров
RES=0;       
delay_us(20);       
RES=1;       
delay_us(5); 
}
void show1(void){  //отображение вкл,
TRANZ=1;
} 
void show0(void){      //отображение выкл
TRANZ=0;
}
void write(char number){
char x, y, z;
show0();
res();
z=table[number][0];
y=table[number][1];
x=table[number][2];
spi(x);
spi(y);
spi(z);
show1();

}
interrupt [TIM2_COMP] void str(void)     //смена строки
{
write(num);
if(num==255){
num=0; 
}
else{
num++;
};

} 


void ports(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
PORTD=0x00;
DDRD=0b11110001;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Toggle
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x10;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x40;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Low level
GICR|=0x80;
MCUCR=0x00;
GIFR=0x80;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;       //0b10000000

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2 MHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x01; 

}




void writest(void){   //тест

show0();
res();
spi(0xFF);  
spi(0);
spi(0); 
show1();
delay_ms(70); 
show0();
res();
spi(0);  
spi(0xFF);
spi(0); 
show1();
delay_ms(70);
show0();
res();
spi(0);  
spi(0);
spi(0xFF); 
show1();
delay_ms(30);
} 


     
void main()
{
ports();    //инициализация
res();    //сброс регистров
delay_ms(15);
writest();  //тест
delay_ms(15);
num=0;

}

