PIC Lesson: Keypad


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”

  1. 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?

  2. 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 ?

    • 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.

  3. ok, sy ada try buat workspace baru utk compile program nie tapi still ada error undefined identifier
    -saya gunakan MPLAB-IDE v8.46

  4. sy ada try buat program ni bila, compile program nie tapi still ada error undefined MCLRE_ON mcm mne nk bt….

  5. Keypad adalah input module tetapi programnya perlu setkan 4 port sebagai input dan 4 port sebagai output

    kenapa ?

    • 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.

  6. boleh terangkan sedikit macam mane nak tukar 7-segamnt kepada output LED sahaja.. dan untuk #include “LibraryHardware.h” untuk fine apa ya?

  7. 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.

  8. 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;

  9. 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…

  10. 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???

  11. 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)???

Leave a Reply to vick Cancel reply

Your email address will not be published. Required fields are marked *