Keypad simple program
Keypad adalah salah satu komponen elektronik yg sangat bagus untuk mengurangkan pengunaan "push button" dalam sesuatu litar elektronik.. kebiasaannya keypad digunakan untuk set value (apa2 nilai yg dikehendaki.. contoh: nilai output analog sensor).. ataupun untuk membenarkan user memasukkan beberapa digit nombor seperti "3456".. keypad dikenali dengan bilangan button di column dan row nye... seperti keypad 3x4(3 column and 4 row) di bawah:
Jika anda seorang pro sejati ataupon pandai semulajadi.. anda juga boleh menghasilkan keypad sendiri tanpa membelinye di kedai2 elektronik yg berhampiran... di bawah adalah litar keypad:
#include <18F4550.h> // PIC18F4550 HEADER FILE
#fuses XT, NOWDT, NOPROTECT, PUT, NOBROWNOUT, NOLVP // EXTERNAL CLOCK, NO WATCH DOG TIMER, NO LOW VOLTAGE
#device adc=10 // USE 10 BIT ADC QUANTIZATION
#use delay (clock=4M) // 4 MHZ CRYSTAL ATAU KAU NYE KRISTAL APE
//CONFIGURE LCD KALAU ADE
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_C6
#define LCD_RW_PIN PIN_C7
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
//CONGIGURE KEYPAD
#define col0 PIN_B0
#define col1 PIN_B1
#define col2 PIN_B2
#define row0 PIN_B3
#define row1 PIN_B4
#define row2 PIN_B5
#define row3 PIN_B6
#define motor_input1 PIN_D0
#define motor_input2 PIN_D1
#define led_merah PIN_C1
#define led_kuning PIN_C0
#include <lcd.c> //#include untuk keypad ngan lcd mesti letak bawah configure
#include <flex_kbd.c>
//MAIN PROGRAM
void main()
{
int a,range[3],choose,d;
int32 value,rangec;
char k;
set_tris_d(0x00);
set_tris_c(0x00);
//clear dulu semua kaki output
output_low(motor_input1);
output_low(motor_input2);
output_low(led_merah);
output_low(led_kuning);
//FUNTION YG KENA PANGGIL KLU NK GUNE LCD NGAN KBD
lcd_init();
kbd_init();
//TULIS KAT LCD SURUH USER MASUK NILAI... NANTI KAU TUKARLAH APE...
printf(lcd_putc,"\fInsert range \nvalue(0-99):");//user set the initial temperature
//PULL UP SEMUA PORT B
port_b_pullups(TRUE);
//SETUP ANALOG NGAN CCP KALAU KAU ADE GUNE
setup_adc_ports( AN0_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
setup_timer_2(T2_DIV_BY_4,254,1);
setup_ccp1(ccp_pwm);
//SET KELAJUAN MOTOR
set_pwm1_duty(255);//full speed
//KEYPAD START BACA KAT SINI
for(a=1;a<=2;a++){
do{
k=kbd_getc();
if(k!=0){
if(k=='*'){}
else if (k=='#'){}
else
printf(lcd_putc,"%c",k);
//MEMANG KENA TOLAK NGAN 48 UTK TUKAR NILAI CHAR KE NILAI INTIGER
range[a]=k-48;
}}
while(k==0||k=='*'||k=='#');
}
delay_ms(500);
if(range[1]==1){
range[1]+=9;
}
else if(range[1]==0){}
else{
range[1]*=10;
}
choose=range[2]+range[1];
printf(lcd_putc,"\fYou choose\nrange:%d meter",choose);
delay_ms(700);
output_low(motor_input1);
output_low(motor_input2);
output_low(led_merah);
output_high(led_kuning);
while(true)
{
set_adc_channel(PIN_A0);
value=read_adc();
rangec=value*100/1023;//temperature formula
printf(lcd_putc,"\fRange:%u\nRange limit:%d",rangec,choose);
delay_ms(200);
d=rangec;
if(rangec==choose){
output_high(motor_input1);
output_low(motor_input2);
output_high(led_merah);
output_low(led_kuning);
}
else{
output_low(motor_input1);
output_low(motor_input2);
output_low(led_merah);
output_high(led_kuning);
} }}
Teorinya:
1)KBD_init() kena dipanggil sebelum command lain.
2)Gunakan fungsi array untuk susun bit digit.. contoh:48 sebagai 2 bit, so 2 column untuk array.
3)Semua kaki pin keypad kena pull-up dahulu sebelum menghantar signal.. boleh dilakukan dengan 2 cara iaitu:
a)Gunakan litar pull-up untuk semua kaki pin keypad melalui hardware(litar kita ler).
b)Gunakan command seperti "port_b_pullups(TRUE);" untuk pull-up semua kaki PIC b melalui program.
selamat mencuba:
video proteus simulasi:
Download:
Jika anda seorang pro sejati ataupon pandai semulajadi.. anda juga boleh menghasilkan keypad sendiri tanpa membelinye di kedai2 elektronik yg berhampiran... di bawah adalah litar keypad:
(klik gambar untuk besarkan)
Untuk memulakan program keypad ini... anda mestilah mendownload header file "flex_KBD.h" dahulu...
klik sini untuk download-->Download flex.kbd..selepas anda selesai mendownload fail flex_kbd.c..pastikan anda delete pin connection yang telah ditetapkan library tersebut pastu save semula..
CCS software juga menyediakan "KBD.h" sendiri tetapi Kaki untuk hubungkan keypad dan PIC telah ditetapkan.. jadi pengunaan flex_kbd sangat sesuai supaya kita boleh menntukan setiap Pin di keypad itu...
Untuk tutorial nie.. kita memrlukan kedua2 LCD dan keypad.... kita juga memerlukan motor dan motor driver(L293d)... padan kan setiap kaki keypad dan LCD seperti di bawah:
list component dalam proteus:
Connection:
LCD:
VDD,VEE-->5V(Ataupon ke Variable resistor untuk adjust contrast)(tiada connection dlm proteus pun xpe)
VSS-->Ground(tiada connection dlm proteus pun xpe)
E->PIN D2
RS->PIN C6
RW->PIN C7
D4,D5,D6,D7->PIN D4, PIN D5, PIN D6, PIN D7
Keypad:
Column 1,2,3->PIN B0,B1,B2
Row 1,2,3,4-> PIN B3,B4,B5,B6
Proteus:
(klik gambar untuk besarkan)
Program:
-Apa yg kita nk buat ialah:
1) PIC akan mintak range Variable resistor(simulasi kepada apa2 sensor,contoh:temperature sensor)
2)User akan masukkan range dari 0 hingga 99
3)PIC akan mengesan range itu..
4)Ubah variable resistor untuk mencapai range tersebut.. jika ya motor akan bergerak dan LED akan bertukar kepada merah.
5)Selain dari nilai range motor akan berhenti pusing dan LED kuning akan on.
Contoh program:
#include <18F4550.h> // PIC18F4550 HEADER FILE
#fuses XT, NOWDT, NOPROTECT, PUT, NOBROWNOUT, NOLVP // EXTERNAL CLOCK, NO WATCH DOG TIMER, NO LOW VOLTAGE
#device adc=10 // USE 10 BIT ADC QUANTIZATION
#use delay (clock=4M) // 4 MHZ CRYSTAL ATAU KAU NYE KRISTAL APE
//CONFIGURE LCD KALAU ADE
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_C6
#define LCD_RW_PIN PIN_C7
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
//CONGIGURE KEYPAD
#define col0 PIN_B0
#define col1 PIN_B1
#define col2 PIN_B2
#define row0 PIN_B3
#define row1 PIN_B4
#define row2 PIN_B5
#define row3 PIN_B6
#define motor_input1 PIN_D0
#define motor_input2 PIN_D1
#define led_merah PIN_C1
#define led_kuning PIN_C0
#include <lcd.c> //#include untuk keypad ngan lcd mesti letak bawah configure
#include <flex_kbd.c>
//MAIN PROGRAM
void main()
{
int a,range[3],choose,d;
int32 value,rangec;
char k;
set_tris_d(0x00);
set_tris_c(0x00);
//clear dulu semua kaki output
output_low(motor_input1);
output_low(motor_input2);
output_low(led_merah);
output_low(led_kuning);
//FUNTION YG KENA PANGGIL KLU NK GUNE LCD NGAN KBD
lcd_init();
kbd_init();
//TULIS KAT LCD SURUH USER MASUK NILAI... NANTI KAU TUKARLAH APE...
printf(lcd_putc,"\fInsert range \nvalue(0-99):");//user set the initial temperature
//PULL UP SEMUA PORT B
port_b_pullups(TRUE);
//SETUP ANALOG NGAN CCP KALAU KAU ADE GUNE
setup_adc_ports( AN0_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
setup_timer_2(T2_DIV_BY_4,254,1);
setup_ccp1(ccp_pwm);
//SET KELAJUAN MOTOR
set_pwm1_duty(255);//full speed
//KEYPAD START BACA KAT SINI
for(a=1;a<=2;a++){
do{
k=kbd_getc();
if(k!=0){
if(k=='*'){}
else if (k=='#'){}
else
printf(lcd_putc,"%c",k);
//MEMANG KENA TOLAK NGAN 48 UTK TUKAR NILAI CHAR KE NILAI INTIGER
range[a]=k-48;
}}
while(k==0||k=='*'||k=='#');
}
delay_ms(500);
if(range[1]==1){
range[1]+=9;
}
else if(range[1]==0){}
else{
range[1]*=10;
}
choose=range[2]+range[1];
printf(lcd_putc,"\fYou choose\nrange:%d meter",choose);
delay_ms(700);
output_low(motor_input1);
output_low(motor_input2);
output_low(led_merah);
output_high(led_kuning);
while(true)
{
set_adc_channel(PIN_A0);
value=read_adc();
rangec=value*100/1023;//temperature formula
printf(lcd_putc,"\fRange:%u\nRange limit:%d",rangec,choose);
delay_ms(200);
d=rangec;
if(rangec==choose){
output_high(motor_input1);
output_low(motor_input2);
output_high(led_merah);
output_low(led_kuning);
}
else{
output_low(motor_input1);
output_low(motor_input2);
output_low(led_merah);
output_high(led_kuning);
} }}
Teorinya:
1)KBD_init() kena dipanggil sebelum command lain.
2)Gunakan fungsi array untuk susun bit digit.. contoh:48 sebagai 2 bit, so 2 column untuk array.
3)Semua kaki pin keypad kena pull-up dahulu sebelum menghantar signal.. boleh dilakukan dengan 2 cara iaitu:
a)Gunakan litar pull-up untuk semua kaki pin keypad melalui hardware(litar kita ler).
b)Gunakan command seperti "port_b_pullups(TRUE);" untuk pull-up semua kaki PIC b melalui program.
selamat mencuba:
video proteus simulasi: