PCB Heaven
Books => Learning the PIC micro-controller @ PCB Heaven - On line book discussion => Topic started by: chichara on May 01, 2013, 12:25:00 PM
-
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
-
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,
-
[,,,] 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.
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.