This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28027: TMS320F28027

Part Number: TMS320F28027


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

  • Hi Richa,

    Simply follow this link:

    Regards,

    Gautam

  • Hi Gautam,
    I followed the link. The explanation is very useful. I am facing problem in handling include:
    #include "f2802x_common/include/gpio.h"
    #include "f2802x_common/include/pie.h"

    and the definitions:
    #define RS GPIO_Number_12
    #define E GPIO_Number_19

    #define D0 GPIO_Number_0
    #define D1 GPIO_Number_1
    #define D2 GPIO_Number_2
    #define D3 GPIO_Number_3
    #define D4 GPIO_Number_4
    #define D5 GPIO_Number_5
    #define D6 GPIO_Number_6
    #define D7 GPIO_Number_7
    GPIO_Handle myGpio;

    Will you please guide for the same.

    Thanks!