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.

Problem in pci lcd programming

Status
Not open for further replies.

philip12

Newbie level 1
Joined
Feb 13, 2013
Messages
0
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,280
Activity points
1,280
Hi friends, please could you help me. I am trying to write a simple program using pic16f877a to interface with lcd jh162a..
I don't know what's wrong with my code. The code i've used is given below:

#include<htc.h>
#include<stdint.h>
#define _XTAL_FREQ 6000000
#define delay 10000

//PORTBbits.RB0 --R/W pin; PORTBbits.RB1 --RS pin; PORTBbits.RB6 -- Enable pin
void Busylcd(void)
{
TRISD = 0xff;
do
{
PORTBbits.RB6 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 1;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_ms(2);
}while(PORTDbits.RD7);
PORTBbits.RB6 = 0;
PORTBbits.RB0 = 0;
TRISD = 0x00;
}

/*void Writecmdlcd(char cmd)
{
TRISD = 0x00;
Busylcd();
PORTBbits.RB1 = 0;
PORTBbits.RB0 = 0;
PORTD = cmd;
PORTBbits.RB6 = 1;
__delay_us(delay);
PORTBbits.RB6 = 0;
}*/


void Writedatalcd(char data)
{
TRISD = 0x00;
Busylcd();
PORTBbits.RB1 = 1;
PORTBbits.RB0 = 0;
PORTD = data;
__delay_us(10);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
}

void init_lcd()
{
//Power On delay routine through software
TRISD = 0x00;PORTD = 0x00;
TRISB = 0x00;PORTB = 0x00;
__delay_ms(50);

//Write the 1st command 0x30
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_ms(2);
PORTBbits.RB6 = 0;
__delay_ms(2);

__delay_ms(10);//Minimum delay of 4.1ms

//Write the 2nd command

PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_ms(2);
PORTBbits.RB6 = 0;
__delay_ms(2);

__delay_us(200);//Minimum delay of 100us
//Write the 3rd command
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_ms(2);
PORTBbits.RB6 = 0;
__delay_ms(2);

//Write the 4th command; Busy Flag should be ready from now

//Function set command--1st try
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_ms(2);
PORTBbits.RB6 = 0;
__delay_ms(2);

PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_ms(10);//Minimum delay of 4.5ms

//Function set command--2nd try
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_ms(2);
PORTBbits.RB6 = 0;
__delay_ms(2);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_us(200);//Minimum delay of 100us

//Function set command--3rd go
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_ms(2);
PORTBbits.RB6 = 1;
__delay_ms(2);
PORTBbits.RB6 = 0;
__delay_ms(2);
PORTD = 0x00;
TRISD = 0xff;
//Check if LCD is busy
Busylcd();

//Function set command
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB6 = 0;
PORTD = 0x30;
__delay_us(100);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_ms(10);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();

//Display OFF

PORTBbits.RB0 = 0; PORTBbits.RB1 = 0; PORTBbits.RB6 = 0;
PORTD = 0x08;
__delay_us(100);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(10);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_ms(5);

//Display Clear
PORTBbits.RB0 = 0; PORTBbits.RB1 = 0; PORTBbits.RB6 = 0;
PORTD = 0x01;
__delay_us(100);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(10);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_ms(5);

//Display ON, Cursor ON
PORTBbits.RB0 = 0; PORTBbits.RB1 = 0; PORTBbits.RB6 = 0;
PORTD = 0x0E;
__delay_us(100);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(10);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_ms(5);

//Entry mode set
PORTBbits.RB0 = 0; PORTBbits.RB1 = 0; PORTBbits.RB6 = 0;
PORTD = 0x06;
__delay_us(100);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(10);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_ms(5);

//DDRAM address set
PORTBbits.RB0 = 0; PORTBbits.RB1 = 0; PORTBbits.RB6 = 0;
PORTD = 0x80;
__delay_us(100);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(40);
PORTBbits.RB6 = 1;
__delay_us(10);
PORTBbits.RB6 = 0;
__delay_us(10);
PORTD = 0x00;
TRISD = 0xff;
Busylcd();
__delay_ms(5);

//Init procedure ends
}


//Main Program begins

void main()
{
ADCON1 = 0x06;
TRISC = 0x00;
PORTC = ~0x00;
TRISB = 0x00; PORTB = 0x00;__delay_ms(1);
TRISD = 0x00; PORTD = 0x00;__delay_ms(1);
init_lcd();
PORTC = ~0x01;
Writedatalcd(0x41);
PORTC = ~0x03;
while(1)
{PORTC = ~0x03; __delay_ms(500);
PORTC = 0x03;__delay_ms(500);}
}
----------------------------------------------------------------------
Thanks friends
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top