Books > Learning the PIC micro-controller @ PCB Heaven - On line book discussion

PIC16F877A Problem in Display LCD 2x16

(1/1)

chichara:
Hi everyone

I'm beginner in PIC and I have problem to display LCD. Here is the code :


#include<pic.h> //Define PIC Registers

#include<stdio.h> //Define I/O Functions



__CONFIG(0x3f72); //Select HS oscillator, Enable (PWRTE,BOREN),

//Disable (CPD,CP,WDTEN,In-circuit Debugger)


#define RS RE0 //LCD Register Select

#define RW RE1 //LCD Read/Write Pin

#define EN RE2 //LCD Enable Pin

#define DATA PORTD //LCD Data Port

#define DATADIR TRISD //LCD Data Port Direction Register

#define CNTRLDIR TRISE //RS,RW,EN Direction Register


void lcdinit(void); //LCD initialization Function

void lcdclr(void); //LCD Clear Function

void lcdcomd(unsigned char); //LCD Command Declaring Fucntion

void lcddata(unsigned char); //LCD Data Display Fucntion

void DelayMs(unsigned int);


void main()

{

int i;

unsigned char First[]={" PIC DEV. BOARD "};

unsigned char Secnd[]={"LCD DEMO PROGRAM"};

DelayMs(500);

lcdinit();

DelayMs(500);



while(1)

{

lcdclr();

lcdcomd(0x80);


for(i=0;i<16;i++) //Display the Message

{

lcddata(First);

DelayMs(50);

}


lcdcomd(0xc0);

for(i=0;i<16;i++) //Display the Message

{

lcddata(Secnd);

DelayMs(50);

}


DelayMs(500);

}

}


void lcdinit(void)

{

int i;

unsigned char command[]={0x38,0x0c,0x06,0x01};

//LCD Command set for 8 bit Interface, 2 Lines, 5x7 Dots

ADCON1 = 0x07; //Make PORTE Pin as Digital

CNTRLDIR = 0x00; //Make LCD control port (PORTE) as output

DATADIR = 0x00;

DelayMs(50); //Make LCD Data Port (PORTD) as output port

for(i=0;i<4;i++)

{

lcdcomd(command); //Send the Initialisation Commands

DelayMs(5);

}

DelayMs(500);

}


void lcdclr(void) //Send LCD clear command

{

lcdcomd(0x01);

DelayMs(2);

}


void lcdcomd(unsigned char cmd)

{

RS=0; RW=0; //Select Command Register, R/W--write enabled

EN=1; //Enable LCD to accept commands

DATA=cmd;

EN=0;

DelayMs(5); //Give a Pulse via Enable pin

}

void lcddata(unsigned char byte)

{

RS=1; RW=0; //Select Data register, R/W--write enabled

EN=1;

DATA=byte; //Give a Pulse via Enable pin

EN=0;

DelayMs(5);

}

void DelayMs(unsigned int Ms)

{

int delay_cnst;

while(Ms>0)

{

Ms--;

for(delay_cnst = 0;delay_cnst <220;delay_cnst++);

}

}

The code is successfully compile in MPLAB, and also success to display in simulator (proteus). But, I try in real PIC, it can't show anything.
I really confused about that. I have checked the wiring and I'm sure that it is true. Somebody please.. I need your help.

Thank you

bobx:

Mr./Miss. chichara Cadet,hello.First of all check your crystal[XTAL] and see if it has two zeros after
its  point or four zeros,that is,for example; on your crystal it is written; [ 40.0000 ] or [ 40.00 ]      [in MHZ]?

When you want to compile your program and get its .hex,if you choose ,four zeros after point of your crystal frequency,for example,40.0000,then you should used a crystal with that precision or otherwise your microcontroller does not work at all and is dead.

                                                 Have a nice day,


                                       

Sir N:

--- Quote from: bobx on July 07, 2013, 18:05:22 PM ---[,,,] if you choose ,four zeros after point of your crystal frequency,for example,40.0000,then you should used a crystal with that precision or otherwise your microcontroller does not work at all and is dead.

--- End quote ---
And how do you imagine the procesor finding out, considering its timebase is the crystal? ;)
Something like a missing contrast adjustment sounds like a more believable culprit.

Navigation

[0] Message Index

Go to full version