Menu

Adskeeper - header widge

728x90

Search This Blog

468x60

Navbar

AdsKeeper - IAB Display Standard Ad Unit

Tuesday, January 16, 2024

PIC16F887 KeyPad and Character LCD Example using XC8

A keypad scanning program is common for most of micro-controller programming students. It usually done by the Assembly language programming in a micro-processor class in university. However using C compiler to program the keypad scanning process is very easy, and it's almost readable for most C programmers.

PIC16F887 KeyPad and Character LCD Example using XC8
Simulating Program

Using a single 8-bit I/O port can make a 4x4 (16 keys) matrix keypad. It's divided into two nibbles, one nibble for output and another nibble for input data.

PIC16F887 KeyPad and Character LCD Example using XC8
Arduino 4x4 Matrix Keypad Module

 

In this example, I use a PIC16F887 micro-controller to scan a 4x4 matrix keypad. Input key will show on a 16x2 character LCD. 

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on January 16, 2024, 7:46 PM
  6.  */
  7.  
  8. #include <xc.h>
  9. #include "config.h"
  10. #include "LCD4Bits.h"
  11.  
  12. #define _XTAL_FREQ 8000000UL
  13.  
  14. uint8_t key_16[][4]={'7','8','9','F',
  15. '4','5','6','E',
  16. '1','2','3','D',
  17. 'A','0','B','C'};
  18.  
  19. uint8_t scanKey(void){
  20. char data=0,temp;
  21. for(uint8_t i=0;i<4;i++){
  22. PORTB=1<<i;
  23. data=PORTB&0xF0;
  24. if(data&(1<<4)) {temp=key_16[i][0]; break;}
  25. else if(data&(1<<5)){temp=key_16[i][1]; break;}
  26. else if(data&(1<<6)){temp=key_16[i][2]; break;}
  27. else if(data&(1<<7)){temp=key_16[i][3]; break;}
  28. else temp=0;
  29. __delay_ms(10);
  30. }
  31. return temp;
  32. }
  33.  
  34. void main(void) {
  35. OSCCONbits.IRCF=7;
  36. uint8_t temp,count=0,row=0;
  37. PORTB=0;
  38. TRISB=0xF0;
  39. ANSELH=0;
  40. lcdInit();
  41.  
  42. while(1){
  43. temp=scanKey();
  44. if(temp!=0){
  45. lcdData(temp);
  46. count++;
  47. __delay_ms(250);
  48. }
  49. if(count>16){count=0; lcdCommand(0xC0); row+=1;}
  50. if(row>=2) {
  51. count=0;
  52. lcdXY(1,1);
  53. lcdCommand(0x01);
  54. __delay_ms(10);
  55. row=0;
  56. }
  57. }
  58. return;
  59. }
  60.  

After a 16 key-press count, a new line will start. After two lines, the display will clear, and it will return home.

Click here to download this example from GitHub. See also,

No comments:

Post a Comment

Adskeep- Standard Ads

336x280

DIY Electronic Projects And Instruments

AdsKeeper - 2091654

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (40) Analog Comparator (1) Arduino (16) ARM (32) AT89C52 (7) ATMega32 (59) ATMega644P (27) AVR (88) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (5) Display (156) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (6) ds3231 (1) ds3232 (2) dsPIC (15) dsPIC30F1010 (3) dsPIC30F2010 (15) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (11) I2C (40) ILI9341 (1) Input/Output (83) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (86) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) MikroC dsPIC (10) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (5) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (12) PIC (119) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (15) SH1106 (3) Shift Register (15) Shift Registers (19) SN74HC595N (9) Software SPI (1) Software TWI (2) SPI (44) sprinf (3) ST7735 (1) STM32 (29) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (23) STM32CubeIDE (32) STM32F103C8T6 (9) STM32F103R6 (18) STM32F401CCU6 (1) SysTick (7) temperature sensor (15) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (11) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)