Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Interfacing JHD 162a LCD with LPC1768

Status
Not open for further replies.

Karthick000

Newbie level 4
Joined
Jan 23, 2016
Messages
7
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
49
I am interfacing JHD162a LCD with LPC1768. Problem I am facing is getting the rectangular black block in the 1st row and i am trying to print "hello world"
the character is not displaying. here is my code. I checked the hardware connection and supply everything is proper. Could any one explain what is the issue.

Hardware connection

LCD pin
  • Pin 1 - Ground
  • Pin 2 - 5v
  • pin 3 - (0 to 3.3V) pot kept maimum volt
  • Pin 4 - RS - connected to port 2 pin 0
  • Pin 5 - RW - Ground (only write operation)
  • Pin 6 - EN - connected to port 2 pin 1
  • Pin 7 - Data line - Connected to port 0 pin0
  • Pin 8 - Data line - Connected to port 0 pin1
  • Pin 9 - Data line - Connected to port 0 pin2
  • Pin 10 - Data line - Connected to port 0 pin3
  • Pin 11,12,13,14 - Ground
  • Pin 15 - to resisor 200ohm to 5 supply
  • Pin 16 - Ground

Code:
#define BIT(x)                                 (1 << x)
#define BIT_LCD_DATA_CON_REG_SEL               BIT(0)
#define BIT_LCD_EN_DIS_LATCH                   BIT(1)
#define LCD_CMD_DATA_MASK                      0x0F

int main()
{	
	uint32_t N_timer;
	SystemClockUpdate();	
	WDTInit();
	LPC_GPIO2 -> FIODIR0 = 0xFF;//direction register
	LPC_GPIO2 -> FIOCLR0 = 0xFF;//Clear Port value
	for (N_timer = 0; N_timer < 2; N_timer++)
    {  
	  init_timer (N_timer, TIME_INTERVAL);
	  enable_timer (N_timer);
    }
  
    JHD_LCD_Init ();
    JHD_send_LCD_data ();
    while(1);    
}

void JHD_LCD_latch ( void )
{
  LPC_GPIO2 -> FIOSET0 |= BIT_LCD_EN_DIS_LATCH;
  delayMs(0,20);
  LPC_GPIO2 -> FIOCLR0 |= BIT_LCD_EN_DIS_LATCH;
  delayMs(0,20);
}

void JHD_LCD_Init( void )
{
  JHD_LCD_Inst ();   
  send_lcd_cmd(0x2C, 0); 
  send_lcd_cmd(0x0F, 0);
  send_lcd_cmd(0x10, 0);
  send_lcd_cmd(0x07, 0);
  send_lcd_cmd(0x01, 0);
  send_lcd_cmd(0x80, 0); 
}

uint8_t JHD_send_LCD_data ()
{
	char *data_string = "hello world";
	uint8_t index = 0;
	while(data_string [index] != '\0')
    {
		send_lcd_data((unsigned char)data_string [index], 1);
		index++;		
	}		
  return 0;
}

void JHD_LCD_Inst( void )
{
	delayMs(0,100);
	/*Port 0 lower nibble will act as DATA line*/
	LPC_GPIO0 -> FIODIRL = 0x000F; /*o/p line*/
    LPC_GPIO0 -> FIOCLRL = 0x000F;
	/*Port 2 bit 0(RS),1(EN) will act as cmd line and initialized in main function*/
}

void JHD_LCD_data_config( void )
{ 
	LPC_GPIO0 -> FIOCLRL = 0x000F;
	LPC_GPIO0 -> FIOSETL = 0x0000;
	LPC_GPIO2 -> FIOSET0 |= (0x000F & BIT_LCD_DATA_CON_REG_SEL);
	delayMs(0,20);
	JHD_LCD_latch ();
}

void send_lcd_cmd (unsigned char cmd, uint8_t rs_value)
{
	WDTFeed();
	
	LPC_GPIO0 -> FIOCLRL = 0x000F;
	LPC_GPIO0 -> FIOSETL = (0x000F & (uint16_t)((cmd >> 4) & LCD_CMD_DATA_MASK));
	LPC_GPIO2 -> FIOSET0 |= (0x000F & rs_value);
	JHD_LCD_latch ();
	
	LPC_GPIO0 -> FIOCLRL = 0x000F;
	LPC_GPIO0 -> FIOSETL = (0x000F & (uint16_t)(cmd & LCD_CMD_DATA_MASK));
	LPC_GPIO2 -> FIOSET0 |= (0x000F & rs_value);
	JHD_LCD_latch ();
    
}

