Difference between revisions of "Arduino: How to control a HD44780 based character LCD"

From Luky-Wiki
Jump to: navigation, search
(Display ON / OFF Control)
Line 1: Line 1:
 +
 +
'''Attention: this page is work in progress.'''
 +
 
Many characters LCD displays use so called HD44780 based protocol on interface. This is more like standard but i recommend to check datasheet from vendor. There can be small modifications and/or difference in timing. Especially timing is important. If communication rate is too quick, then LCD drop data or misbehave depending on internal state. I recommend to check busy flag if possible. If not then correct delay should be applied between commands. Result of commands can be checked via LCD Simulator prior to programing MCU. For example i like this one: [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html DjLCDSIM].
 
Many characters LCD displays use so called HD44780 based protocol on interface. This is more like standard but i recommend to check datasheet from vendor. There can be small modifications and/or difference in timing. Especially timing is important. If communication rate is too quick, then LCD drop data or misbehave depending on internal state. I recommend to check busy flag if possible. If not then correct delay should be applied between commands. Result of commands can be checked via LCD Simulator prior to programing MCU. For example i like this one: [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html DjLCDSIM].
 
== Command Set ==
 
== Command Set ==

Revision as of 16:13, 24 June 2013

Attention: this page is work in progress.

Many characters LCD displays use so called HD44780 based protocol on interface. This is more like standard but i recommend to check datasheet from vendor. There can be small modifications and/or difference in timing. Especially timing is important. If communication rate is too quick, then LCD drop data or misbehave depending on internal state. I recommend to check busy flag if possible. If not then correct delay should be applied between commands. Result of commands can be checked via LCD Simulator prior to programing MCU. For example i like this one: DjLCDSIM.

Command Set

Clear Display

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 0 0 0 0 0 0 1 ~ 1.52 ms
  • Clear display data by writing 0x20 ("space") to whole DDRAM memory
  • Set AC to DDRAM and 0x00
  • Set entry mode to increment (I/D = 1)

Return Home

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 0 0 0 0 0 1 x ~ 1.52 ms
  • Set AC to DDRAM and 0x00
  • Return cursor and display to home (original) postition

Entry Mode Set

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 0 0 0 0 1 I/D SH ~ 38 us
  • Set the moving diresction of cursor and display
  • I/D = Increment / Decrement DDRAM address
    • I/D = 1, cursor moves to right and DDRAM is increased by 1
    • I/D = 0, cursor moves to left and DRAM is decreased by 1
  • SH = Shift (scroll) of entire display
    • SH = 1, after DDRAM write operation entire display is shifted (scrolled) according to I/D value
    • SH = 0, no shifting (scrolling) is performed

Display ON / OFF Control

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 0 0 0 1 D C B ~ 38 us
  • D = Display On/Off
    • D = 1, display is On
    • D = 0, display is Off, content of DDRAM is preserved
  • C = Cursor On/Off
    • C = 1, cursor is enabled
    • C = 0, cursor is disabled, but it's configuration is preserved (I/D, ...)
  • B = Blink On/Off
    • B = 1, blink is enabled, display will alternate between current data and 0xff character on cursor position
    • B = 0, blink is disabled

Cursor or Display Shift

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 0 0 1 S/C R/L x x ~ 38 us

Function set

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 0 1 DL N F x x ~ 38 us

Set CGRAM Address

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 ~ 38 us

Set DDRAM Address

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 ~ 38 ms

Read Busy Flag and Address

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 ~ 0 us

Write data to RAM

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
1 0 D7 D6 D5 D4 D3 D2 D1 D0 ~ 38 us

Read data from RAM

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Execution Time
1 1 D7 D6 D5 D4 D3 D2 D1 D0 ~ 38 us

Initialization of display

8-bit mode

4-bit mode