Keypad adalah satu set button yang disambung secara matrix. Kelebihan menggunakan keypad berbanding menggunakan button biasa adalah keypad memberikan lebih banyak button dan kurang I/O port. Contoh 4X4 keypad, memerlukan 8 port kerana ia disambung secara matrix.
Anda boleh juga membina sambungan sendiri dengan menggunakan push button. Sambungan bagi keypad adalah seperti di bawah.
Keypad adalah input module tetapi programnya perlu setkan 4 port sebagai input dan 4 port sebagai output.
Di bawah adalah videonya
Video keypad dengan seven segment
Video keypad dengan LCD HD44780
Video keypad dengan LCD Nokia 3310
PIC Source Code
/*
Project: Keypad Lesson
Programmer: Shahrulnizam Mat Rejab
PIC (Crystal Frequency):
PIC16F877A (20MHz), PIC16F887 (20MHz), PIC16F1939 (Internal 32MHz)
PIC18F4520 (10MHz), PIC18F4550 (10MHz), PIC18F46K22 (Internal 16MHz)
Compiler: HI-TECH C for PIC10/12/16 V9.83, PIC18 V9.80
Last Modified: 29 May 2015
Website: http://shahrulnizam.com
*/
//#define KEYPAD_PORTA
#define KEYPAD_PORTB
//#define SEGMENT PORTD
#define HD44780
#if defined (_18F46K22)
#define LCD_NOTUSE_RD6RD7
#endif
//#define PCD8544
#define SHAHRULNIZAM
#include "LibraryHardware.h"
#if defined (HD44780)
#include "LibraryUniversalDisplay.h"
#elif defined (PCD8544)
#include "LibraryChar.h"
#include "LibraryUniversalDisplay.h"
#endif
#if defined (SEGMENT)
static const char segment[]={ //.abcdefg
0b01111110,0b00110000,0b01101101,0b01111001,
0b00110011,0b01011011,0b01011111,0b01110000,
0b01111111,0b01111011,0b01110111,0b00011111,
0b01001110,0b00111101,0b01001111,0b01000111,
};
#endif
void setup()
{
initialize();
#if defined (KEYPAD_PORTA)
TRISA=0b00001111;
TRISB=0b00000000;
#elif defined (KEYPAD_PORTB)
TRISA=0b00000000;
TRISB=0b11110000;
#endif
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000000;
BUZZER=1;
#if defined (LCD_LIGHT)
LCD_LIGHT=1;
#endif
#if defined (HD44780)
lcd_init();
lcd_goto(0,0);
lcd_string(" KEYPAD LESSON ");
#elif defined (PCD8544)
glcd_init();
glcd_goto(0,0);
glcd_string(" ");
glcd_string(" ");
glcd_string("KEYPAD LESSON ");
glcd_string(" ");
glcd_string(" ");
glcd_string(" ");
#endif
}
void loop()
{
int keypad;
keypad=read_keypad();
#if defined (SEGMENT)
switch(keypad){
case 0:{SEGMENT=0b00000000;break;} //No Display
case 1:{SEGMENT=segment[1];break;} //Display 1
case 2:{SEGMENT=segment[2];break;} //Display 2
case 3:{SEGMENT=segment[3];break;} //Display 3
case 4:{SEGMENT=segment[4];break;} //Display 4
case 5:{SEGMENT=segment[5];break;} //Display 5
case 6:{SEGMENT=segment[6];break;} //Display 6
case 7:{SEGMENT=segment[7];break;} //Display 7
case 8:{SEGMENT=segment[8];break;} //Display 8
case 9:{SEGMENT=segment[9];break;} //Display 9
case 10:{SEGMENT=segment[0];break;} //Display 0
case 11:{SEGMENT=segment[14];break;} //Display E
case 12:{SEGMENT=segment[15];break;} //Display F
case 13:{SEGMENT=segment[10];break;} //Display A
case 14:{SEGMENT=segment[11];break;} //Display B
case 15:{SEGMENT=segment[12];break;} //Display C
case 16:{SEGMENT=segment[13];break;} //Display D
}
#elif defined (HD44780)
lcd_goto(0,1);
switch(keypad){
case 0:{lcd_string(" NO PRESS ");break;}
case 1:{lcd_string(" YOU PRESS 1 ");break;}
case 2:{lcd_string(" YOU PRESS 2 ");break;}
case 3:{lcd_string(" YOU PRESS 3 ");break;}
case 4:{lcd_string(" YOU PRESS 4 ");break;}
case 5:{lcd_string(" YOU PRESS 5 ");break;}
case 6:{lcd_string(" YOU PRESS 6 ");break;}
case 7:{lcd_string(" YOU PRESS 7 ");break;}
case 8:{lcd_string(" YOU PRESS 8 ");break;}
case 9:{lcd_string(" YOU PRESS 9 ");break;}
case 10:{lcd_string(" YOU PRESS 0 ");break;}
case 11:{lcd_string(" YOU PRESS * ");break;}
case 12:{lcd_string(" YOU PRESS # ");break;}
case 13:{lcd_string(" YOU PRESS A ");break;}
case 14:{lcd_string(" YOU PRESS B ");break;}
case 15:{lcd_string(" YOU PRESS C ");break;}
case 16:{lcd_string(" YOU PRESS D ");break;}
}
#elif defined (PCD8544)
glcd_goto(0,3);
switch(keypad){
case 0:{glcd_string(" NO PRESS ");break;}
case 1:{glcd_string(" YOU PRESS 1 ");break;}
case 2:{glcd_string(" YOU PRESS 2 ");break;}
case 3:{glcd_string(" YOU PRESS 3 ");break;}
case 4:{glcd_string(" YOU PRESS 4 ");break;}
case 5:{glcd_string(" YOU PRESS 5 ");break;}
case 6:{glcd_string(" YOU PRESS 6 ");break;}
case 7:{glcd_string(" YOU PRESS 7 ");break;}
case 8:{glcd_string(" YOU PRESS 8 ");break;}
case 9:{glcd_string(" YOU PRESS 9 ");break;}
case 10:{glcd_string(" YOU PRESS 0 ");break;}
case 11:{glcd_string(" YOU PRESS * ");break;}
case 12:{glcd_string(" YOU PRESS # ");break;}
case 13:{glcd_string(" YOU PRESS A ");break;}
case 14:{glcd_string(" YOU PRESS B ");break;}
case 15:{glcd_string(" YOU PRESS C ");break;}
case 16:{glcd_string(" YOU PRESS D ");break;}
}
#endif
}
36 responses to “PIC Lesson: Keypad”
sy pun ada buat yg ni ari tu hehe
tp tak jalan da pulak~
smpai skrg xtau sangkut kat mana hihi
Hardware betul ke tidak? Pastu check software. Kena faham betul2 mcm mana keypad ni beroperasi.
tq 4 share..
camne plak kalu melibatkan keypad 4×3?
keypad tu nnt akan interface plak dgn LCD?
jika keypad 4X3, edit function read_keypad dan delete ROW4(). Selepas function keypad return value, boleh buat condition utk display di LCD. Program LCD di LCD Lesson
mao bkin modul praktek mikro pake i/o keypad ney,,,
mohon bantuanny….
Maaf, tidak faham soalannya.
cmne nk gerak kn motor forward reverse pakai keypad?bley bantu tak?
Baca keypad dan masukkan dalam program DC Motor Lesson.
kalo pkai password tuk mngerakkan motor cmne lak?pkai pic ape?litar ape?mntk bntuan..
assalamulaikum…
saya ni baru dalam pic nie
saya na tanya , saya guna model PIC16F877, so macam mana pemasangan basic bagi ic ni?
kalau macam atmel , standard komponent yang perlu pasang macam kristal, reset button, ground, vcc dan macam2 lagi la kan, so kalau pic model ni macam mana?
ws, litar PIC ada di Apa Itu PIC.
Hi sir,
May I know what is use for each resistor connected to each of pins output of keypad 4×4 ?
Can I use PIC18F4550 to do same connections as urs ?
Linspire, the resistors will make voltage divider. Resistor 220 ohm to make sure 2 PIC pin not shorted.
salam,kalau saya nak gunakan coding nie utk pic16877a boleh tak?? ada apa2 config yg perlu ubah
ws, wanirham. Dulu saya gunakan PIC16F877A, skg ni saya dah gunakan PIC16F887. Lebih baik gunakan PIC16F887 kerana PIC16F887 ada fungsi tambahan dan harganya lebih murah. PIC16F877A dah ketinggalan zaman, tp kalau nak guna juga, code di atas kena buangkan address ANSEL dan ANSELH.
ok, sy ada try buat workspace baru utk compile program nie tapi still ada error undefined identifier
-saya gunakan MPLAB-IDE v8.46
hi,
i m english i love ur website its sooo awsome and helpfull for me thanks for ur help..
kalu nk guna lcd seriel menggantikan 7segment mcm mne en.sharul..blh terangkan x..
bohan, saya x pernah guna lg jd x boleh terangkan.
sy ada try buat program ni bila, compile program nie tapi still ada error undefined MCLRE_ON mcm mne nk bt….
bohan, disable kan line MCLRE_ON. PIC16F887 ada MCLRE_ON, PIC16F877A tiada MCLRE_ON.
Keypad adalah input module tetapi programnya perlu setkan 4 port sebagai input dan 4 port sebagai output
kenapa ?
Keypad sambungan nya secara matrix untuk kurangkan I/O.
So ?? Kenapa 4 output 4 input ?
Sebab keypad 4X4.
Tapi 16 button bukan semua input ?
Dah cakap dah, sebab sambungan nya matrix, x boleh semua input.
Jgn buang masa saya dgn soalan simple mcm ni, lebih baik tanya pada your lecturer. Saya bukan lecturer untuk cover subjek ni.
boleh terangkan sedikit macam mane nak tukar 7-segamnt kepada output LED sahaja.. dan untuk #include “LibraryHardware.h” untuk fine apa ya?
Hi, I’m interested in your work. It fascinates me. I had a few questions, such as. In your code you had
#include “LibraryHardware.h” //is this the pic itself?
#if defined (HD44780)
#include “LibraryUniversalDisplay.h” //what is this? if its an lcd? do i actually have to define it? I know if your doing a send function, including the name of the lcd isn’t actually required.
#elif defined (PCD8544)
#include “LibraryChar.h” //what is this
#include “LibraryUniversalDisplay.h” //what is this?
# endif
I’d like to test this myself, but I can’t seem to understand what the Library code represents, if you could assist me I’d appreciate that.
Hi, Darrell. All the library I create myself. You need to pay for that.
hello, i have a problem with my keypad, i use keypad at portB and LCD at portD and LVP disable, all of setting to PORTB as input keypad I’ve done but my keypad still not working. so, where is my mistake? thanks
here my code
OPTION_REG.B7 = 0; //Enable pullup resistor
TRISB = 1;
PORTB.F0 = 0;
PORTB.F1 = 0;
PORTB.F2 = 0;
PORTB.F3 = 0;
PORTB.F4 = 1;
PORTB.F5 = 1;
PORTB.F6 = 1;
PORTB.F7 = 1;
Hi Shahrul….In your source code i was identified that (#define SHAHRULNIZAM)…….If i rename it (#define AZRUL) in your source code means did have any error in source code when compiling??Can you explain it…
Azrul, can change, no error. There have define that in the LibraryHardware.h
Ok Shahrul…That means do we need to adjust anything in libraryhardware.h??? Which software do you use to compile it???mplab or mplab x???
I use MPLabX.
Ok Shahrul…Do we need to adjust anything in libraryhardware.h file and libraryuniversaldisplay.h file after renamed the file of (#define SHAHRULNIZAM) to (#define AZRUL)???