Difference between revisions of "AVR Interfacing:Hex Kepad"
Line 2: | Line 2: | ||
Let's look at interfacing a Hex keypad, the one with 16 switches; arranged in 4 columns and 4 rows. The interesting challenge is to interface 16 switches on 8 pins. | Let's look at interfacing a Hex keypad, the one with 16 switches; arranged in 4 columns and 4 rows. The interesting challenge is to interface 16 switches on 8 pins. | ||
So how does this work? The simple answer is the MCU is faster than the your fingers. | So how does this work? The simple answer is the MCU is faster than the your fingers. | ||
+ | =Basics= | ||
+ | |||
+ | =Code= | ||
+ | <syntaxhighlight> | ||
+ | #include "keypad.h" | ||
+ | #include "lcd.h" | ||
+ | int main() | ||
+ | { | ||
+ | uint8_t key; | ||
+ | |||
+ | /*Connect RS->PB0, RW->PB1, EN->PB2 and data bus PORTB.4 to PORTB.7*/ | ||
+ | LCD_SetUp(PB_0,PB_1,PB_2,P_NC,P_NC,P_NC,P_NC,PB_4,PB_5,PB_6,PB_7); | ||
+ | LCD_Init(2,16); | ||
+ | |||
+ | /*Connect R1->PD0, R2->PD1, R3->PD2 R4->PD3, C1->PD4, C2->PD5 C3->PD6, C4->PD7 */ | ||
+ | KEYPAD_Init(PD_0,PD_1,PD_2,PD_3,PD_4,PD_5,PD_6,PD_7); | ||
+ | |||
+ | LCD_Printf("Key Pressed:"); | ||
+ | while (1) | ||
+ | { | ||
+ | key = KEYPAD_GetKey(); | ||
+ | LCD_GoToLine(1); | ||
+ | LCD_DisplayChar(key); | ||
+ | |||
+ | } | ||
+ | |||
+ | return (0); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | Let's look at the most important function in the code in a little more details | ||
+ | <syntaxhighlight> | ||
+ | key = KEYPAD_GetKey(); | ||
+ | </syntaxhighlight> | ||
+ | As you can guess, the function return the ASCII value of the key being pressed. It is defined in ''keypad.c'' as below: | ||
+ | <syntaxhighlight> | ||
+ | uint8_t KEYPAD_GetKey(void) | ||
+ | { | ||
+ | uint8_t i,j,v_KeyPressed_u8 = 0; | ||
+ | |||
+ | |||
+ | keypad_WaitForKeyRelease(); | ||
+ | keypad_WaitForKeyPress(); | ||
+ | |||
+ | for (i=0;i<C_MaxRows_U8;i++) | ||
+ | { | ||
+ | GPIO_PinWrite(A_RowsPins_U8[i],HIGH); | ||
+ | } | ||
+ | |||
+ | for (i=0;(i<C_MaxRows_U8);i++) | ||
+ | { | ||
+ | GPIO_PinWrite(A_RowsPins_U8[i],LOW); | ||
+ | |||
+ | for(j=0; (j<C_MaxCols_U8); j++) | ||
+ | { | ||
+ | if(GPIO_PinRead(A_ColsPins_U8[j]) == 0) | ||
+ | { | ||
+ | v_KeyPressed_u8 = 1; | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if(v_KeyPressed_u8 ==1) | ||
+ | { | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | GPIO_PinWrite(A_RowsPins_U8[i],HIGH); | ||
+ | } | ||
+ | |||
+ | if(i<C_MaxRows_U8) | ||
+ | v_KeyPressed_u8 = A_KeyLookUptable_U8[i][j]; | ||
+ | else | ||
+ | v_KeyPressed_u8 = C_DefaultKey_U8; | ||
+ | |||
+ | |||
+ | return v_KeyPressed_u8; | ||
+ | } | ||
+ | </syntaxhighlight> |
Revision as of 10:16, 24 March 2016
Let's look at interfacing a Hex keypad, the one with 16 switches; arranged in 4 columns and 4 rows. The interesting challenge is to interface 16 switches on 8 pins. So how does this work? The simple answer is the MCU is faster than the your fingers.
Basics
Code
#include "keypad.h" #include "lcd.h" int main() { uint8_t key; /*Connect RS->PB0, RW->PB1, EN->PB2 and data bus PORTB.4 to PORTB.7*/ LCD_SetUp(PB_0,PB_1,PB_2,P_NC,P_NC,P_NC,P_NC,PB_4,PB_5,PB_6,PB_7); LCD_Init(2,16); /*Connect R1->PD0, R2->PD1, R3->PD2 R4->PD3, C1->PD4, C2->PD5 C3->PD6, C4->PD7 */ KEYPAD_Init(PD_0,PD_1,PD_2,PD_3,PD_4,PD_5,PD_6,PD_7); LCD_Printf("Key Pressed:"); while (1) { key = KEYPAD_GetKey(); LCD_GoToLine(1); LCD_DisplayChar(key); } return (0); }
Let's look at the most important function in the code in a little more details
key = KEYPAD_GetKey();
As you can guess, the function return the ASCII value of the key being pressed. It is defined in keypad.c as below:
uint8_t KEYPAD_GetKey(void) { uint8_t i,j,v_KeyPressed_u8 = 0; keypad_WaitForKeyRelease(); keypad_WaitForKeyPress(); for (i=0;i<C_MaxRows_U8;i++) { GPIO_PinWrite(A_RowsPins_U8[i],HIGH); } for (i=0;(i<C_MaxRows_U8);i++) { GPIO_PinWrite(A_RowsPins_U8[i],LOW); for(j=0; (j<C_MaxCols_U8); j++) { if(GPIO_PinRead(A_ColsPins_U8[j]) == 0) { v_KeyPressed_u8 = 1; break; } } if(v_KeyPressed_u8 ==1) { break; } GPIO_PinWrite(A_RowsPins_U8[i],HIGH); } if(i<C_MaxRows_U8) v_KeyPressed_u8 = A_KeyLookUptable_U8[i][j]; else v_KeyPressed_u8 = C_DefaultKey_U8; return v_KeyPressed_u8; }