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

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)