Menu

Adskeeper - header widge

728x90

Search This Blog

468x60

Navbar

AdsKeeper - IAB Display Standard Ad Unit

Sunday, October 18, 2026

PIC18F4550 and HD44780 LCD Interfacing Example using MikroC

Overview

The HD44780 alphanumeric display has been using for many years now. In early years, it is commonly found in some electronic and control system, laser printers, etc. At that time, interfacing this LCD with an 8-bit micro-controller and programming in Assembly language was common. This display controller uses the Motorola 6800 data bus with three control signals, Register Select (RS), Read/Write (R/W), and Enable (E). However it support a 4-bit data transfer mode that split the 8-bit data into higher nibble and lower nibble, in which the higher nibble sent and latched first.

 

PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
A Blue Back LED 16x2 Character LCD


PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
A Blue Back LED 16x2 Character LCD

 

Currently, this display controller still in used. It is very popular among students, engineer, hobbyists, and small electronic control projects. There are a lot of replacement controllers available at very low cost and riches in dimensions. Using this LCD with and Arduino is very popular due to its ready-to-use module and libraries. This display can be converted into a serial communication interface such as I2C or SPI.

 

PIC18F4550 and a 16x2 LCD Example

MikroC has a lot of hardware libraries even in free mode. We can follow its example programs in its reference manual. To get started, I repeat an example code in its Lcd Libary. There are some library functions that we need to know especially the LCD pins declaration.

Library Routines

The LCD pins declaration such as R/S, E, and D7:4 must be putted first at the head of C source code before these functions can be called. For more information please see its Help file in the compiler IDE. 

Schematic

 

PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
Schematic

 

 

MikroC Source Code




  1. // LCD module connections
  2. sbit LCD_RS at RD2_bit;
  3. sbit LCD_EN at RD3_bit;
  4. sbit LCD_D4 at RD4_bit;
  5. sbit LCD_D5 at RD5_bit;
  6. sbit LCD_D6 at RD6_bit;
  7. sbit LCD_D7 at RD7_bit;

  8. sbit LCD_RS_Direction at TRISD2_bit;
  9. sbit LCD_EN_Direction at TRISD3_bit;
  10. sbit LCD_D4_Direction at TRISD4_bit;
  11. sbit LCD_D5_Direction at TRISD5_bit;
  12. sbit LCD_D6_Direction at TRISD6_bit;
  13. sbit LCD_D7_Direction at TRISD7_bit;
  14. // End LCD module connections

  15. char txt1[] = "mikroElektronika";
  16. char txt2[] = "EasyPIC6";
  17. char txt3[] = "Lcd4bit";
  18. char txt4[] = "example";

  19. char i; // Loop variable

  20. void Move_Delay() { // Function used for text moving
  21. Delay_ms(500); // You can change the moving speed here
  22. }

  23. void main(){


  24. Lcd_Init(); // Initialize LCD

  25. Lcd_Cmd(_LCD_CLEAR); // Clear display
  26. Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
  27. Lcd_Out(1,6,txt3); // Write text in first row

  28. Lcd_Out(2,6,txt4); // Write text in second row
  29. Delay_ms(2000);
  30. Lcd_Cmd(_LCD_CLEAR); // Clear display

  31. Lcd_Out(1,1,txt1); // Write text in first row
  32. Lcd_Out(2,5,txt2); // Write text in second row

  33. Delay_ms(2000);

  34. // Moving text
  35. for(i=0; i<4; i++) { // Move text to the right 4 times
  36. Lcd_Cmd(_LCD_SHIFT_RIGHT);
  37. Move_Delay();
  38. }

  39. while(1) { // Endless loop
  40. for(i=0; i<8; i++) { // Move text to the left 7 times
  41. Lcd_Cmd(_LCD_SHIFT_LEFT);
  42. Move_Delay();
  43. }

  44. for(i=0; i<8; i++) { // Move text to the right 7 times
  45. Lcd_Cmd(_LCD_SHIFT_RIGHT);
  46. Move_Delay();
  47. }
  48. }
  49. }

 

DIY PIC18F4550 Prototype Board

I tested this example on my DIY PIC18F4550 Prototype Board.

 

PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
PIC18F4550 Prototype Board


PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
PIC18F4550 Prototype Board


 


 

On-board Switches and LCD Example

In this example, when one of two on-board push buttons is pressed it will shows its state - Press or Released. The schematic is shown in the example above.

MikroC Source Code

 




  1. #define SW4 RB4_bit
  2. #define SW5 RB5_bit

  3. // LCD module connections
  4. sbit LCD_RS at RD2_bit;
  5. sbit LCD_EN at RD3_bit;
  6. sbit LCD_D4 at RD4_bit;
  7. sbit LCD_D5 at RD5_bit;
  8. sbit LCD_D6 at RD6_bit;
  9. sbit LCD_D7 at RD7_bit;

  10. sbit LCD_RS_Direction at TRISD2_bit;
  11. sbit LCD_EN_Direction at TRISD3_bit;
  12. sbit LCD_D4_Direction at TRISD4_bit;
  13. sbit LCD_D5_Direction at TRISD5_bit;
  14. sbit LCD_D6_Direction at TRISD6_bit;
  15. sbit LCD_D7_Direction at TRISD7_bit;
  16. // End LCD module connections


  17. void main(){

  18. /// PORTB AS INPUT
  19. PORTB = 0;
  20. LATB = 0;
  21. TRISB = (1<<5)|(1<<4);
  22. // ENABLE PORTB PULL-UP
  23. INTCON2 &=~(1<<7);
  24. // DISABLE ANALOG INPUTS
  25. ADCON1 = 0x0F;
  26. Lcd_Init(); // Initialize LCD

  27. Lcd_Cmd(_LCD_CLEAR); // Clear display
  28. Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

  29. Lcd_Out(1,1,"PIC18F4550 LCD");
  30. Lcd_out(2,1,"Buttons Example");

  31. Delay_ms(7000);
  32. Lcd_Cmd(_LCD_CLEAR); // Clear display
  33. Lcd_Out(1,1, "Press on SW4.");
  34. Lcd_Out(2,1, "Press on SW5.");
  35. while(1){
  36. if(SW4==0){
  37. Lcd_Out(1,1, "SW4 is Pressed.");
  38. while(SW4 == 0);
  39. Lcd_Out(1,1, "SW4 is Released.");
  40. }
  41. if(SW5==0){
  42. Lcd_Out(2,1, "SW5 is Pressed.");
  43. while(SW5 == 0);
  44. Lcd_Out(2,1, "SW5 is Released.");
  45. }
  46. }
  47. }

 

Example Pictures

I tested this example on my DIY PIC18F4550 Prototype Board.

 

PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
My DIY PIC18F4550 Prototype Board


PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
My DIY PIC18F4550 Prototype Board


PIC18F4550 and HD44780 LCD Interfacing Example using MikroC
My DIY PIC18F4550 Prototype Board

 

 


 

  

No comments:

Post a Comment

Adskeep- Standard Ads

Electronics and Programming Tutorials

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 (157) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (6) ds3231 (2) ds3232 (2) dsPIC (16) dsPIC30F1010 (3) dsPIC30F2010 (15) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (13) I2C (40) ILI9341 (1) Input/Output (85) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (88) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) MikroC dsPIC (11) MikroC PIC (2) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (5) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (13) PIC (122) 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 (14) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PLL (1) PWM (12) RTC (13) SBN0064G (1) Sensor (15) SH1106 (3) Shift Register (15) Shift Registers (19) SN74HC595N (9) Software SPI (1) Software TWI (3) 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)