Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Need Help doing C Language Programming for PIC18F4520 MPLAB lCD 3

Status
Not open for further replies.
could you please double check the connections from uC to LCD. Ensure with the multimeter if you have.
LCD enable pin to microcontroller Pin 6 of PORT D
LCD RS pin to microcontroller Pin 4 of PORT D
LCD R/W pin to microcontroller Pin 5 of PORT D
 

use this line
HTML:
#pragma config OSC = LP

instead of
HTML:
#pragma config OSC = HS
 

whats the difference between the two? changed but still the same..
 

read datasheet page no. 26 .
For 32Khz, fuses should be LP. for greater than 4MHZ crystal, it should be HS
 

I'm aware of programming in ccs c compiler. but still couldn't find the solution in your case for c18 compiler.

follow the link, and post the code in this forum for c18 compiler
https://www.microchip.com/forums/

someone can help you.
I too will try to solve the problem.
 

i post it there already. thanks for the help.
 

Proteus is a simulation software. you can test the circuit without building the hardware. It consists of all components, you have to load the components and connect it. import the hex file to microcontroller and run the simulation. If it works, some problem with your hardware.

It is very useful software. make use of it.
 

Oh. Too bad i can use the software, my lab technician won't help me install de....
 

can you search and post the driver "lcd.c" from the c18 installation folder. i think you can find it in the drivers folder. so that, i can try to change the code to your use.
 

///////////////////////////////////////////////////////////////////////////
//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2007 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;


#if defined use_portb_lcd
//#locate lcd = getenv("sfr:pORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:pORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#endif

#define lcd_line_two 0x40 // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.


// The following are used for setting
// the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}


void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING);
}


void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}


Here is the file
 

i found this code at online. Please compile and tell it is working or not.
HTML:
#include<p18f4520.h>
#include<delays.h>

#pragma config FOSC = LP

#pragma config WDT = OFF

#pragma config PWRT = OFF

#pragma config CP0 = OFF

#pragma config PBADEN = OFF

//LCD Control pins
#define en LATDbits.LATD6
#define rw LATDbits.LATD5
#define rs LATDbits.LATD4

//LCD Data pins
#define lcdport LATB


void dis_cmd(unsigned char);
void dis_data(unsigned char);
void lcdcmd(unsigned char);
void lcddata(unsigned char);
void lcd_ini(void);

void main(void)
{
	unsigned char data0[]="Hello";
	unsigned int i=0;
	rw = 0;
	TRISB=0;			// Configure Port B as output port
	LATB=0;
	TRISD = 0;
	LATD = 0;
	Delay10KTCYx(50);	//Delay_ms(100);
	lcd_ini();			// LCD initialization
	while(data0[i]!='\0')
	{
		dis_data(data0[i]);
		Delay10KTCYx(400);		//Delay_ms(800);
		i++;
	}
}
void lcd_ini()	                    
{
	Delay10KTCYx(10);	//Delay_ms(20)
	lcd_cmd(0x30);
	Delay10KTCYx(5);	//Delay_ms(10)
	lcd_cmd(0x30);
	Delay1KTCYx(1);		//Delay_us(200)
	lcd_cmd(0x30);

	lcd_cmd(0x20);           //Function set

	dis_cmd(0x28);		// To initialize LCD in 2 lines, 5x7 dots and 4bit mode.
	dis_cmd(0x0C);
	dis_cmd(0x06);
}

void dis_cmd(unsigned char cmd_value)
{
	unsigned char cmd_value1;
	cmd_value1 = (cmd_value & 0xF0);	// Mask lower nibble because RB4-RB7 pins are being used
	lcdcmd(cmd_value1);			// Send to LCD
	cmd_value1 = ((cmd_value<<4) & 0xF0);	// Shift 4-bit and mask
	lcdcmd(cmd_value1);			// Send to LCD
}


void dis_data(unsigned char data_value)
{
	unsigned char data_value1;
	data_value1=(data_value&0xF0);
	lcddata(data_value1);
	data_value1=((data_value<<4)&0xF0);
	lcddata(data_value1);
}

void lcdcmd(unsigned char cmdout)
{
	lcdport=cmdout;		//Send command to lcdport=PORTB
	rs=0;						
	rw=0;
	en=1;
	Delay10KTCYx(1);	//small delay
	en=0;
	Delay10KTCYx(25);	//Delay_ms(50);
}

void lcddata(unsigned char dataout)
{
	lcdport=dataout;	//Send data to lcdport=PORTB
	rs=1;
	rw=0;
	en=1;
	Delay10KTCYx(1);	//small delay
	en=0;
	Delay10KTCYx(25);	//Delay_ms(50);
}
 

The FOSC is the frequency right ?

- - - Updated - - -

got this from debugging 1.PNG
 

add this line before lcd control pins line, and compile
HTML:
#define _XTAL_FREQ 32000

Best wishes :)
 

Error - could not find definition of symbol 'lcd_cmd' in file './Test.o'.


Now this error
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top