// AVR-MT-128-buttons.c // // Koden för knappavläsning #include "AVR-MT-128-buttons.h" volatile unsigned char remembered_buttons, actual_buttons, new_buttons; //============================================================== //=== Knappavläsning =========================================== //============================================================== /* Denna funktion läser av knapparna och uppdaterar följande tre variabler: remembered_buttons Variabel som visar knapparnas lägen sedan förra avläsningen. actual_buttons Avlästa knappar: jämförs med föregående new_buttons Anger om knapp tryckts ner på nytt. */ void read_buttons(void){ // Läs in de fem knapparna så att en etta betyder nedtryckt: actual_buttons = ~PINA & 0x1F; // Uppdatera new_buttons med eventuella nya ettor: new_buttons = new_buttons | ((actual_buttons)&(~remembered_buttons)); // Kom ihåg till nästa gång: remembered_buttons = actual_buttons; } void reset_new_up(void){ new_buttons = new_buttons & 0xFE; } void reset_new_left(void){ ????????????????????????????????; } void reset_new_middle(void){ ????????????????????????????????; } void reset_new_right(void){ ????????????????????????????????; } void reset_new_down(void){ ????????????????????????????????; } //============================================================== //========== Periodiskt avbrott för knappavläsning. ============ //============================================================== // Avbrottsfunktionen: ISR (SIG_OUTPUT_COMPARE2){ // Anropa knappavläsningen ------------------------------------- read_buttons(); } // Uppstart av periodiskt avbrott för knappavläsning: void initOC2(){ // Output Compare 2 (s 146) TCCR2 = 0b00001101; // "Clear Timer on Compare match", systemklocka/1024 (s 157) OCR2 = 128; // 128x1024 = 131072, 16000000/131072 = 122 TIMSK = TIMSK | 0x80; // Aktivera avbrottet (s 159) }