void send_lcd_data (unsigned char data, uint8_t rs_value)
{
	WDTFeed();
	
	LPC_GPIO0 -> FIOCLRL = 0x000F;
	LPC_GPIO0 -> FIOSETL = (0x000F & (uint16_t)((data >> 4) & LCD_CMD_DATA_MASK));
	LPC_GPIO2 -> FIOSET0 |= (0x000F & rs_value);
	JHD_LCD_latch ();
	
	LPC_GPIO0 -> FIOCLRL = 0x000F;
	LPC_GPIO0 -> FIOSETL = (0x000F & (uint16_t)(data & LCD_CMD_DATA_MASK));
	JHD_LCD_latch ();	
}
 

Hi,

the commands during LCD init need to be timing controlled. Read datasheet about necessary delay timing between commands.
I can´t find this in your code.


Klaus
 
Hi KlausST,

I added delay of 50 ms after each command also after each character to LCD. now a black block is blinking in the 1st row 1 st column but not printing the characters.
 

you can simply try random delays from 1 to 1000ms, but reading manual could not only be faster and usefull also. There are specific frequency allowed to interface this type of lcb - data should be shifted in at 300kHz
 

I think the connections are wrong.
Pins 7,8,9& 10 can be connected to ground or left floating, Pins 11,12,13 & 14 are datalines if you are using 4bit mode.
Check datasheet again

Nandhu
 

If i connect pins 11,12,13,14 as data line the 1st row full of black blocks. If i connect 7,8,9,10 as data line a black block blinks in the 1st row 1st column.
 

Hi,

If i connect pins...
Instead of trial and error you should read datasheet.
It says how to connect the display, and it says how to initialise the display.
If you do like the datasheet says, I'm sure it will work.

Klaus
 

Finally the LCD displayed some characters (Not exact characters). I am trying to display "HELLO WORLD", but It is displaying as "HDLLO0GORLD"

Code:
int main()
{	
	uint32_t N_timer;
	SystemClockUpdate();	
	WDTInit();
	LPC_GPIO2 -> FIODIR0 = 0xFF;//direction register
	LPC_GPIO2 -> FIOCLR0 = 0xFF;//Clear Port value
	
  for (N_timer = 0; N_timer < 2; N_timer++)
  {  
	  init_timer (N_timer, TIME_INTERVAL);
	  enable_timer (N_timer);
  }
  JHD_LCD_Init ();
  JHD_LCD_data_config ();
  JHD_send_LCD_data ();
  while(1);
 }

void JHD_LCD_Init( void )
{
  JHD_LCD_Inst ();
  send_lcd_cmd(0x28);
  send_lcd_cmd(0x0F);
  send_lcd_cmd(0x06);
  send_lcd_cmd(0x01);
  send_lcd_cmd(0x80);
}
 
void JHD_LCD_Inst( void )
{
	delayMs(0,100);
	/*Port 0 lower nibble will act as DATA line*/
	LPC_GPIO0 -> FIODIR0 = 0x0F; /*o/p line*/
    LPC_GPIO0 -> FIOCLR0 = 0x0F;
	/*Port 2 bit 0(RS),1(EN) will act as cmd line and initialized in main function*/
}

void JHD_LCD_latch ( void )
{
  LPC_GPIO2 -> FIOSET0 |= BIT_LCD_EN_DIS_LATCH;
  delayMs(0,100);
  LPC_GPIO2 -> FIOCLR0 |= BIT_LCD_EN_DIS_LATCH;
  delayMs(0,100);
}

void send_lcd_cmd (char cmd)
{

	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO0 -> FIOSET0 = ((cmd >> 4) & LCD_CMD_DATA_MASK);
	JHD_LCD_latch ();
	
	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO0 -> FIOSET0 = (cmd & LCD_CMD_DATA_MASK)
	JHD_LCD_latch ();
}

