LCD With microcontroller.....

Status
Not open for further replies.
Ritesh Where is this routine
LCD_printR(LCDbuffer);

You haven't included it... You need to copy it over from the code I gave you....
 
I have the code here

Code:
void LCD_printR(char* str);  // Function prototype


void LCD_printR(char* str)  // Function.
	{
	while(*str != 0)
		LCDdata(*str++);
	}
 
I have it....I am using 5V not 4.88V but it should work below the level..

Code:
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
__CONFIG(LVP_OFF & BOREN_OFF & PWRTE_ON & WDTE_OFF & FOSC_HS);
#define _XTAL_FREQ 20000000
 
#define DATA PORTB
#define EN RC4
#define RS RC6
#define RW RC5
#define N 25
#define M 20
int number=0;
int ch=0;
unsigned char LCDbuffer[17];
unsigned char m[11]="Voltmeter";
void LCDcmd(char x), LCDdata(char x);
void LCD_goto(char line, char column)	;
int ReadADC();
 void LCD_printR(char *str);

main(){
	TRISB=0X00;
	TRISC=0X00;
TRISA = 0xff ;
ADCON1=0b00000000;
ADCON0=0b10000001;//000 = channel 0, (RA0/AN0)
	ADIF=0;
	ADIE=1;
	PEIE=1;

__delay_ms(50);
 	LCDcmd(0x38); // init
	__delay_ms(N);
	LCDcmd(0x38); // init
	__delay_ms(N);
	LCDcmd(0x38); // Function set
	__delay_ms(N);
 	LCDcmd(0x06); // Cursor move increase, no display shift
	__delay_ms(N);
	LCDcmd(0x0C); // Display on, cursor off, not blinking

	__delay_ms(N);
	LCDcmd(0x01); // Clear display. goto pos 1
 	__delay_ms(N);

	while(1){


LCD_goto(1,2);
LCD_printR(m);

LCD_goto(2,2);
number = ReadADC();

number = number * 5000 / 1023;
LCDbuffer[0]= (number / 1000)+ 48;
if(LCDbuffer[0] == 48) LCDbuffer[0]= 0x20;
	LCDbuffer[1] = ((number % 1000) / 100)+ 48;
	LCDbuffer[2] = 46;
	LCDbuffer[3] = ((number % 100) / 10)+ 48;
	LCDbuffer[4] = (number % 10) + 48;
	LCDbuffer[5] = 0;

LCD_printR(LCDbuffer);





//number = number *5000 / 1023;
//sprintf(LCDbuffer,"%d.%02dV ",number);
 	
	}


}

 
void LCDcmd(char x)
	{
	__delay_ms(N);
	RS=0;
	RW=0;
	__delay_ms(M);
	EN=1;
	__delay_ms(M);
	DATA = x;	// Command data
	__delay_ms(M);
	EN=0;
	__delay_ms(M);
	}
void LCDdata(char x)
	{
	RS=1;
	RW=0;
	__delay_ms(M);
	EN=1;
	__delay_ms(M);
	DATA = x;  //  Print data
	__delay_ms(M);
	EN=0;
	__delay_ms(M);
	}



/*ret =  (ADRESL & 0x3) << 8;
ret +=	ADRESH;*/

void LCD_goto(char line, char column)		// combines line and lineW
	{
	unsigned char data = 0x80;				// default to 1
	if(line == 2)data = 0xc0;				// change to 2
	data += column;							// add in  column
	 LCDcmd(data);
	}

int ReadADC()
	{
	int ret = 0;
	__delay_ms(10);
	GO_DONE = 1;						// start conversion
   	while(GO_DONE);					// wait for conversion
   	ret =  (ADRESL & 0x3) << 8;		// get
   	ret +=	ADRESH;					// result
	return ret;
	}

void LCD_printR(char * str)	 		// This passes the start of a RAM character array
	{								// by default the pointer points to data section
	while(*str != 0)				// while the character pointed to isn't 0
LCDdata(*str++);			// print out the character, then increment
	}
 
