Menu

728x90

468x60

Navbar

Sunday, January 21, 2024

PIC16F887 MCP23017 LCD and Keypad Interfacing using XC8

In previous post, I use the MCP23017 16-bit I/O expander chip to interface with LED and DIP switch, 4x4 matrix keypad, and the HD44780 based character LCD. Here I will put them altogether using a 4x4 matrix keypad and a 16x2 character LCD.

PIC16F887 MCP23017 LCD and Keypad Interfacing using XC8
Program Start Up

In this example, the micro-processor keep tracks of keypad scanning. When the a key-press is detected it will send to a 16x2 character LCD via the MCP23017 I2C communication interface. The LCD is automatically create new line and return home by software.

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on January 22, 2024, 9:04 AM
  6.  */
  7.  
  8. #include <xc.h>
  9. #include "config.h"
  10. #include "mcp23017.h"
  11.  
  12. #define _XTAL_FREQ 8000000
  13.  
  14. void main(void) {
  15. OSCCONbits.IRCF=7;
  16. __delay_ms(100);
  17. lcd_init();
  18. __delay_ms(100);
  19. lcd_text(" MCP23017 I2C");
  20. lcd_xy(1,2);
  21. lcd_text(" LCD Key Pad");
  22. __delay_ms(3000);
  23. lcd_clear();
  24. uint8_t temp,counter=0,new_line=0,line_num=1;
  25. while(1){
  26. temp=keyScan();
  27. if(temp!=0xFF){
  28. lcd_data(temp);
  29. counter++;
  30. __delay_ms(250);
  31. }
  32. if(counter>=16) {counter=0; new_line=1;}
  33. if(new_line){
  34. new_line=0;
  35. line_num++;
  36. if(line_num==2) lcd_xy(1,2);
  37. if(line_num==3){lcd_clear(); line_num=1;}
  38. }
  39. }
  40. return;
  41. }
  42.  

The PIC16F887 use the I2C clock frequency of 400kHz without disruption. Program simulation in Proteus doesn't run smoothly. So I need to test this firmware on a prototype board next.

PIC16F887 MCP23017 LCD and Keypad Interfacing using XC8
Keypad Scanning and LCD Display Tasks

Click here to download this example package from GitHub.



No comments:

Post a Comment

336x280

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (133) Distance Sensor (3) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (10) PIC (108) 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 (13) SH1106 (3) Shift Register (13) Shift Registers (10) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)