Hi!
I am trying to interface 8-Bit LCD (16x2) in Parallel Mode. I am attaching the basic code I am trying to execute.
Please help me to sort out the issue.
The current status is LCD is not even getting initialized.
/************************************************************************/
/* LCD Interface - 8 bit mode */
/* */
/* */
/* */
/************************************************************************/
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "piccolo_lcd.h"
void WriteCommandLCD(unsigned char CommandByte);
void WriteDataLCD(unsigned char DataByte);
void LCDDelay(void);
void LCDDelay1600(void);
void SendByte(unsigned char Value);
void main(void)
{
InitSysCtrl();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
INIT_GPIO();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
INIT_INTERRUPT();
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
CLEAR_VARIABLE();
InitializeLCD();
// DisplayLCD(1, "WELCOME");
// DisplayLCD(2, "ELED");
WriteCommandLCD(0x80); //Command to select 8 bit interface
WriteDataLCD('A');
WriteCommandLCD(0xC0); //Command to select 8 bit interface
WriteDataLCD('B');
DELAY_US(2000);
while(1);
}
/* Initializes LCD */
void InitializeLCD(void)
{
WriteCommandLCD(0x38); //Command to select 8 bit interface
DELAY_US(10000);
WriteCommandLCD(0x0E); //Command to select 8 bit interface
DELAY_US(10000);
WriteCommandLCD(0x01); //Command to select 8 bit interface
DELAY_US(10000);
WriteCommandLCD(0x80); //Command to select 8 bit interface
DELAY_US(10000);
WriteCommandLCD(0x01); //Command to select 8 bit interface
DELAY_US(10000);
}
/* Writes a command byte to LCD */
void WriteCommandLCD(unsigned char CommandByte)
{
char CMD;
CMD = (CommandByte) & 0xFFFF;
GpioDataRegs.GPADAT.all = CMD;
GpioDataRegs.GPACLEAR.bit.GPIO18 = 1;//Clear RS pin to write command
GpioDataRegs.GPASET.bit.GPIO12 = 1; //SET EN HIGH
DELAY_US(10);
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1; //SET EN LOW
return;
}
/* Writes a Data byte to LCD */
void WriteDataLCD(unsigned char DataByte)
{
char DATA;
DATA = (DataByte) & 0xFFFF;
GpioDataRegs.GPADAT.all = DATA;
GpioDataRegs.GPASET.bit.GPIO18 = 1; //Clear RS pin to write command //Set RS pin to 1 to write Data
GpioDataRegs.GPASET.bit.GPIO12 = 1; //SET EN HIGH
DELAY_US(10);
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1; //SET EN LOW
}
/* Small delay */
void LCDDelay(void)
{
DELAY_US(50);
}
/* Big delay */
void LCDDelay1600(void)
{
DELAY_US(1600);
}
/* Makes cursor visible */
void CursorON(void)
{
WriteCommandLCD(0x0f); //Command to switch on cursor
}
/* Makes cursor invisible */
void CursorOFF(void)
{
WriteCommandLCD(0x0c); //Command to switch off cursor
}
/* Displays a message on LCD */
void DisplayLCD(char LineNumber,char *Message)
{
int a;
if(LineNumber == 1)
{ //First Line
WriteCommandLCD(0x80); //Select the first line
}
else
{ //Second line
WriteCommandLCD(0xC0); //Select the second line
}
for(a=0;a<16;a++)
{
WriteDataLCD(*Message); //Display a character
Message++; //Increment pointer
}
return;
}
void INIT_GPIO()
{
EALLOW;
GpioCtrlRegs.GPACTRL.bit.QUALPRD2 = 30;
//ENABLE
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
//COMMAND RS
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO18 = 2;
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO18 = 1;
//D0
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
//D1
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
//D2
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
//D3
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
//D4
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO4 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO4 = 1;
//D5
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO5 = 1;
//D6
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;
//D7
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 2;
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;
GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;
EDIS;
}
void INIT_INTERRUPT()
{
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2802x_DefaultIsr.c.
// This function is found in DSP2802x_PieVect.c.
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 60, 1);
CpuTimer0Regs.TCR.all = 0x4001;
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void CLEAR_VARIABLE()
{
RS = CLEAR;
EN = CLEAR;
DATA = CLEAR;
}
Awaiting for the reply.
Thanks and Regards,
Richa
