TM4C123G LaunchPad - LCD Interface

From EdWiki

Interfacing to an LCD

LCD module pin descriptions

Hitachi HD44780 LCD controller dominated the character LCD modules. Most of the character LCD modules still use HD44780 or a variation of it. The HD44780 controller has a 14 pin interface for the microprocessor.

Pin Symbol I/O Description
1 VSS -- Ground
2 VCC -- +5v Power Supply
3 VEE -- Power Supply to Control Contrast
4 RS O RS = 0 to Select Command Register,
RS = 1 to Select Data Register
5 R/W I/O RW = 0 for Write
RW = 1 for Read
6 E O Enable
7 DB0 I/O 8-bit data bus (DB0 - DB7)
8 DB1 I/O
9 DB2 I/O
10 DB3 I/O
11 DB4 I/O 4/8-bit data bus
12 DB5 I/O
13 DB6 I/O
14 DB7 I/O
15 LED+ Supply Voltage
for LED+
16 LED- Supply Voltage
for LED-

VCC, VSS, and VEE: While VCC and VSS provide +5V power supply and ground, respectively, VEE is used for controlling the LCD contrast.

RS, register select: There are two registers inside the LCD and the RS pin is used for their selection as follows. If RS = 0, the instruction command code register is selected, allowing the user to send a command such as clear display, cursor at home, and so on (or query the busy status bit of the controller). If RS = 1, the data register is selected, allowing the user to send data to be displayed on the LCD (or to retrieve data from the LCD controller).

R/W, read/write: R/W input allows the user to write information into the LCD controller or read information from it. R/W = 1 when reading and R/W = 0 when writing.

E, enable: The enable pin is used by the LCD to latch information presented to its data pins. When data is supplied to data pins, a High-to-Low pulse must be applied to this pin in order for the LCD to latch in the data present at the data pins. This pulse must be a minimum of 230 ns wide, according to Hitachi datasheet.

D0 ... D7: The 8-bit data pins are used to send information to the LCD or read the contents of the LCD's internal registers. The LCD controller is capable of operating with 4-bit data and only D4-D7 are used.

There are four types of access cycles to the LCD controller depending on RS and R/W as shown in the following Table. Normally, you write ASCII characters into the data buffer (called DDRAM in the data sheets) to have them displayed on the screen. However, you can create up to 8 new characters by writing to the character generator RAM (CGRAM). These new characters exist as ASCII data 0 to 7.

RS R/W Operation
0 0 Write a command to the LCD instruction register
0 1 Read Busy Flag (bit 7)
1 0 Write data to the LCD data buffer
1 1 Read data from the LCD to the microcontroller

To display letters and numbers, we send ASCII codes for the letters A-Z, a-z, numbers 0-9, and the punctuation marks to these pins while making RS = 1.

There are also instruction command codes that can be sent to the LCD in order to clear the display, force the cursor to the home position, or blink the cursor. The following table lists some commonly used LCD Commands.

Command to LCD Instruction Register
1 clear Display Screen
2 Return Cursor Home
6 Increment Cursor (Shift Cursor to Right)
F Display ON, Cursor Blinking
80 Force Cursor to beginning of 1st Line
C0 Force Cursor to beginning of 2nd Line
38 2 Lines and 5x7 character (8-bit data, D0 to D7)
28 2 Lines and 5x7 character (4-bit data, D4 to D7)

EduARM4 board LCD Connection

LCD Interfacing
Figure: LCD Connection on the EduARM4 Board

Jumper Selection:
J5 - Short 3 & 4

Sending commands to LCDs

To send any of the commands to the LCD, make pin RS = 0 and send a High-to-Low pulse on the E pin to enable the internal latch of the LCD.

Sending data to the LCD

In order to send data to the LCD to be displayed, we must set pin RS = 1, and also send a High-to-Low pulse to the E pin to enable the internal latch of the LCD.

LCD runs much slower than the micro controller. The first two commands in the above table take up to 1.64 ms to execute and all the other commands and data take up to 40 us. After one command or data is written to the LCD controller, one must wait until the LCD controller is ready before issuing the next command/data otherwise the second command/data will be ignored. An easy way is to delay the microcontroller for the maximam time it may take for the previous command.

  • The LCD's data pins are connected to PORTB of the micro controller.
  • The LCD's RS pin is connected PORTA6 of the micro controller.
  • The LCD's R/W pin is connected to the ground (Always in write mode).
  • The LCD's E pin is connected to PORTA7 of the micro controller.

