Спойлер
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
char dig[] = {0b10000001, 0b11110011, 0b01001001, 0b01100001, 0b00110011, 0b00100101, 0b00000101, 0b11110001, 0b00000001, 0b00100001, 0b00000000};
char razr[] = {0b11111110, 0b11111101, 0b11111011, 0b11110111};
unsigned char display[2];
unsigned char i, a=0;
unsigned int z=0;
unsigned char dig1, dig2, dig3, dig4;
ISR(TIMER0_OVF_vect)
{
TCNT0=178;
a++;
if (a>10)
{
z++;
a=0;
}
}
void write_display(unsigned char *data)
{
unsigned char mask,i;
for(i = 0; i < 2; i++)
{
mask = 0x80;
for(char k = 0; k < 8; k++)
{
// Сравниваем каждый бит с единицей
if(data[i] & mask)
{
PORTB |= (1 << 0); // DATA 1
PORTB |= (1 << 1); // CLK 1
PORTB &= ~(1 <<1); // CLK 0
}
else
{
PORTB &= ~(1 << 0); // DATA 0
PORTB |= (1 << 1); // CLK 1
PORTB &= ~(1 << 1); // CLK 0
}
mask = mask >> 1; // Сдвигаем биты
}
}
// Защелкиваем регистр
PORTB |= (1 << 2);
PORTB &= ~(1 << 2);
}
ISR (TIMER1_COMPA_vect)
{
dig4=dig[z % 10000 / 1000];
dig3=dig[z % 1000 / 100];
dig2=dig[z % 100 / 10];
dig1=dig[z % 10];
display[0] = razr[3];
display[1] = ~ dig4;
write_display(display);
display[0] = razr[3];
display[1] = dig[10];
write_display(display);
display[0] = razr[2];
display[1] = ~ dig3;
write_display(display);
display[0] = razr[2];
display[1] = dig[10];
write_display(display);
display[0] = razr[1];
display[1] = ~dig2;
write_display(display);
display[0] = razr[1];
display[1] = dig[10];
write_display(display);
display[0] =razr[0]; // в крайний левый символ
display[1] =~ dig1; // выводится цифра
write_display(display);
display[0] = razr[0]; // в крайний левый символ
display[1] = dig[10]; // выводится цифра
write_display(display); // и посылается на 74hc595
}
/*
*/
int main(void)
{
DDRB = 0xFF;
PORTB = 0x00;
DDRC=0xff;
PORTC=0x03;
TCCR0A=0;
TCNT0=178;
TCCR0B=(1<<CS02)|(1<<CS00);
TIMSK0|=1<<TOIE0;
TCCR1A = 0x00;
TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10);
TCNT1H = 0;
TCNT1L = 0;
OCR1A=5;
TIMSK1 |= (1<<OCIE1A);
sei();
while (1)
{
}
}


