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