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.
Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bản CodeVisionAVR Tại Đây
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: