I. Keypad 3x4 (Keypad - Phone).
Keypad là một "thiết bị nhập" chứa các nút nhấn cho phép người dùng nhập các chữ số, chữ cái hoặc ký hiệu vào bộ điều khiển. Keypad không chứa tất cả bảng mã ASCII như keyboard và vì thế keypad thường được tìm thấy trong các thiết bị chuyên dụng. Các nút nhấn trên các máy tính điện tử cầm tay là một ví dụ về keypad. Số lượng nút nhấn của một keypad thay đổi phụ thuộc vào yêu cầu ứng dụng. Trong bài này tôi giới thiệu cách điều khiển của một loại keypad đơn giản, keypad 3x4.
Gọi là keypad 3x4 vì keypad này có 12 nút nhấn được bố trí dạng ma trận 4 hàng và 3 cột. Cách bố trí ma trận hàng và cột là cách chung mà các keypad sử dụng. Cũng giống như các ma trận LED, các nút nhấn cùng hàng và cùng cột được nối với nhau, vì thế với keypad 3x4 sẽ có tổng cộng 8 ngõ ra (4 hàng và 3 cột). Mô hình Keypad 3x4 được thể hiện trong hình 1.
- Hình dạng ngoài thực tế của nó như hình bên dưới.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000
#define RS RB2
#define EN RB3
#define D4 RB4
#define D5 RB5
#define D6 RB6
#define D7 RB7
#include <xc.h>
#include "lcd.h"
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define HEATER PORTAbits.RA1
#define FAN PORTAbits.RA2
#define ON 1
#define OFF 0
void ADCinit(void);
int kbd_getc();
//#define set_port_kbd PORTB // Change if port is different
#define row1port RD0
#define row2port RD1
#define row3port RD2
#define row4port RD3
#define col1port RD4
#define col2port RD5
#define col3port RD6
//#define col4port PORTBbits.RB7 //if a 4x4 keypad is used
unsigned char const number[10] = {0,1,2,3,4,5,6,7,8,9};
char const keypad[] =
{
'1', '2', '3',
'4', '5', '6',
'7', '8', '9',
'*', '0', '#',
0xFF
};
char key,old_key;
//unsigned char stringKey[10],stringKeyActual[10];
unsigned long keypress;
void main(void) {
TRISB = 0x00;
TRISD = 0XF0;
Lcd_Init();
Lcd_Set_Cursor(1,2);
Lcd_Write_String("DEMO KEYPAD 3X4");
Lcd_Set_Cursor(2,3);
Lcd_Write_String("BY LAM 3 NGON");
__delay_ms(2000);
Lcd_Clear();
while (1){
keypress = kbd_getc();
if(keypress!=0xFF)
{
Lcd_Write_Char(keypress ) ;
}
}
}
int kbd_getc(){
// This routine returns the first key found to be pressed during the scan.
char key = 0, row;
for( row = 0b00000001; row < 0b00010000; row <<= 1 )
{
{ // turn on row output
row1port = (row & 0x0001)>>0;
row2port = (row & 0x0002)>>1;
row3port = (row & 0x0004)>>2;
row4port = (row & 0x0008)>>3;
__delay_ms(1);
}
// read colums - break when key press detected
if( col1port )break; key++;
if( col2port )break; key++;
if( col3port )break; key++;
//if( col4port )break; key++;
}
row1port = 0;
row2port = 0;
row3port = 0;
row4port = 0;
if (key!=old_key){
old_key=key;
return keypad[ key ];
}
else
return keypad[ 0x0C ];
}
EmoticonEmoticon