BÀN PHIM 4x4 AVR
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);
- }
Hãy xem xét hàm quan trọng nhất trong mã một cách chi tiết hơn
key = KEYPAD_GetKey();
Như bạn có thể đoán, hàm trả về giá trị ASCII của phím đang được nhấn. Nó tuân theo các trình tự sau để giải mã phím được nhấn:
Chờ cho đến khi KEYtrước đó được thực hiện hiển thị.
Chờ cho lần nhấn phím mới.
Quét lần lượt tất cả các hàng để tìm phím đã nhấn.
Giải mã phím được nhấn tùy thuộc vào tổ hợp ROW-COL và trả về giá trị ASCII của nó.
- 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;
- }