43 static inline void CONFIG_COLUMN() {
44 CONFIG_RB9_AS_DIG_INPUT();
46 CONFIG_RB8_AS_DIG_INPUT();
48 CONFIG_RB7_AS_DIG_INPUT();
50 CONFIG_RB6_AS_DIG_INPUT();
58 #define CONFIG_R0_DIG_OUTPUT() CONFIG_RB5_AS_DIG_OUTPUT()
59 #define CONFIG_R1_DIG_OUTPUT() CONFIG_RB4_AS_DIG_OUTPUT()
60 #define CONFIG_R2_DIG_OUTPUT() CONFIG_RB3_AS_DIG_OUTPUT()
63 CONFIG_R0_DIG_OUTPUT();
64 CONFIG_R1_DIG_OUTPUT();
65 CONFIG_R2_DIG_OUTPUT();
68 static inline void DRIVE_ROW_LOW() {
74 static inline void DRIVE_ROW_HIGH() {
80 void configKeypad(
void) {
88 void setOneRowLow(
uint8_t u8_x) {
109 const uint8_t au8_keyTable[NUM_ROWS][NUM_COLS] = { {
'1',
'4',
'7',
'*'},
110 {
'2',
'5',
'8',
'0'},
114 #define KEY_PRESSED() (!C0 || !C1 || !C2 || !C3) //any low
115 #define KEY_RELEASED() (C0 && C1 && C2 && C3) //all high
121 else if (!C1) u8_col = 1;
122 else if (!C2) u8_col = 2;
123 else if (!C3) u8_col = 3;
126 for (u8_row = 0; u8_row < NUM_ROWS; u8_row++) {
127 setOneRowLow(u8_row);
130 return(au8_keyTable[u8_row][u8_col]);
139 STATE_WAIT_FOR_PRESS = 0,
140 STATE_WAIT_FOR_PRESS2,
141 STATE_WAIT_FOR_RELEASE,
144 ISRSTATE e_isrState = STATE_WAIT_FOR_PRESS;
145 volatile uint8_t u8_newKey = 0;
148 void _ISR _T3Interrupt (
void) {
149 switch (e_isrState) {
150 case STATE_WAIT_FOR_PRESS:
151 if (KEY_PRESSED() && (u8_newKey == 0)) {
153 e_isrState = STATE_WAIT_FOR_PRESS2;
156 case STATE_WAIT_FOR_PRESS2:
159 u8_newKey = doKeyScan();
160 e_isrState = STATE_WAIT_FOR_RELEASE;
161 }
else e_isrState = STATE_WAIT_FOR_PRESS;
164 case STATE_WAIT_FOR_RELEASE:
166 if (KEY_RELEASED()) {
167 e_isrState = STATE_WAIT_FOR_PRESS;
171 e_isrState = STATE_WAIT_FOR_PRESS;
177 #define ISR_PERIOD 15 // in ms
179 void configTimer3(
void) {
184 T3CON = T3_OFF | T3_IDLE_CON | T3_GATE_OFF