1 //***************************************************************************
\r
3 // File........: button.c
\r
5 // Author(s)...: ATMEL Norway
\r
7 // Target(s)...: ATmega169
\r
9 // Compiler....: AVR-GCC 4.1.1; avr-libc 1.4.5
\r
11 // Description.: AVR Butterfly button handling routines
\r
13 // Revisions...: 1.0
\r
15 // YYYYMMDD - VER. - COMMENT - SIGN.
\r
17 // 20030116 - 1.0 - Created - KS
\r
18 // 20031009 port to avr-gcc/avr-libc - M.Thomas
\r
19 // 20070129 SIGNAL->ISR - mt
\r
21 //***************************************************************************
\r
24 //#include <inavr.h>
\r
25 //#include "iom169.h"
\r
28 #include <avr/interrupt.h>
\r
33 // mt/v6 - keyclick (see main.c)
\r
34 extern volatile BOOL gKeyClickStatus;
\r
36 // mt unsigned char gButtonTimeout = FALSE;
\r
37 volatile unsigned char gButtonTimeout = FALSE;
\r
41 //char KEY_VALID = FALSE;
\r
42 //volatile char KEY = NULL;
\r
43 volatile char KEY = 0;
\r
44 volatile char KEY_VALID = FALSE;
\r
47 char CountdownTimerHandle;
\r
49 /*****************************************************************************
\r
51 * Function name : Button_Init
\r
57 * Purpose : Initializes the five button pin
\r
59 *****************************************************************************/
\r
60 void Button_Init(void)
\r
70 // Enable pin change interrupt on PORTB and PORTE
\r
73 EIFR = (1<<PCIF0)|(1<<PCIF1);
\r
74 EIMSK = (1<<PCIE0)|(1<<PCIE1);
\r
76 CountdownTimerHandle = Timer0_AllocateCountdownTimer();
\r
79 // #pragma vector = PCINT0_vect
\r
80 // __interrupt void PCINT0_interrupt(void)
\r
84 PinChangeInterrupt();
\r
88 // #pragma vector = PCINT1_vect
\r
89 // __interrupt void PCINT1_interrupt(void)
\r
93 PinChangeInterrupt();
\r
97 /*****************************************************************************
\r
99 * Function name : PinChangeInterrupt
\r
103 * Parameters : None
\r
105 * Purpose : Check status on the joystick
\r
107 *****************************************************************************/
\r
108 void PinChangeInterrupt(void)
\r
117 Bit 7 6 5 4 3 2 1 0
\r
118 ---------------------------------------------
\r
121 ---------------------------------------------
\r
122 PORTB | PORTE B A O D C
\r
123 =============================================
\r
127 buttons = (~PINB) & PINB_MASK;
\r
128 buttons |= (~PINE) & PINE_MASK;
\r
130 // Output virtual keys
\r
131 if (buttons & (1<<BUTTON_A))
\r
133 else if (buttons & (1<<BUTTON_B))
\r
135 else if (buttons & (1<<BUTTON_C))
\r
137 else if (buttons & (1<<BUTTON_D))
\r
139 else if (buttons & (1<<BUTTON_O))
\r
145 if(key != KEY_NULL)
\r
147 if(gButtonTimeout) // gButtonTimeout is set in the LCD_SOF_interrupt in LCD_driver.c
\r
151 KEY = key; // Store key in global key buffer
\r
155 gButtonTimeout = FALSE;
\r
160 EIFR = (1<<PCIF1) | (1<<PCIF0); // Delete pin change interrupt flags
\r
164 /*****************************************************************************
\r
166 * Function name : getkey
\r
168 * Returns : The valid key
\r
170 * Parameters : None
\r
172 * Purpose : Get the valid key
\r
174 *****************************************************************************/
\r
179 cli(); // mt: __disable_interrupt();
\r
181 if (KEY_VALID) // Check for unread key in buffer
\r
187 k = KEY_NULL; // No key stroke available
\r
189 sei(); // mt: __enable_interrupt();
\r