Re: Windows 10/PIC18F4550/MPLAB X IDE v5.25/XC8 v2.10/PICKit2 V2.61/PICCircuits programmer/Built on my custom "Lunch Break" board, which is a "Pinguino" type PCB with sockets for the pin connections/All pin placements confirmed and checked for continuity/Pin to Pin wiring for control lines/Breadboard for the power distribution and the Contrast Pot./DuPont wires and a few jumpers.
I used this tutorial to make my first attempt at using a display with a PIC.
https://www.electronicwings.com/pic/lcd16x2-interfacing-with-pic18f4550See file links.
It came with the code and hex. The compiler said that the code needed to be updated (pre-v5?.) I accepted that.
I cleaned/compiled the code and noticed that it did compile successfully, but with some errors. Then I thought to check to see if there was a hex provided in the project. There was, so I flashed it to the PIC to avoid the compiling errors.
All that the author’s hex displayed was “Ewings” on the top row from positions 0 through 6 and the back light. See picture. The character contrast will vary with the pot.
So, let’s compile the code and see what we get…
/*
* Interfacing 16x2 LCD with PIC18F4550
* [url=http://www.electronicwings.com]www.electronicwings.com[/url]
*/
#include <pic18f4550.h>
#include "Configuration_Header_File.h"
#define RS LATD0 /*PORTD 0 pin is used for Register Select*/
#define EN LATD1 /*PORTD 1 pin is used for Enable*/
#define ldata LATB /*PORTB is used for transmitting data to LCD*/
#define LCD_Port TRISB /*define macros for PORTB Direction Register*/
#define LCD_Control TRISD /*define macros for PORTD Direction Register*/
void LCD_Init();
void LCD_Command(char );
void LCD_Char(char x);
void LCD_String(const char *);
void LCD_String_xy(char ,char ,const char*);
void MSdelay(unsigned int);
/*****************************Main Program*******************************/
void main(void)
{
OSCCON=0x72; /*Use Internal Oscillator with Frequency 8MHZ*/
LCD_Init(); /*Initialize 16x2 LCD*/
LCD_String_xy(1,5,"Hello"); /*Display string at location(row,location).
* This function passes string to display*/
LCD_String_xy(2,0,"ElectronicWings"); /*Display string at location(row,location).
* This function passes string to display*/
while(1);
}
/****************************Functions********************************/
void LCD_Init()
{
MSdelay(15); /*15ms,16x2 LCD Power on delay*/
LCD_Port = 0x00; /*Set PORTB as output PORT for LCD data(D0-D7) pins*/
LCD_Control = 0x00; /*Set PORTD as output PORT LCD Control(RS,EN) Pins*/
LCD_Command(0x38); /*uses 2 line and initialize 5*7 matrix of LCD*/
LCD_Command(0x01); /*clear display screen*/
LCD_Command(0x0c); /*display on cursor off*/
LCD_Command(0x06); /*increment cursor (shift cursor to right)*/
}
void LCD_Clear()
{
LCD_Command(0x01); /*clear display screen*/
}
void LCD_Command(char cmd )
{
ldata= cmd; /*Send data to PORT as a command for LCD*/
RS = 0; /*Command Register is selected*/
EN = 1; /*High-to-Low pulse on Enable pin to latch data*/
NOP();
EN = 0;
MSdelay(3);
}
void LCD_Char(char dat)
{
ldata= dat; /*Send data to LCD*/
RS = 1; /*Data Register is selected*/
EN=1; /*High-to-Low pulse on Enable pin to latch data*/
NOP();
EN=0;
MSdelay(1);
}
void LCD_String(const char *msg)
{
while((*msg)!=0)
{
LCD_Char(*msg);
msg++;
}
}
void LCD_String_xy(char row,char pos,const char *msg)
{
char location=0;
if(row<=1)
{
location=(0x80) | ((pos) & 0x0f); /*Print message on 1st row and desired location*/
LCD_Command(location);
}
else
{
location=(0xC0) | ((pos) & 0x0f); /*Print message on 2nd row and desired location*/
LCD_Command(location);
}
LCD_String(msg);
}
/*********************************Delay Function********************************/
void MSdelay(unsigned int val)
{
unsigned int i,j;
for(i=0;i<=val;i++)
for(j=0;j<81;j++); /*This count Provide delay of 1 ms for 8MHz Frequency */
}
Here are the hiccups…
CLEAN SUCCESSFUL (total time: 78ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/t1dun/Documents/HP Compaq/Documents/Display/1602 Pic18F4550 Hello Test/PIC18F4550_LCD_16x2_8-bit_Project_File/LCD_16x2_8_bit.X'
make -f nbproject/Makefile-default.mk dist/default/production/LCD_16x2_8_bit.X.production.hex
make[2]: Entering directory 'C:/Users/t1dun/Documents/HP Compaq/Documents/Display/1602 Pic18F4550 Hello Test/PIC18F4550_LCD_16x2_8-bit_Project_File/LCD_16x2_8_bit.X'
"C:\Program Files (x86)\Microchip\xc8\v2.10\bin\xc8-cc.exe" -mcpu=18F4550 -c -fno-short-double -fno-short-float -memi=wordwrite -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto -o "build/default/production/LCD 16x2.p1" "LCD 16x2.c"
"C:\Program Files (x86)\Microchip\xc8\v2.10\bin\xc8-cc.exe" -mcpu=18F4550 -Wl,-Map=dist/default/production/LCD_16x2_8_bit.X.production.map -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -fno-short-double -fno-short-float -memi=wordwrite -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/LCD_16x2_8_bit.X.production.elf "build/default/production/LCD 16x2.p1"
LCD 16x2.c:48:: warning: (520) function "_LCD_Clear" is never called
LCD 16x2.c:27:: warning: (1518) direct function call made with an incomplete prototype (LCD_Init)
Memory Summary:
Program space used 184h ( 388) of 8000h bytes ( 1.2%)
Data space used Eh ( 14) of 800h bytes ( 0.7%)
Configuration bits used 7h ( 7) of 7h words (100.0%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
ID Location space used 8h ( 8) of 8h bytes (100.0%)
Data stack space used 0h ( 0) of 7A0h bytes ( 0.0%)
make[2]: Leaving directory 'C:/Users/t1dun/Documents/HP Compaq/Documents/Display/1602 Pic18F4550 Hello Test/PIC18F4550_LCD_16x2_8-bit_Project_File/LCD_16x2_8_bit.X'
make[1]: Leaving directory 'C:/Users/t1dun/Documents/HP Compaq/Documents/Display/1602 Pic18F4550 Hello Test/PIC18F4550_LCD_16x2_8-bit_Project_File/LCD_16x2_8_bit.X'
BUILD SUCCESSFUL (total time: 6s)
Loading code from C:/Users/t1dun/Documents/HP Compaq/Documents/Display/1602 Pic18F4550 Hello Test/PIC18F4550_LCD_16x2_8-bit_Project_File/LCD_16x2_8_bit.X/dist/default/production/LCD_16x2_8_bit.X.production.hex...
Loading completed
=========================================================================
So, I see various issues/possibilities…
1) The hex code was built on slightly different code and only contains (and was only intended to contain) the word “Ewings.” Meaning, that the display that I am seeing is what was intended to be displayed by the hex that was provided, but it is different than what is in the tutorial code.
2) LCD_Init(); /*Initialize 16x2 LCD*/ LCD_Init()
The warning is that LCD_Init(); is an incomplete prototype. To correct this I should add the word “void” as follows:
LCD_Init(void);
3) As the function void LCD_Clear() was never called in main, the data might be displayed in a confused way. To correct this I should add the call to clear in main as follows:
LCD_Init(); /*Initialize 16x2 LCD*/
LCD_Clear(); /*Corrective addition of call of the function to clear display.*/
LCD_String_xy(1,5,"Hello"); /*Display string at location(row,location).
Please remember that I am very much a novice. These ideas are just my thoughts. And, even if I am correct in what I suggest needs to be done to make things right, I don’t really have a complete understanding. However, that is only natural, as I am still learning.
I look forward to your thoughts and suggestions. Thank you for your help.