lập trình với keypad

nguyenhongduc_nc

Thành Viên PIF
em đang nghiên cứu cách lập trình trên keypad nhưng e vẫn chưa hiểu rõ việc sử dụng nút nhấn(chống rung phím,quét phím,delay bao nhiêu là đúng,có dùng timer hay không,..)
Ai có lý thuyết về mấy cái này có thể giúp em được không...
em đã tìm đọc mấy cái code nhưng người thì sử dụng cách này ,người dùng cách kia....không bik...thế nào là đúng....
Mong mọi người giúp đỡ.....ai có code về keypad(có chú thích) share cho e và những bạn chưa bik cùng tìm hiểu ...Em xin cám ơn
 
/*****************************************************************
setup_PORT(void);
Description: PIN RB0-RB3: ROW OF MATRIX BUTTON
PIN RB4-RB7: COLUMN OF MATRIX BUTTON
COLUMN SACNNING
Input parameter: none
Return: none
******************************************************************/

void setup_PORT(void)
{
ANSEL = 0; //all pins are digital
ANSELH = 0;
TRISB = 0x00; // use port B as output
PORTB = 0xFF;
}

/*****************************************************************
read_keypad(void);
******************************************************************/

unsigned char read_keypad(void)
{
unsigned char tmp;
PORTB = 0xfE;
if ((tmp = read_row()) != 0xFF)
return tmp;

PORTB = 0xFD;
if ((tmp = read_row()) != 0xFF)
return (tmp + 4);

PORTB = 0xFB;
if ((tmp = read_row()) != 0xFF)
return (tmp + 8);

PORTB = 0xF7;
if ((tmp = read_row()) != 0xFF)
return (tmp + 12);

return 0xFF; // no button is pressed
}

unsigned char read_row(void)
{
unsigned char row = (PORTB & 0xF0);
switch(row)
{
case 0xE0:
return 0; // row 0
case 0xD0:
return 1; // row 1
case 0xB0:
return 2; // row 2
case 0x70:
return 3; // row 3
default:
return 0xFF; // no button is pressed
}
}

// Read the keypad 20 times for de-bounce
unsigned char keypad_debounce(void)
{
unsigned char temp;
temp = read_keypad();
for(unsigned char i = 20; i > 0; i--)
{
if(temp != read_keypad())
return 0xFF;
}
return temp;
}
Ở đây mình dùng hàm keypad_debounce để đọc keypad 20 lần liên tiếp để chống rung(nếu 20 lần có cùng kết quả thì nút đc nhấn, nếu có kết quả khác thì phím đang rung), trong thực tế thì mỗi lần nhấn phím thì thường nhanh cũng tốn 0.5s nên bạn có thể đọc keypad nhiều lần và cách nhau vài ms thì vẫn ổn (giữa các khoảng đó để làm việc khác).
 

nguyenquoctrung-hhk

Thành Viên PIF
lúc trước mình cũng đã lập trình được keypad 16 phím, nhưng cũng chỉ giới hạn từ số 1 đến 16, cũng có làm sẵn module, việc chống rung phím đơn giản nhất là bạn nên delay một khoảng thời gian thích hợp (điều này chỉ có cách bạn thử trực tiếp nhiều lần trên phần cứng mới nhận thấy được).
giải thuật như sau :
_xuất mức logic 1 (hoặc 0) cho toàn bộ các cột, điều này tùy theo module keypad jum lên Vcc hoặc Gnd. nếu jum lên Vcc thì xuất mức 0
bạn có thể coi module keypad ở đây View attachment MATRIXKEYPAD.rar
_quét hàng với thời gian delay nhỏ hơn 50Hz, bạn nên dùng timer0 để quét, quét để nhận biết có nút nào đã ấn, nếu ấn thì tại hàng đó cột tương ứng chân của PIC sẽ đọc mức 0, thì đồng thới xuất giá trị tại vị trí nút đó( cái này do mình quy định) ra POTR nối với LCD hoặc led 7segment.
_trước kia mình chưa biết phương pháp quét nên dùng phương pháp dò bạn có thể tham khảo code tại đây View attachment matrix.rar , code này mình không có chú thích bạn cứ đọc tìm hiểu, thắc mắc gì cứ lên diễn đàn trao đổi với mình, mục đích mình cũng muốn bạn đọc, chứ mình chú thích hết thì làm bạn không có động não,hihi.
từ đây bạn có thể mở rộng thêm thành bàn phím điện thoại ...
cố gắng nhé, chúc bạn thành công.
 

nguyenhongduc_nc

Thành Viên PIF
Cám ơn sự giúp đỡ của mọi người.....
Bạn nguyenquoctrung-hhk ,bạn có thể gửi lại file matrix.rar dc ko....Mình ko đọc dc....,hình như bị thiếu file ấy.....Cám ơn bạn nhiều...^^
 
Top