Sm.r.Tadayoni
Junior Member level 1
Hi Every body.
I have a problem to Run(Display Character on LCD) my Code of xlcd (2x16) on dsPIC30f4011. i think my delay time is wrong but i dont know what is the Correct. can Somebody help me ?
My Code:
______________________________________________________________
#include <p30f4011.h>
#define F_OSC 10000000
#define PLL 8
#define DataPort PORTB
#define TRIS_DataPort TRISB
#define RS PORTEbits.RE0
#define RW PORTEbits.RE1
#define Enable PORTEbits.RE2
#define TRIS_RS TRISEbits.TRISE0
#define TRIS_RW TRISEbits.TRISE1
#define TRIS_Enable TRISEbits.TRISE2
#define Display_Clear 0b0000001
#define Return_Home 0b0000010
#define Dont_Shift 0b0000100
#define Right_Shift 0b0000111
#define Left_Shift 0b0000101
#define Display_on 0b0001110
#define Shift_Display_Left 0b0011100
#define Shift_Display_Right 0b0011000
#define Display_Dont_Shift 0b0000110
#define Set_Function_8Bits_2Lines_5x10 0b0111100
#define Set_Function_4Bits_2Lines_5x10 0b0101100
void delay5ms(void);
void delay15ms(void);
void delay200us(void);
void delay600ns(void);
void delay18TCY(void);
void Write_Cmd_LCD(unsigned char c);
void Write_Data_LCD(unsigned char c);
char Busy_Check(void);
void Open_LCD(void);
void SetDDRAM(void);
void Init_Program(void);
void Init_LCD(void);
void delay5ms(void)
{ unsigned long int i, x;
x = ((5 * 0.001)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay15ms(void)
{ unsigned long int i, x;
x = ((15 * 0.001)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay200us(void)
{ unsigned long int i, x;
x = ((0.0002)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay600ns(void)
{ unsigned long int i, x;
x = ((0.0000006)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay40us(void)
{ unsigned long int i, x;
x = ((0.0004)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay18TCY(void)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
void Write_Cmd_LCD(unsigned char c)
{
RS = 0;
RW = 0;
delay18TCY();
Enable = 1;
DataPort = c;
delay18TCY();
Enable = 0;
delay18TCY();
}
void Write_Data_LCD(unsigned char c)
{
RS = 1;
RW = 0;
TRIS_DataPort = 0x00;
// delay18TCY();
// delay18TCY();
DataPort = c;
Enable = 1;
delay18TCY();
Enable = 0;
TRIS_DataPort = 0xFF;
RS = 0;
while(Busy_Check);
delay200us();
delay200us();
}
char Busy_Check(void)
{
TRIS_DataPort = 0xFF;
RW = 1;
RS = 0;
delay18TCY();
Enable = 1;
delay18TCY();
if (PORTBbits.RB7)
{
Enable = 0;
delay600ns();
return 1;
}
else
{
Enable = 0;
delay600ns();
return 0;
}
}
void Open_LCD(void)
{
delay15ms();
DataPort = 0x00;
RS = 0;
RW = 0;
Enable = 0;
TRIS_DataPort = 0x00;
TRIS_RS = 0;
TRIS_RW = 0;
TRIS_Enable = 0;
DataPort = 0x3C; // Function Set;
delay40us();
DataPort = 0x0F; // Display On;
delay40us();
DataPort = 0x01; // Clear Displaying
delay40us();
DataPort = 0x06; // Entry Mode;
delay15ms();
/* delay18TCY();
Enable = 0;
delay18TCY();
/**/
}
void SetDDRAM(void)
{
TRIS_DataPort = 0x00;
RS = 0;
RW = 0;
DataPort = 0x80;
Enable = 1;
delay18TCY();
Enable = 0;
delay200us();
}
void Init_Program(void)
{ //TRIS_DataPort = 0x00;
TRISB = TRISE = 0x00;
PORTB = PORTE = 0x00;
delay15ms();
DataPort = 0x3C; // Function Set;
delay5ms();
DataPort = 0x3C; // Function Set;
delay200us();
DataPort = 0x3C. // Function Set;
}
void Init_LCD(void)
{
Open_LCD();
while(Busy_Check() == 1 );
Write_Cmd_LCD(0x18);
while(Busy_Check() == 1 );
SetDDRAM();
while(Busy_Check()==1);
Write_Data_LCD('A');
while( Busy_Check() == 1 );
}
void main()
{
Init_Program();
Init_LCD();
}
_________________________________________________________________
Exactly i need your Helping.
Thanks Alot.
I have a problem to Run(Display Character on LCD) my Code of xlcd (2x16) on dsPIC30f4011. i think my delay time is wrong but i dont know what is the Correct. can Somebody help me ?
My Code:
______________________________________________________________
#include <p30f4011.h>
#define F_OSC 10000000
#define PLL 8
#define DataPort PORTB
#define TRIS_DataPort TRISB
#define RS PORTEbits.RE0
#define RW PORTEbits.RE1
#define Enable PORTEbits.RE2
#define TRIS_RS TRISEbits.TRISE0
#define TRIS_RW TRISEbits.TRISE1
#define TRIS_Enable TRISEbits.TRISE2
#define Display_Clear 0b0000001
#define Return_Home 0b0000010
#define Dont_Shift 0b0000100
#define Right_Shift 0b0000111
#define Left_Shift 0b0000101
#define Display_on 0b0001110
#define Shift_Display_Left 0b0011100
#define Shift_Display_Right 0b0011000
#define Display_Dont_Shift 0b0000110
#define Set_Function_8Bits_2Lines_5x10 0b0111100
#define Set_Function_4Bits_2Lines_5x10 0b0101100
void delay5ms(void);
void delay15ms(void);
void delay200us(void);
void delay600ns(void);
void delay18TCY(void);
void Write_Cmd_LCD(unsigned char c);
void Write_Data_LCD(unsigned char c);
char Busy_Check(void);
void Open_LCD(void);
void SetDDRAM(void);
void Init_Program(void);
void Init_LCD(void);
void delay5ms(void)
{ unsigned long int i, x;
x = ((5 * 0.001)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay15ms(void)
{ unsigned long int i, x;
x = ((15 * 0.001)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay200us(void)
{ unsigned long int i, x;
x = ((0.0002)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay600ns(void)
{ unsigned long int i, x;
x = ((0.0000006)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay40us(void)
{ unsigned long int i, x;
x = ((0.0004)*(F_OSC*PLL))/4;
for (i=1;i<=x;i++);
}
void delay18TCY(void)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
void Write_Cmd_LCD(unsigned char c)
{
RS = 0;
RW = 0;
delay18TCY();
Enable = 1;
DataPort = c;
delay18TCY();
Enable = 0;
delay18TCY();
}
void Write_Data_LCD(unsigned char c)
{
RS = 1;
RW = 0;
TRIS_DataPort = 0x00;
// delay18TCY();
// delay18TCY();
DataPort = c;
Enable = 1;
delay18TCY();
Enable = 0;
TRIS_DataPort = 0xFF;
RS = 0;
while(Busy_Check);
delay200us();
delay200us();
}
char Busy_Check(void)
{
TRIS_DataPort = 0xFF;
RW = 1;
RS = 0;
delay18TCY();
Enable = 1;
delay18TCY();
if (PORTBbits.RB7)
{
Enable = 0;
delay600ns();
return 1;
}
else
{
Enable = 0;
delay600ns();
return 0;
}
}
void Open_LCD(void)
{
delay15ms();
DataPort = 0x00;
RS = 0;
RW = 0;
Enable = 0;
TRIS_DataPort = 0x00;
TRIS_RS = 0;
TRIS_RW = 0;
TRIS_Enable = 0;
DataPort = 0x3C; // Function Set;
delay40us();
DataPort = 0x0F; // Display On;
delay40us();
DataPort = 0x01; // Clear Displaying
delay40us();
DataPort = 0x06; // Entry Mode;
delay15ms();
/* delay18TCY();
Enable = 0;
delay18TCY();
/**/
}
void SetDDRAM(void)
{
TRIS_DataPort = 0x00;
RS = 0;
RW = 0;
DataPort = 0x80;
Enable = 1;
delay18TCY();
Enable = 0;
delay200us();
}
void Init_Program(void)
{ //TRIS_DataPort = 0x00;
TRISB = TRISE = 0x00;
PORTB = PORTE = 0x00;
delay15ms();
DataPort = 0x3C; // Function Set;
delay5ms();
DataPort = 0x3C; // Function Set;
delay200us();
DataPort = 0x3C. // Function Set;
}
void Init_LCD(void)
{
Open_LCD();
while(Busy_Check() == 1 );
Write_Cmd_LCD(0x18);
while(Busy_Check() == 1 );
SetDDRAM();
while(Busy_Check()==1);
Write_Data_LCD('A');
while( Busy_Check() == 1 );
}
void main()
{
Init_Program();
Init_LCD();
}
_________________________________________________________________
Exactly i need your Helping.
Thanks Alot.