Both Ports x and y are configured as output ports.

Checking LCD busy flag

The above programs used a time delay before issuing the next data or command. This allows the LCD a sufficient amount of time to get ready to accept the next data. However, the LCD has a busy flag. We can monitor the busy flag and issue data when it is ready. This will speed up the process. To check the busy flag, we must read the command register (R/W = 1, RS = 0). The busy flag is the D7 bit of that register. Therefore, if R/W = 1, RS = 0; when D7 = 1 (busy flag = 1), the LCD is busy taking care of internal operations and will not accept any new information. When D7 = 0, the LCD is ready to receive new information.

Doing so requires switching the direction of the port connected to the data bus to input mode when polling the status register then switch the port direction back to output mode to send the next command. If the port direction is incorrect, it may damage the micro controller or the LCD module.

LCD Cursor Position

In the LCD, one can move the cursor to any location in the display by issuing an address command. The next character sent will appear at the cursor position. For the two-line LCD, the address command for the first location of line 1 is 0x80, and for line 2 it is 0xC0. The following table shows address locations and how they are accessed:

0 0 1 A6 A5 A4 A3 A2 A1 A0

where A6 A5 A4 A3 A2 A1 A0 = 0000000 to 0100111 for line 1 and A6 A5 A4 A3 A2 A1 A0 = 1000000 to 1100111 for line 2. See the following Table.

Line 1 (min) 1 0 0 0 0 0 0 0
Line 1 (max) 1 0 1 0 0 1 1 1
Line 2 (min) 1 1 0 0 0 0 0 0
Line 2 (max) 1 1 1 0 0 1 1 1

The upper address range can go as high as 0100111 for the 40-character-wide LCD while for the 20-character-wide LCD the address of the visible positions goes up to 010011 (19 decimal = 10011 binary). Notice that the upper range 0100111 (binary) = 39 decimal, which corresponds to locations 0 to 39 for the LCDs of 40x2 size.

LCD Instructions

Instruction RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Description Execution
0 0 0 0 0 0 0 0 0 1 Clears entire display and sets
DD RAM address 0 in
address counter
1.64 ms
0 0 0 0 0 0 0 0 1 - Sets DD RAM address to 0 as
address counter. Also returns
display being shifted to
original positions. DD RAM
contents remain unchanged.
1.64 ms
Mode Set
0 0 0 0 0 0 0 1 I/D S Sets cursor move direction
and specifies shift of display.
These operations are
performed during data write
and read.
0 0 0 0 0 0 1 D C B Sets On/Off of entire display
(D), cursor On/Off (C), and
blink of cursor position
character (B)
Cursor or
0 0 0 0 0 1 S/C R/L - - Moves cursor and shifts
display without changing DD
RAM contents
0 0 0 0 1 DL N F - - Sets interface data length
(DL), number of display lines
(N), and character font (F)
Set CG
0 0 0 1 AGC Sets CG RAM address. CG
RAM data is sent and
received after this setting.
Set DD
0 0 1 ADD Sets DD RAM address. DD
RAM data is sent and
received after this setting.
Read Busy
Flag &
0 1 BF AC Reads Busy flag (BF)
indicating internal operation
is being performed and reads
address counter contents.
Write Data
CG or DD
1 0 Write Data Writes data into DD or CG
Read Data
CG or DD
1 1 Read Data Reads data from DD or CG


DD RAM: Display data RAM
CG RAM: Character generator RAM
AGC: CG RAM address
ADD: DD RAM address, corresponds to cursor address
AC: address counter used for both DD and CG RAM addresses
I/D: 1 = Increment, 0: Decrement
S =1: Accompanies display shift
S/C: 1 = Display shift, 0: Cursor move
R/L: 1: Shift to the right, 0: Shift to the left
DL: 1 = 8 bits, 0 = 4 bits
N: 1 = 2-line, 0 = 1-line
F: 1 = 5 x 10 dots, 0 = 5 x 7 dots
BF: 1 = Internal operation, 0 = Can accept instruction

LCD Initialization (8-Bit Interface)

Lcd init flowchart 8bit.png

LCD Datasheet

  1. LCD Module 1602A

See Also


  1. Display "Welcome to DESE" on the 1st line and "Embedded Systems" on the 2nd line.
  2. The above text on both the lines should scroll from right to left at a reasonable rate.
  3. Create your own custom characters and Display it on 16x2 LCD screen.