[HỌC AVR] BÀI 11: GIAO TIẾP MA TRẬN PHÍM 4×4

Xin chào các bạn!
Trong bài viết này, mình sẽ hướng dẫn các bạn lập trình giao ma trận phím 4×4 với Atmega16.
I.SƠ ĐỒ PHẦN CỨNG
Trên KIT AVR V4 hỗ trợ các bạn khối ma trận phím 4×4 có sơ đồ như sau:

Trong đó, kết nối với Atmega16:

COL1:4 kết nối với PORTA4:7.​
ROW1:4 kết nối với PORTA0:3.​

II.LẬP TRÌNH PHẦN MỀM
Trong bài toán này, mình sẽ lập trình hiển thị giá trị của các phím trên ma trận phím lên LCD16x2.
Các bạn cấu hình GPIO:

PORTC3:5 (chân điều khiển LCD16x2), PORTB4:7 (chân dữ liệu LCD16x2), PORTA0:3 (các chân hàng của MTP4x4) là OUTPUT với mức logic đầu ra ban đầu là mức 1.​
PORTA4:7 (các chân cột của MTP4x4) là INPUT và có trở kéo lên bên trong.​
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=P State6=P State5=P State4=P State3=1 State2=1 State1=1 State0=1
PORTA=0xFF;
DDRA=0x0F;
 
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=1 State6=1 State5=1 State4=1 State3=T State2=T State1=T State0=T
PORTB=0xF0;
DDRB=0xF0;
 
// Port C initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=1 State4=1 State3=1 State2=T State1=T State0=T
PORTC=0x38;
DDRC=0x38;

Các bạn sử dụng hàm đọc giá trị ma trận phím 4×4 (trong File key_4x4 thuộc Folder User):

uint8_t KEY4X4_GetKey(void)
{
    uint8_t i;
    KEY4X4_ROW1=KEY4X4_ROW2=KEY4X4_ROW3=KEY4X4_ROW4=0;
    if(KEY4X4_IsPush())
    {
        delay_ms(5);
        if(KEY4X4_IsPush())
        {         
            for(i=0;i<4;i++)
            {             
                KEY4X4_CheckRow(i);
                if(!KEY4X4_COL1) return KEY_4X4[i][0];
                if(!KEY4X4_COL2) return KEY_4X4[i][1];
                if(!KEY4X4_COL3) return KEY_4X4[i][2];
                if(!KEY4X4_COL4) return KEY_4X4[i][3];
            }     
        }
    }
    return 0;
}

Thực hiện chương trình chính:

    LCD16X2_Init();
LCD16X2_Gotoxy(0,0);
    LCD16X2_Puts(" MTP4x4 AVR V4  ");
 
    while(1)
    {
        Key=KEY4X4_GetKey();
        if(Key)
        {
            sprintf(Str,"Key = %c ",Key);
            LCD16X2_Gotoxy(0,1);
            LCD16X2_Puts(Str);
            while(Key)Key = KEY4X4_GetKey();
        }
    }

 

Link download File Code của chương trình TẠI ĐÂY:

Trao đổi học tập

Comments