Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

LCD With microcontroller.....

Status
Not open for further replies.
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.

New Articles From Microcontroller Tips

Back
Top