/* * Stopky.c * * Zobrazení na 4x7segm LED(společná anoda) * a-g,DP připojeno na PORTD(0..6,7) * * anody AN1-AN4 na Ucc přes PNP tranzistory řízené z PORTC(0..3) * * Ovládací tlačítka připojena na PORTC(4,5), vstupy aktivní v log. 0 * * Nastavení pojistek pro ATmega8: * * lfuse:0xBF * hfuse:0xD9 * * Extern.OSC 16MHz,6CK+64ms,BODEN on (Vcc = 2,7V) * * Created: 6.1.2013 9:41:14 * Author: Standa */ #include #define F_CPU 16000000UL //kmitočet cpu #include //obsluha přerušení volatile unsigned char pozice = 0; volatile unsigned char Seg[4] = {0,0,0,0}; volatile unsigned char time = 0; volatile unsigned int cas = 0; volatile unsigned char stav = 0; unsigned char stisk = 0; //Uložení konstant paměti unsigned char dekod[10] = { 0b11000000,0b11111001,0b10100100,0b10110000,0b10011001, 0b10010010,0b10000010,0b11111000,0b10000000,0b10010000 }; unsigned char anoda[4] = { 0b00001110,0b00001101,0b00001011,0b00000111 }; /******************************************************************* * nastavení dat na PORTD a zapnutí příslušné anody(PORTC) * po 5přerušení cas = +10ms ********************************************************************/ ISR(TIMER0_OVF_vect) { TCNT0 = 131; if(stav == 1) //povolení funkce stopkek { if(++time == 5) //2ms x 5 = 10ms { time = 0; if(++cas == 9999) //max hodnota na LED 99,99s { cas = 0; } } } Seg[0] = cas/1000; Seg[1] = (cas%1000)/100; Seg[2] = ((cas%1000)%100)/10; Seg[3] = ((cas%1000)%100)%10; PORTD = 0b11111111; //zhasnutí všech 4x7segm LED if(++pozice == 4) pozice = 0; if(pozice == 1) PORTD = (dekod[Seg[pozice]])&0b01111111; else PORTD = (dekod[Seg[pozice]]); PORTC = (anoda[pozice]); } /****************************************************************************** * Hlavní program *******************************************************************************/ int main(void) { DDRD = 0b11111111; //PORTD výstup DDRC = 0b00001111; //PORTC výstup(0..3) /* Nastavení Timer0 * * 16MHz/256/125 = 500Hz, T = 1/500Hz = 2ms * */ TCNT0 = 131; //předdělička 1:125 (256 - 125 = 131) TCCR0 = (1<