0% found this document useful (0 votes)
57 views

LCD Controller

This document describes an LCD controller VHDL code. It initializes the LCD display in multiple steps over several milliseconds, including setting the function, display settings, and entry mode. It then waits for an enable signal to latch and send instruction codes to the LCD. The code controls the LCD signals and timing to correctly initialize and drive the LCD.

Uploaded by

Andres Suarez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views

LCD Controller

This document describes an LCD controller VHDL code. It initializes the LCD display in multiple steps over several milliseconds, including setting the function, display settings, and entry mode. It then waits for an enable signal to latch and send instruction codes to the LCD. The code controls the LCD signals and timing to correctly initialize and drive the LCD.

Uploaded by

Andres Suarez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

Date: May 16, 2017 lcd_controller.

vhd Project: LCD_Display


1 ---------------------------------------------------------------------
-----------
2 --
3 -- FileName: lcd_controller.vhd
4 -- CLOCK FREQUENCY: you may change system clock frequency,
5 -- LCD INITIALIZATION SETTINGS: to change, comment/uncomment lines:
6 --
7 -- Function Set
8 -- 2-line mode, display on Line 85 lcd_data <=
"00111100";
9 -- 1-line mode, display on Line 86 lcd_data <=
"00110100";
10 -- 1-line mode, display off Line 87 lcd_data <=
"00110000";
11 -- 2-line mode, display off Line 88 lcd_data <=
"00111000";
12 -- Display ON/OFF
13 -- display on, cursor off, blink off Line 96 lcd_data <=
"00001100";
14 -- display on, cursor off, blink on Line 97 lcd_data <=
"00001101";
15 -- display on, cursor on, blink off Line 98 lcd_data <=
"00001110";
16 -- display on, cursor on, blink on Line 99 lcd_data <=
"00001111";
17 -- display off, cursor off, blink off Line 100 lcd_data <=
"00001000";
18 -- display off, cursor off, blink on Line 101 lcd_data <=
"00001001";
19 -- display off, cursor on, blink off Line 102 lcd_data <=
"00001010";
20 -- display off, cursor on, blink on Line 103 lcd_data <=
"00001011";
21 -- Entry Mode Set
22 -- increment mode, entire shift off Line 119 lcd_data <=
"00000110";
23 -- increment mode, entire shift on Line 120 lcd_data <=
"00000111";
24 -- decrement mode, entire shift off Line 121 lcd_data <=
"00000100";
25 -- decrement mode, entire shift on Line 122 lcd_data <=
"00000101";
26 --
27 ---------------------------------------------------------------------
-----------
28
29 LIBRARY ieee;
30 USE ieee.std_logic_1164.ALL;
31 USE IEEE.STD_LOGIC_ARITH.ALL;
32 USE IEEE.STD_LOGIC_UNSIGNED.ALL;
33
34 ENTITY lcd_controller IS
35 PORT(

Page 1 of 5 Revision: LCD_Display


Date: May 16, 2017 lcd_controller.vhd Project: LCD_Display
36 clk : IN STD_LOGIC; --system clock
37 reset_n : IN STD_LOGIC; --active low reinitializes lcd
38 lcd_enable : IN STD_LOGIC; --latches data into lcd controller
39 lcd_bus : IN STD_LOGIC_VECTOR(9 DOWNTO 0); --data and
control signals
40 busy : OUT STD_LOGIC := '1'; --lcd controller
busy/idle feedback
41 rw, rs, e : OUT STD_LOGIC; --read/write, setup/data, and
enable for lcd
42 lcd_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --data signals
for lcd
43 lcd_on : OUT std_logic; --LCD Power ON/OFF
44 lcd_blon : OUT std_logic); --LCD Back Light ON/OFF
45 END lcd_controller;
46
47 ARCHITECTURE controller OF lcd_controller IS
48 --state machine
49 TYPE CONTROL IS(power_up, initialize, ready, send);
50 SIGNAL state : CONTROL;
51 CONSTANT freq : INTEGER := 50; --system clock frequency
in MHz
52
53 BEGIN
54 lcd_on <= '1'; --LCD Power ON
55 lcd_blon<='1'; --LCD Back Light ON
56
57 PROCESS(clk)
58 VARIABLE clk_count : INTEGER := 0; --event counter for timing
59 BEGIN
60 IF(clk'EVENT and clk = '1') THEN
61
62 CASE state IS
63
64 --wait 50 ms to ensure Vdd has risen and required LCD wait
is met
65 WHEN power_up =>
66 busy <= '1';
67 IF(clk_count < (50000 * freq)) THEN --wait 50 ms
68 clk_count := clk_count + 1;
69 state <= power_up;
70 ELSE --power-up complete
71 clk_count := 0;
72 rs <= '0';
73 rw <= '0';
74 lcd_data <= "00110000"; -- Function Set: 1-line mode,
display off lcd_data <= "00110000";
75 state <= initialize;
76 END IF;
77
78 --cycle through initialization sequence
79 WHEN initialize =>
80 busy <= '1';
81 clk_count := clk_count + 1;

Page 2 of 5 Revision: LCD_Display


Date: May 16, 2017 lcd_controller.vhd Project: LCD_Display
82 IF(clk_count < (10 * freq)) THEN --function set
83 -- lcd_data <= "00111100"; --2-line mode, display on
84 lcd_data <= "00110100"; --1-line mode, display on
85 --lcd_data <= "00110000"; --1-line mdoe, display off
86 --lcd_data <= "00111000"; --2-line mode, display off
87 e <= '1';
88 state <= initialize;
89 ELSIF(clk_count < (60 * freq)) THEN --wait 50 us
90 lcd_data <= "00000000";
91 e <= '0';
92 state <= initialize;
93 ELSIF(clk_count < (70 * freq)) THEN --display on/off
control
94 --lcd_data <= "00001100"; --display on, cursor
off, blink off
95 lcd_data <= "00001101"; --display on, cursor off,
blink on
96 --lcd_data <= "00001110"; --display on, cursor on,
blink off
97 --lcd_data <= "00001111"; --display on, cursor on,
blink on
98 --lcd_data <= "00001000"; --display off, cursor off,
blink off
99 --lcd_data <= "00001001"; --display off, cursor off,
blink on
100 --lcd_data <= "00001010"; --display off, cursor on,
blink off
101 --lcd_data <= "00001011"; --display off, cursor on,
blink on
102 e <= '1';
103 state <= initialize;
104 ELSIF(clk_count < (120 * freq)) THEN --wait 50 us
105 lcd_data <= "00000000";
106 e <= '0';
107 state <= initialize;
108 ELSIF(clk_count < (130 * freq)) THEN --display clear
109 lcd_data <= "00000001";
110 e <= '1';
111 state <= initialize;
112 ELSIF(clk_count < (2130 * freq)) THEN --wait 2 ms
113 lcd_data <= "00000000";
114 e <= '0';
115 state <= initialize;
116 ELSIF(clk_count < (2140 * freq)) THEN --entry mode set
117 lcd_data <= "00000110"; --increment mode, entire
shift off
118 --lcd_data <= "00000111"; --increment mode, entire
shift on
119 --lcd_data <= "00000100"; --decrement mode, entire
shift off
120 --lcd_data <= "00000101"; --decrement mode, entire
shift on
121 e <= '1';

Page 3 of 5 Revision: LCD_Display


Date: May 16, 2017 lcd_controller.vhd Project: LCD_Display
122 state <= initialize;
123 ELSIF(clk_count < (2200 * freq)) THEN --wait 60 us
124 lcd_data <= "00000000";
125 e <= '0';
126 state <= initialize;
127 ELSE --initialization
complete
128 clk_count := 0;
129 busy <= '0';
130 state <= ready;
131 END IF;
132
133 --wait for the enable signal and then latch in the
instruction
134 WHEN ready =>
135 IF(lcd_enable = '1') THEN
136 busy <= '1';
137 rs <= lcd_bus(9);
138 --rs<= lcd_rs;
139 rw <= lcd_bus(8);
140 --rw <= lcd_rw;
141 lcd_data <= lcd_bus(7 DOWNTO 0);
142 --lcd_data <= lcd_bus;
143 clk_count := 0;
144 state <= send;
145 ELSE
146 busy <= '0';
147 rs <= '0';
148 rw <= '0';
149 lcd_data <= "00000000";
150 clk_count := 0;
151 state <= ready;
152 END IF;
153
154 --send instruction to lcd
155 WHEN send =>
156 busy <= '1';
157 IF(clk_count < (50 * freq)) THEN --do not exit for 50us
158 busy <= '1';
159 IF(clk_count < freq) THEN --negative enable
160 e <= '0';
161 ELSIF(clk_count < (14 * freq)) THEN --positive enable
half-cycle
162 e <= '1';
163 ELSIF(clk_count < (27 * freq)) THEN --negative enable
half-cycle
164 e <= '0';
165 END IF;
166 clk_count := clk_count + 1;
167 state <= send;
168 ELSE
169 clk_count := 0;
170 state <= ready;

Page 4 of 5 Revision: LCD_Display


Date: May 16, 2017 lcd_controller.vhd Project: LCD_Display
171 END IF;
172
173 END CASE;
174
175 --reset
176 IF(reset_n = '0') THEN
177 state <= power_up;
178 END IF;
179
180 END IF;
181 END PROCESS;
182 END controller;
183

Page 5 of 5 Revision: LCD_Display

You might also like