Cách dùng bàn phím ma trn 4x4(for AVR)
Nhng đim khác cơ bn ca phn code này so vi code ví d đã đưa:
- Ngn gn hơn
- Không tn Timer
- Chng rung phím đơn gin, hiu qu (không dùng delay)
- D định nghĩa cho các loi bàn phím khác nhau
File Key4x4.h
Code:
#ifndef _KEY4X4_H_
#define _KEY4X4_H_
//-----------------------------------------------------------------//
// ----- Define Hardware ------//
#define KEY4X4_PORT PORTC
#define KEY4X4_PIN PINC
#define KEY4X4_DDR DDRC
unsigned char KeyPad[4][4] = {
'7', '8', '9', '/',
'4', '5', '6', 'x',
'1', '2', '3', '-',
'C', '0', '=', '+'};
/*
unsigned char KeyPad[4][4] = {
'1', '2', '3', 'A',
'4', '5', '6', 'B',
'7', '8', '9', 'C',
'#', '0', '*', 'D'};
// ----- Define Firmware ------//
*/
#endif
/* HARDWARE CONNECTION
1 PD0 -------0----1----2----3
| | | |
2 PD1 -------4----5----6----7
| | | |
3 PD2 -------8----9----10---11
| | | |
4 PD3 -------12---13---14---15
R1 | | | |
5 PD4 -~~~~~-| | | |
R2 | | |
6 PD5 -~~~~~------| | |
R3 | |
7 PD6 -~~~~~-----------| | R1..R4=10k..47k
R4 |
8 PD7 -~~~~~----------------|
*/
File Key4x4.c
Code:
/*****************************************************
Project : Keypad Matrix 4x4
Version : 1.0
Date : 07-11-2007
Author : Nam
Company : PYT
Chip type : ATmega16
Program type : Application
Clock frequency : 12 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "key4x4.h"
//-----------------------------------------------------------------//
// Global variables
uint8_t key_old_state[4][4];
//------------------------------------------------------------------------------/
/
void check_key()
{
for (uint8_t row=0; row<4; row++) {
KEY4X4_PORT = (1<<row); //select row
for (uint8_t col=0; col<4; col++) {
uint8_t key_cur_state = (KEY4X4_PIN>>col+4) & 1;
if (key_cur_state && (!key_old_state[row][col])) {
uint8_t key_code = KeyPad[row][col];
lcd_putchar(key_code);
}
key_old_state[row][col] = key_cur_state;
}
}
}
//------------------------------------------------------------------------------/
/
int main(void)
{
// ----------------- Input/Output Ports initialization ---------------
KEY4X4_PORT = 0xFF; // Pull-up R
KEY4X4_DDR = 0x0F; // 4 row -> output, 4 col -> input
lcd_init(16);
// Global enable interrupts
sei();
while (1) {
check_key();
}; //while
}
1. phn Hadware connection: các pins PD4...PD7 nhw hình v là ni qua R1...R4 ri mi vào nút nhn. Còn nếu là pull-up thi ni vào nút nhn và
ni lên V+. Vy chính xác là kiu nào?
Tôi tìm hiu hóa ra thế này: Đối vi AVR do có R pullups bên trong nên dùng phn mm cài đặt, không cn R ngoài kéo lên...Nếu có như sơ đồ ca
tintintin thì h gii thích là tránh ngn mch gia các cc ca IC. Các IC không có R pullups bên trong thì phi có R ngoài kéo lên V+...
2. v cái này thì trong codevision có example ri đấy. vào đó m file này mà coi.
cách viết khá hay, dùng timer, mi ln ch quét mt ct, có chng rung, chng nhiu, ngoài ra còn có thi gian release phím na. dùng cho
trường hp bn cn nhn phím nhn liên tc thay vì nhn nhiu ln.
tuy nhiên để d s dng và điu chnh linh hot thì chc là cn sa cái exp đó mt tí.
Code C quét phím - chng di phím cho AVR dùng codevision lp trình
Khi bn nhn mt phím và gi bt kì bao lâu cũng được, khi nh phím ra nó mi
thc hin.
- Kết ni phn cng bàn phím ma trn 4x4, 4 chân ni vào 4 bit thp ca portB,
4 chân ni vào 4 bit cao ca portB.
- Phuơng pháp quét phím cp đin ln lượt 4 chân bít thp, kim tra s thay đổi
4 chân bit cao. khi nào có s thay đổi nhy đến phn chng di phím, sau đó
x lí s kin có phím nhn.
Code quét phím:
while(1)
{
DDRB=0x0F;
PORTB=0;
PORTB.0=1;
delay_ms(5);
if (PINB>15) break;
PORTB=0;
PORTB.1=1;
delay_ms(5);
if (PINB>15) break;
PORTB=0;
PORTB.2=1;
delay_ms(5);
if (PINB>15) break;
PORTB=0;
PORTB.3=1;
delay_ms(5);
if (PINB>15) break;
}
Code ch ng d i phím
void chongdoi(void)
{ int i;
loinhan:;
for (i=0;i<=50;i++) // khi có phím nh n s nh y đ n đây ế
{
if (PINB<=15) goto loinhan; //đ m b o kg còn d i n a
}
ma_key=PINB; // luu gia tri portB
delay_ms(50);
while(1)
{
if (PINB<=15) //đ i phím nh ra
{
loinha:;
for (i=0;i<=50;i++)
{
if (PINB>15) goto loinha;
}
break;
}
}
PORTB=0; //reset PORTB
}