/*************************************************************************** * * * P R I M E R 3 C . C * * prikaz uporabe podatkovnega eeproma na PIC16x84 * * * *==========================================================================* * Verzija Datum Opis Avtor * *--------------------------------------------------------------------------* * 1 1997-12-26 Slavko M. * *==========================================================================* * * * OPIS: S çtirimi tipkami na vhodih PA0-PA3 lahko pri§igaç in ugaçaç * * LED na izhodih PB0-PB3. Trenutno stanje na izhodih se sproti * * bele§i v prvo celico DATA EEPROMa, da se lahko po resetu v * * primeru izpada napajalne napetosti vspostavi zadnje stanje na * * izhodih. * ***************************************************************************/ #include /* vkljuŸi datoteko z konstantami za PIC*/ #include /* vkljuŸi datoteko z funkcijami za delo s podatkovnim eepromom*/ /* KONFIGURACUJSKI BAJT NA NASLOVU 0X2007 */ __CONFIG(_CP_ON & _PWRTE_ON & _WDT_ON & _XT_OSC); /* trenutno: _CP_ON -vkljuŸena zaçŸita vpisanega programa pred kopiranjem _PWRTE_ON - vkljucen "power up timer" _WDT_ON - vkljuŸen "watchdog timer" _XT_OSC - izbran kvarc osilator */ /*************/ /* K B H I T */ /*************/ byte kbhit() { /* funkcija za testiranje tipkovnice */ static byte staro_stanje_tipk; /* globalna spremenljivka dostopna vsem podprogramom 1byte=8bitov */ byte stanje_porta,rezultat; /* lokalni sremnljivki dostopni samo znotraj te funkcije 1byte=8bitov */ int i; stanje_porta = PORTA; /* tipke so na spodnjih 4. bitih porta A*/ for (i=1000;i--;) continue; /*da onemogoŸi veŸkratni preklop poŸaka pribli§no 50ms */ stanje_porta &= PORTA; /* Ÿe je tipka çe vedno pritisnjena jo sprejmi*/ rezultat = ~staro_stanje_tipk & stanje_porta; /* Rez=/Staro AND Tipka*/ /* "1" Ÿe je tipka pritisnjena v prejçnjem ciklu pa çe ni bila */ staro_stanje_tipk = stanje_porta; /* zabele§i trenutno stanje za naslednji cikel */ return(rezultat & 0x0F); /* programu, ki je klical to funkcijo vrne byte s postavljenimi tistimi biti, katerih tipke so bile na novo pritisnjeme */ } /* konec funkcije kbhit */ /***********/ /* M A I N */ /***********/ main(void) { /* zaŸetek telesa glavnega programa */ byte tipke; /* lokalna sremnljivka dostopna samo znotraj te funkcije 1byte=8bitov */ #define EE_ADR 0 /* konstata uporabna samo med prevajanjem programa */ PORTB = read_eeprom(EE_ADR) & 0x0F; /* prebere 1 byte iz data eeproma in ga preslika na izhod - port B samo uporabni del, to je spodnje çtiri bite */ TRISB = 0; /* Port B vsi izhodi */ OPTION = 0x8F; /* predelilnik vkljuŸen na WDT = 2.3s */ for(;;) { /* v naskonŸni zanki Ÿaka na pritisk tipke */ CLRWDT(); /*zbriçe watchdog çtevec, da prepreŸi reset*/ if ((tipke = kbhit()) != 0 ) { /* po pritisku katerekoli tipke, ki je bila prej spuçŸena */ PORTB ^= tipke; /* (PORTB = PORTB XOR tipke) */ /* bitom katerih tipke so na novo pritisnjene, invertira vrednost */ write_eeprom(EE_ADR,PORTB); /* in shrani v trajni spomin v eeprom, za poznejço uporabo */ } /* konec IF stavka */ } /* konec FOR zanke */ } /* konec funkcije main */