void send_lcd_data (char data, uint8_t rs_value)
{
	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO0 -> FIOSET0 = ((data >> 4) & LCD_CMD_DATA_MASK);
	LPC_GPIO2 -> FIOSET0 |= (0x0F & rs_value);
	JHD_LCD_latch ();
	
	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO0 -> FIOSET0 = (data & LCD_CMD_DATA_MASK);
	JHD_LCD_latch ();
}

uint8_t JHD_send_LCD_data ()
{
	char *data_string = "HELLO WORLD";
	uint8_t index = 0;
	while(data_string [index] != '\0')
    {
		send_lcd_data(data_string [index], 1);
		index++;		
	}
	return 0;
}

void JHD_LCD_Inst( void )
{
	delayMs(0,100);
	/*Port 0 lower nibble will act as DATA line*/
	LPC_GPIO0 -> FIODIR0 = 0x0F; /*o/p line*/
    LPC_GPIO0 -> FIOCLR0 = 0x0F;
	/*Port 2 bit 0(RS),1(EN) will act as cmd line and initialized in main function*/
}

void JHD_LCD_data_config( void )
{ 
	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO2 -> FIOSET0 |= (0x0F & BIT_LCD_DATA_CON_REG_SEL);
	delayMs(0,20);
	JHD_LCD_latch ();
}
 

Attachments

  • IMG_1.jpg
    IMG_1.jpg
    1.7 MB · Views: 60

I checked with the hardware and debug LCD bit 0 its seems correct,But i am getting garbage values(0000000000000000).
 

Hi,

What's the LPC supply voltage?

Could it be a timing problem?
Do you check busy flag?

Klaus
 
Hi,

LPC supply voltage is 5V, I debugged the busy flag its not getting set, here is my updated code.

Code:
void JHD_LCD_latch ( void )
{
  LPC_GPIO2 -> FIOSET0 |= BIT_LCD_EN_DIS_LATCH;
  delayMs(0,100);
  WDTFeed();
  LPC_GPIO2 -> FIOCLR0 |= BIT_LCD_EN_DIS_LATCH;
  delayMs(0,100);   
}

void lcd_busy()
{
  
  //make Lcd pin 7 as input
  LPC_GPIO0 -> FIODIR0 = 0x07;//P0.0,P0.1,P0.2 are o/p, P0.3 is i/p
  //make Lcd RS pin as cmd mode
  LPC_GPIO2 -> FIOSET0 &= 0x0E; //make p2.0 as command mode
  //make Lcd RW pin as read mode
  LPC_GPIO2 -> FIOSET0 |= BIT_LCD_DATA_CON_RW;
  do
  {
	JHD_LCD_latch ();
  }
  while (LPC_GPIO0 -> FIOSET0 & LCD_BUSY_FLAG);
  //make Lcd RW pin as write mode
  LPC_GPIO2 -> FIOSET0 &= (~BIT_LCD_DATA_CON_RW);
  //make Lcd pin 7 as output
  LPC_GPIO0 -> FIODIR0 = 0x0F;  
}

uint8_t JHD_send_LCD_data ()
{
	char *data_string = "HELLO WORLD";
	uint8_t index = 0;
	while(data_string [index] != '\0')
    {
		send_lcd_data(data_string [index], 1);
		index++;		
	}
	return 0;
}

void send_lcd_data (uint8_t data, uint8_t rs_value)
{
	lcd_busy();
	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO0 -> FIOSET0 = (0x0F & (uint8_t)((data >> 4) & LCD_CMD_DATA_MASK));
	LPC_GPIO2 -> FIOSET0 |= (0x01 & rs_value);
	JHD_LCD_latch ();
	
	lcd_busy();
	LPC_GPIO0 -> FIOCLR0 = 0x0F;
	LPC_GPIO0 -> FIOSET0 = (0x0F & (uint8_t)(data & LCD_CMD_DATA_MASK));
	JHD_LCD_latch ();
	
}
 

Hi,

LPC supply voltage is 3.3V, in the previous post i mentioned is supply of my development board which is 5V & LCD supply given is 5V. and i used 4MHz internal oscillator.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top