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:

(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:

Download:


 Proteus nye file:

Popular posts from this blog

Relay

Pendahuluan: Proteus simulasi yg berguna

Electronic component:Resistor