Yes, after adding that line you suggested it is showing random char on voltage using . > ) these char.
 
Many issues...

A) number HAS to be a long in this instance .... 1024 * 5000 = !!! well more than an int...
B) I shifted the decimal point...
C) ADCON0 and 1 changed to suit.
D) changed the delay's

I have placed comments at the places that I have modified...

C:
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
__CONFIG(LVP_OFF & BOREN_OFF & PWRTE_ON & WDTE_OFF & FOSC_HS);
#define _XTAL_FREQ 20000000
 
#define DATA PORTB
#define EN RC4
#define RS RC6
#define RW RC5
#define N 10
#define M 1			// TOOOO long 1ms is more than enough
unsigned long number=0;		// Number MUST be a long for fixed point
int ch=0;
unsigned char LCDbuffer[17];
unsigned char m[11]="Voltmeter";
void LCDcmd(char x), LCDdata(char x);
void LCD_goto(char line, char column)	;
int ReadADC();
void LCD_printR(char *str);
 
main(){
	TRISB=0X00;
	TRISC=0X00;
	TRISA = 0xff ;
	ADCON1=0b10000000;		// Left justified
	ADCON0=0b01000001;//000 = channel 0, (RA0/AN0)
	ADIF=0;
	ADIE=1;
	PEIE=1;
 
	__delay_ms(50);
 	LCDcmd(0x38); // init
	__delay_ms(N);
	LCDcmd(0x38); // init
	__delay_ms(N);
	LCDcmd(0x38); // Function set
	__delay_ms(N);
 	LCDcmd(0x06); // Cursor move increase, no display shift
	__delay_ms(N);
	LCDcmd(0x0C); // Display on, cursor off, not blinking
 
	__delay_ms(N);
	LCDcmd(0x01); // Clear display. goto pos 1
 	__delay_ms(N);
 
	while(1){ 
		LCD_goto(1,2);
		LCD_printR(m);
 
		LCD_goto(2,2);
		number = ReadADC();
 
		number = number * 5000 / 1023;
		LCDbuffer[0]= (number / 1000)+ 48;
		LCDbuffer[1] = 46;
		LCDbuffer[2] = ((number % 1000) / 100)+ 48;
		LCDbuffer[3] = ((number % 100) / 10)+ 48;
		LCDbuffer[4] = (number % 10) + 48;
		LCDbuffer[5] = 0;
		LCD_printR(LCDbuffer);
 		//number = number *5000 / 1023;
		//sprintf(LCDbuffer,"%d.%02dV ",number);
 		}
 	}
 
void LCDcmd(char x)
	{
	__delay_ms(N);
	RS=0;
	RW=0;
	__delay_ms(M);
	EN=1;
	__delay_ms(M);
	DATA = x;	// Command data
	__delay_ms(M);
	EN=0;
	__delay_ms(M);
	}
void LCDdata(char x)
	{
	RS=1;
	RW=0;
	__delay_ms(M);
	EN=1;
	__delay_ms(M);
	DATA = x;  //  Print data
	__delay_ms(M);
	EN=0;
	__delay_ms(M);
	}

void LCD_goto(char line, char column)		// combines line and lineW
	{
	unsigned char data = 0x80;				// default to 1
	if(line == 2)data = 0xc0;				// change to 2
	data += column;							// add in  column
	 LCDcmd(data);
	}
 
int ReadADC()
	{
	int ret = 0;
	__delay_ms(10);
	GO_DONE = 1;					// start conversion
   	while(GO_DONE);					// wait for conversion
   	ret =  (ADRESH & 0x3) << 8;		// get
   	ret +=	ADRESL;					// result
	return ret;
	}
 
void LCD_printR(char * str)	 		// This passes the start of a RAM character array
	{								// by default the pointer points to data section
	while(*str != 0)				// while the character pointed to isn't 0
		LCDdata(*str++);			// print out the character, then increment
	}
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…