Main Page | Data Structures | File List | Data Fields | Globals

ATAVRBFLY_FILES/button.c

Go to the documentation of this file.
00001 // This file has been prepared for Doxygen automatic documentation generation. 00023 #include <inavr.h> 00024 #include "ioavr.h" 00025 #include "main.h" 00026 #include "button.h" 00027 #include "types.h" 00028 00029 00030 //extern char gPowerSaveTimer; 00031 00032 unsigned char gButtonTimeout = FALSE; 00033 00034 char KEY = NULL; 00035 char KEY_VALID = FALSE; 00036 00037 00038 00039 /***************************************************************************** 00040 * 00041 * Function name : Button_Init 00042 * 00043 * Returns : None 00044 * 00045 * Parameters : None 00046 * 00047 * Purpose : Initializes the five button pin 00048 * 00049 *****************************************************************************/ 00050 void Button_Init(void) 00051 { 00052 // Init port pins 00053 cbi(DDRB,7); 00054 cbi(DDRB,6); 00055 cbi(DDRB,4); 00056 PORTB |= PINB_MASK; 00057 DDRE = 0x00; 00058 PORTE |= PINE_MASK; 00059 00060 // Enable pin change interrupt on PORTB and PORTE 00061 PCMSK0 = PINE_MASK; 00062 PCMSK1 = PINB_MASK; 00063 EIFR = (1<<PCIF0)|(1<<PCIF1); 00064 EIMSK = (1<<PCIE0)|(1<<PCIE1); 00065 } 00066 00067 00068 #pragma vector = PCINT0_vect 00069 __interrupt void PCINT0_interrupt(void) 00070 { 00071 PinChangeInterrupt(); 00072 } 00073 00074 #pragma vector = PCINT1_vect 00075 __interrupt void PCINT1_interrupt(void) 00076 { 00077 PinChangeInterrupt(); 00078 } 00079 00080 00081 /***************************************************************************** 00082 * 00083 * Function name : PinChangeInterrupt 00084 * 00085 * Returns : None 00086 * 00087 * Parameters : None 00088 * 00089 * Purpose : Check status on the joystick 00090 * 00091 *****************************************************************************/ 00092 void PinChangeInterrupt(void) 00093 { 00094 char buttons; 00095 00096 char key; 00097 00098 /* 00099 Read the buttons: 00100 00101 Bit 7 6 5 4 3 2 1 0 00102 --------------------------------------------- 00103 PORTB B A O 00104 PORTE D C 00105 --------------------------------------------- 00106 PORTB | PORTE B A O D C 00107 ============================================= 00108 */ 00109 00110 00111 buttons = (~PINB) & PINB_MASK; 00112 buttons |= (~PINE) & PINE_MASK; 00113 00114 // Output virtual keys 00115 if (buttons & (1<<BUTTON_A)) 00116 key = KEY_PLUS; 00117 else if (buttons & (1<<BUTTON_B)) 00118 key = KEY_MINUS; 00119 else if (buttons & (1<<BUTTON_C)) 00120 key = KEY_PREV; 00121 else if (buttons & (1<<BUTTON_D)) 00122 key = KEY_NEXT; 00123 else if (buttons & (1<<BUTTON_O)) 00124 key = KEY_ENTER; 00125 else 00126 key = KEY_NULL; 00127 00128 00129 if(key != KEY_NULL) 00130 { 00131 if(gButtonTimeout) // gButtonTimeout is set in the LCD_SOF_interrupt in LCD_driver.c 00132 { 00133 if (!KEY_VALID) 00134 { 00135 KEY = key; // Store key in global key buffer 00136 KEY_VALID = TRUE; 00137 } 00138 00139 gButtonTimeout = FALSE; 00140 00141 } 00142 } 00143 00144 EIFR = (1<<PCIF1) | (1<<PCIF0); // Delete pin change interrupt flags 00145 00146 00147 } 00148 00149 00150 /***************************************************************************** 00151 * 00152 * Function name : getkey 00153 * 00154 * Returns : The valid key 00155 * 00156 * Parameters : None 00157 * 00158 * Purpose : Get the valid key 00159 * 00160 *****************************************************************************/ 00161 char getkey(void) 00162 { 00163 char k; 00164 00165 __disable_interrupt(); 00166 00167 if (KEY_VALID) // Check for unread key in buffer 00168 { 00169 k = KEY; 00170 KEY_VALID = FALSE; 00171 } 00172 else 00173 k = KEY_NULL; // No key stroke available 00174 00175 __enable_interrupt(); 00176 00177 return k; 00178 }

Generated on Tue Nov 1 16:21:39 2005 for AVR323 Interfacing GSM modems by doxygen 1.3.7