info:lcd_4_bit_interfacing

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
info:lcd_4_bit_interfacing [2011/01/15 08:53] tomgeeinfo:lcd_4_bit_interfacing [2011/01/16 11:29] (current) tomgee
Line 14: Line 14:
  
 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. 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.1295099616.txt.gz · Last modified: 2011/01/15 08:53 by tomgee