Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned char bin[64] = {
0b00000000,
0b00100000,
0b00010000,
0b00110000,
0b00001000,
0b00101000,
0b00011000,
0b00111000,
0b00000100,
0b00100100,
0b00010100,
0b00110100,
0b00001100,
0b00101100,
0b00011100,
0b00111100,
0b00000010,
0b00100010,
0b00010010,
0b00110010,
0b00001010,
0b00101010,
0b00011010,
0b00111010,
0b00000110,
0b00100110,
0b00010110,
0b00110110,
0b00001110,
0b00101110,
0b00011110,
0b00111110,
0b00000001,
0b00100001,
0b00010001,
0b00110001,
0b00001001,
0b00101001,
0b00011001,
0b00111001,
0b00000101,
0b00100101,
0b00010101,
0b00110101,
0b00001101,
0b00101101,
0b00011101,
0b00111101,
0b00000011,
0b00100011,
0b00010011,
0b00110011,
0b00001011,
0b00101011,
0b00011011,
0b00111011,
0b00000111,
0b00100111,
0b00010111,
0b00110111,
0b00001111,
0b00101111,
0b00011111,
0b00111111,
};
//переменные
unsigned char hour, min, sec;
ISR(TIMER2_COMP_vect){
sec++;
if (sec > 59) { min ++; sec = 0;};
if (min > 59) { hour ++; min = 0;};
if (hour > 23) {hour = 0;};
}
void ShowTime(char h, char m, char s){
PORTB = bin[h];
PORTD |= (1 <<PD5);
_delay_ms(1);
PORTD &= ~(1 <<PD5);
PORTB = bin[m];
PORTD |= (1 <<PD6);
_delay_ms(1);
PORTD &= ~(1 <<PD6);
PORTB = bin[s];
PORTD |= (1 <<PD7);
_delay_ms(1);
PORTD &= ~(1 <<PD7);
}
int main(void) {
//SetUp
DDRB = 0b11111111;
DDRD = 0b11100000;
DDRC|= (0 << PC2)|(0<<PC3);
PORTC |= (1 << PC2)|(1<<PC3);
asm ("cli");
ASSR |= (1 << AS2);
while (ASSR != (0b00001000))
{
asm ("nop");
}
TCCR2 |= (1<<CS20) | (1<<CS22) | (1<<WGM21);
OCR2 = 255;
TIMSK |= (1<<OCIE2);
TIFR = 0;
asm ("sei");
while(1){
if((PINC & (1<<PC2)) == 0){
_delay_ms(50);
while((PINC & (1<<PC2)) == 0){}
min++;
if (min > 59) min = 0;
}
if((PINC & (1<<PC3)) == 0){
_delay_ms(50);
while((PINC & (1<<PC3)) == 0){}
hour++;
if (hour > 23) hour = 0;
}
ShowTime(hour, min, sec);
}
return 0;
}
было так:
Код: Выделить всё
ISR(TIMER2_COMP_vect){
if (sec++ >= 59) { min ++; sec = 0;};
if (min >= 59) { hour ++; min = 0;};
if (hour >= 23) {hour = 0;};
}
При этом запускал параллельно с секундомером на ноутбуке, и заметно что одна секунда на часах отображается немного быстрее чем нужно.


