#include #include #include // funkcija abs(); // -123 npr daje problem kada ga koristim sa % i ostalom logikom // koja priprema cifre za ispis na dipslej, pa sam ukljucio ovo radi // te funkcije abs() /////////////////////////////////////////////////////////////////////////////////////// // moze i ovako da se implementira ova zajebavancija sa tasterima. #define KEY_UP 3 // redni broj PIN-a na portu za tastere #define KEY_RIGHT 2 #define KEY_DN 1 // PINC je ulazni port koji ocitava tastere #define KEY_PINS PINC // Macroi koji definisu tastere #define KEY_DN_PRESS (~(KEY_PINS) & (1 << KEY_DN)) // ~(PINC) & 1 << 1 #define KEY_RIGHT_PRESS (~(KEY_PINS) & (1 << KEY_RIGHT)) // ~(PINC) & 1 << 2 #define KEY_UP_PRESS (~(KEY_PINS) & (1 << KEY_UP)) // ~(PINC) & 1 << 3 // Nabrajanje ocekivanih stanja tastera. enum BUTTONS {NONE = 0, DOWN = 1, RIGHT = 2, UP = 3}; enum ZNAKBROJACA {POZITIVNO = 1, NEGATIVNO = 0}; enum ZNAKBROJACA znak; /////////////////////////////////////////////////////////////////////////////////////// const unsigned char simboli[] = { 0x0c, 0xa4, 0x27, 0xc4 }; //look-up tabela sa simbolima unsigned char DISP_BAFER[4] = { //0xfe, 0xfe, 0xfe, 0xfe 0xff, 0xff, 0xff, 0xff // brisem displej na pocetku. }; //bafer displeja unsigned long millis = 0; unsigned char disp = 3; /////////////////////////////////////////////////////////////////////////////////////// unsigned char jedinice = 1; unsigned char desetice = 9; unsigned char stotice = 0; // 0 1 2 3 4 5 6 7 8 9 const unsigned char cifre[] = { 0x05, 0xdd, 0x46, 0x54, 0x9c, 0x34, 0x24, 0x5d, 0x04, 0x14 }; int brojac = 120; // treba mi integer jer ocekujem broj do 999 // vraca vrednosti iz enumeracije u zavisnosti od pritisnutog tastera. unsigned char ocitajTaster(){ enum BUTTONS btn; if(KEY_DN_PRESS){ // pogledati makroe na vrhu... btn = DOWN; } else if(KEY_UP_PRESS){ btn = UP; } else if(KEY_RIGHT_PRESS){ btn = RIGHT; } else { btn = NONE; } return btn; } void azurirajBrojac() { brojac = jedinice + (desetice * 10) + (stotice * 100); } void budziNaDisplej(){ // npr brojac = 123; stotice = abs(brojac) / 100; // (1234 % 1000) / 100 = 234 / 100 = 2 desetice = (abs(brojac) % 100) / 10; // ((1234 % 1000) % 100) / 10 = (234 % 100) / 10 = 34 / 10 = 3 jedinice = (abs(brojac) % 100) % 10; // 1234 % 1000 = 234 % 100 = 34 % 10 = 4 DISP_BAFER[3] = cifre[jedinice]; // jedinice ispisujem uvijek. // Podesavam kada da ispisujem znak minus ispred prve znacajne cifre. if(brojac < 0 && brojac > -9) DISP_BAFER[2] = 0xfe; if(brojac < 0 && brojac > -99 && brojac < -9) DISP_BAFER[1] = 0xfe; if(brojac < 0 && brojac < -99) DISP_BAFER[0] = 0xfe; if(abs(brojac) > 9) { DISP_BAFER[2] = cifre[desetice]; } if(abs(brojac) > 99) { DISP_BAFER[1] = cifre[stotice]; } } //////////////////////////////////////////////////////////////////////////////////////// ISR(TIMER0_COMPA_vect) { //prekid tajmera 0 usled dostizanja vrednosti registra OCR0A if (++disp > 3) disp = 0; PORTB = ~(1 << (3-disp)); //ukljucenje tranzistora PORTD = DISP_BAFER[disp]; //ispis na trenutno aktivan displej millis++; //sistemsko vreme } int main() { //unsigned long t0; //unsigned char i; //inicijalizacija portova: DDRB = 0x0f; //PB3-PB0 -> izlazi DDRD = 0xff; //port D -> izlaz //inicijalizacija tajmera 0: TCCR0A = 0x02; //tajmer 0: CTC mod TCCR0B = 0x03; //tajmer 0: fclk = fosc/64 OCR0A = 249; //perioda tajmera 0: 250 Tclk (OCR0A + 1 = 250) TIMSK0 = 0x02; //dozvola prekida tajmera 0 //usled dostizanja vrednosti registra OCR0A sei(); //I = 1 (dozvola prekida) while(1) { //t0 = millis; // zbog ove pauze je uociljiv blagi trzaj svih displeja pri inicijalizaciji. //while ((millis - t0) < 500); //pauza 500ms //for (i = 0; i < 4; i++) //DISP_BAFER[i] = simboli[i]; budziNaDisplej(); //t0 = millis; //while ((millis - t0) < 200); //pauza 500ms //for (i = 0; i < 4; i++) //DISP_BAFER[i] = 0xfe; azurirajBrojac(); } return 0; }