philip12
Newbie level 1
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
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