Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//#define F_CPU 8000000UL
// 10 11 12 13 14
//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp----H-----_------------*--
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80, 0x76, 0x40, 0x00, 0x63};
volatile unsigned char segcounter = 0;
volatile unsigned int display = 0;
volatile unsigned int DP1 = 0x00;
volatile unsigned int DP2 = 0x00;
volatile unsigned int DP3 = 0x00;
volatile unsigned int GEAR = 12; // òèðå â ìàññèâå
volatile unsigned int VOLT = 0;
volatile unsigned int temp = 0; // âðåìåííàÿ ïåðåìåííàÿ äëÿ õðàíåíèÿ çíà÷åíèÿ àöï
char select =0;
char FLAG =1;
char flagGEAR=1;
volatile unsigned int tempGEAR = 0;
long int HOUR=0;
int MIN=0;
long int CLOCK=0;
// Ïðåðûâàíèå ïî ïåðåïîëíåíèþ T2, ÷àñû
ISR (TIMER2_OVF_vect)
{
CLOCK++;
if (CLOCK==86400) {CLOCK=0;}
}
// Ïðåðûâàíèå ïî ïåðåïîëíåíèþ T0, äèíàìè÷åñêàÿ èíäèêàöèÿ
ISR (TIMER0_OVF_vect)
{
PORTD = 0xFF; // Ãàñèì âñå ñåãìåíòû
PORTB = ~(1 << segcounter); // Ïîñëåäîâàòåëüíî çàæèãàåì îáùèå àíîäû
switch (segcounter)
{
case 0:
PORTD = ~((SEGMENTE[display % 10000 / 1000] ) | DP1); // Âûâîäèì ïåðâûé ðàçðÿä
break;
case 1:
PORTD = ~((SEGMENTE[display % 1000 / 100]) | DP2); // âòîðîé ðàçðÿä
break;
case 2:
PORTD = ~((SEGMENTE[display % 100 / 10]) | DP3); // Âûâîäèì òðåòèé ðàçðÿä
break;
case 3:
PORTD = ~(SEGMENTE[display % 10]);// âûâîäèì 4 ðàçðÿä
break;
case 4:
PORTD = ~(SEGMENTE[GEAR]); // âûâîäèì íîìåð ïåðåäà÷è íà îòäåëüíûé èíäèêàòîð
break;
}
if ((segcounter++ ) > 3) segcounter = 0;
// _delay_ms (1);
}
volatile unsigned long value;
// Ãëàâíàÿ ôóíêöèÿ
int main (void)
{
DDRB = 0xFF; // Âûõîäû íà îáùèå àíîäû
PORTB = 0x00; // Íîëü íà âûõîäå
DDRD = 0xFF; // Âûõîäû íà ñåãìåíòû
PORTD = 0x00; // Íîëü íà âûõîäå
// Íàñòðîéêà Òàéìåðà T0
TCCR0A |= (1 << CS01); // (1<<CS20); // Ïðåääåëèòåëü íà 64
TIMSK0 |= (1 << TOIE0); // Ðàçðåøåíèå ïðåðûâàíèÿ ïî òàéìåðó 0
// Íàñòðîéêà àñèíõðîííîãî òàéìåðà Ò2
ASSR |= (1<<AS2); // çàïóñê àñèíõðîííîãî ðåæèìà
TCCR2A |= (1 << CS22) | (1<<CS20); // Ïðåääåëèòåëü íà 128
TIMSK2 |= (1 << TOIE2); // Ðàçðåøåíèå ïðåðûâàíèÿ ïî òàéìåðó 2
sei(); // Ãëîáàëüíî ðàçðåøàåì ïðåðûâàíèÿ
// Ãëàâíûé öèêë
while(1)
{
DP1 = 0x00;
DP2 = 0x00;
DP3 = 0x00;
HOUR = CLOCK / 3600; // âûäåëÿåì ÷àñû èç ñåêóíä
MIN = (CLOCK-(HOUR*3600)) / 60; // âûäåëÿåì ìèíóòû èç îñòàòêà
display = (HOUR*100)+MIN; // àäàïòèðóåì ïîä àëãîðèòì âûâîäà íà äèñïëåé
DP2=0x80; // âûâîäèì òî÷êó
_delay_ms (50);
}
}
фрагмент с настройкой асинхронного таймера