User Tools

Site Tools


info:lcd_4_bit_interfacing

LCD 4 bit Interface

In 4-bit mode the data is sent in nibbles. First we send the higher nibble and then the lower nibble. To enable the 4-bit mode of LCD, we need to follow a special sequence of initialization that tells the LCD controller that the user has selected 4-bit mode of operation. Here is the reset sequence to put the LCD in 4 bit mode.

 
 1. Wait for abour 20mS
 2. Send the first init value (0x30)
 3. Wait for about 10mS
 4. Send second init value (0x30)
 5. Wait for about 1mS
 6. Send third init value (0x30)
 7. Wait for 1mS
 8. Select bus width (0x30 - for 8-bit and 0x20 for 4-bit)
 9. Wait for 1mS

The busy flag will only be valid after the above reset sequence. Usually we do not use busy flag in 4-bit mode as we have to write code for reading two nibbles from the LCD. Instead we simply put a delay usually 300 to 600uS. This delay might vary depending on the LCD. It depends on the LCD module. So if you feel any problem running the LCD, simply try to increase the delay. This usually works. 400uS is a good typical value.

Sending data/command in 4-bit Mode

Here' the common steps to send data/command to an LCD in 4-bit mode. As i already explained in 4-bit mode data is sent nibble by nibble, first we send higher nibble and then lower nibble. This means in both command and data sending function we need to separate the higher 4-bits and lower 4-bits.

The steps are:

 1. Load high 4-bits on 4 LCD data pins
 2. Send to the LCD port
 3. Toggle enable signal
 4. Load lower 4-bits on 4 LCD data pins
 5. Send to LCD port
 6. Toggle enable signal

C code to perform the above

 ;In this 4-bit tutorial the LCD is connected to
 ;the controller in following way...
 ;D4 - P3.0
 ;D5 - P3.1
 ;D6 - P3.2
 ;D7 - P3.3
 ;EN - P3.7
 ;RS - P3.5
 //The pins used are same as explained earlier
 #define lcd_port    P3
 //LCD Registers addresses
 #define LCD_EN      0x80
 #define LCD_RS      0x20
 void lcd_reset()
 {
      lcd_port = 0xFF;
      delayms(20);
      lcd_port = 0x03+LCD_EN;
      lcd_port = 0x03;
      delayms(10);
      lcd_port = 0x03+LCD_EN;
      lcd_port = 0x03;
      delayms(1);
      lcd_port = 0x03+LCD_EN;
      lcd_port = 0x03;
      delayms(1);
      lcd_port = 0x02+LCD_EN;
      lcd_port = 0x02;
      delayms(1);
 }
 void lcd_init ()
 {
      lcd_reset();         // Call LCD reset
      lcd_cmd(0x28);       // 4-bit mode - 2 line - 5x7 font.
      lcd_cmd(0x0C);       // Display no cursor - no blink.
      lcd_cmd(0x06);       // Automatic Increment - No Display shift.
      lcd_cmd(0x80);       // Address DDRAM with 0 offset 80h.
 }

Sending Command/Data to LCD in 4-bit mode

 void lcd_cmd (char cmd)
 {
      lcd_port = ((cmd >> 4) & 0x0F)|LCD_EN;
      lcd_port = ((cmd >> 4) & 0x0F);
      lcd_port = (cmd & 0x0F)|LCD_EN;
      lcd_port = (cmd & 0x0F);
      delayus(200);
      delayus(200);
 }
 void lcd_data (unsigned char dat)
 {
      lcd_port = (((dat >> 4) & 0x0F)|LCD_EN|LCD_RS);
      lcd_port = (((dat >> 4) & 0x0F)|LCD_RS);
     
      lcd_port = ((dat & 0x0F)|LCD_EN|LCD_RS);
      lcd_port = ((dat & 0x0F)|LCD_RS);
      delayus(200);
      delayus(200);
 }
info/lcd_4_bit_interfacing.txt · Last modified: 2011/01/16 11:29 by tomgee