1 | LIBRARY IEEE;
|
2 | USE IEEE.STD_LOGIC_1164.ALL;
|
3 | USE IEEE.STD_LOGIC_UNSIGNED.ALL;
|
4 |
|
5 | ENTITY LCD_Main IS
|
6 | PORT ( clk : IN std_logic;
|
7 | iRST_N : IN std_logic;
|
8 | SW : IN std_logic_vector(17 downto 0);
|
9 | reset : IN std_logic;
|
10 | switch : IN std_logic;
|
11 | switch2 : IN std_logic;
|
12 |
|
13 | LCD_DATA : OUT std_logic_vector(7 downto 0);
|
14 | LCD_RW : OUT std_logic;
|
15 | LCD_ON : OUT std_logic;
|
16 | LCD_BLON : OUT std_logic;
|
17 | LCD_RS : OUT std_logic;
|
18 | LCD_EN : OUT std_logic:='0'
|
19 | );
|
20 | END LCD_Main;
|
21 |
|
22 | ARCHITECTURE LCDBody of LCD_Main is
|
23 |
|
24 | CONSTANT LCD_INITIAL:std_logic_vector(7 downto 0):="00000000";
|
25 | CONSTANT LCD_LINE1:std_logic_vector(7 downto 0):= "00000100";
|
26 | CONSTANT LCD_CH_LINE:std_logic_vector(7 downto 0):=LCD_LINE1+16;
|
27 | CONSTANT LCD_LINE2:std_logic_vector(7 downto 0):=LCD_LINE1+16+1;
|
28 | CONSTANT LUT_SIZE:std_logic_vector(7 downto 0):=(LCD_LINE2+50)+1;
|
29 |
|
30 | SIGNAL LUT_DATA:std_logic_vector (11 downto 0):=x"000";--In hex
|
31 | -- SIGNAL count2 : integer range 0 to 65535 := 0;
|
32 | SIGNAL LUT_INDEX:std_logic_vector(7 downto 0):="00000000";
|
33 | SIGNAL mLCD_DONE:std_logic:='0';
|
34 | -- SIGNAL mLCD_ST:std_logic_vector(5 downto 0):="000000";
|
35 | SIGNAL mLCD_ST:std_logic_vector(1 downto 0):="00";
|
36 | SIGNAL mDLY:std_logic_vector(27 downto 0):=x"0000000";--In hex
|
37 | SIGNAL mLCD_Start:std_logic:='0';
|
38 | SIGNAL mLCD_DATA:std_logic_vector(7 downto 0):="00000000";
|
39 | SIGNAL mLCD_RS:std_logic:='0';
|
40 | SIGNAL sclk:std_logic:='0';
|
41 | SIGNAL startcount : integer range 0 to 1:=0;
|
42 | SIGNAL D1,D2,D3,D4,D5,D6 : std_logic_vector (11 downto 0):=x"130";
|
43 |
|
44 | COMPONENT LCD_controller IS
|
45 | PORT( iCLK,iRS,iRST_N,istart : IN std_logic;
|
46 | iDATA : IN std_logic_vector(7 downto 0);
|
47 | oDone : OUT std_logic;
|
48 | LCD_DATA : OUT std_logic_vector(7 downto 0);
|
49 | LCD_RW : OUT std_logic;
|
50 | LCD_RS : OUT std_logic;
|
51 | LCD_EN : OUT std_logic
|
52 | );
|
53 | END COMPONENT LCD_controller;
|
54 |
|
55 | COMPONENT clk_div IS
|
56 | PORT ( iCLK: IN std_logic;
|
57 | sclk: OUT std_logic
|
58 | );
|
59 | END COMPONENT clk_div;
|
60 |
|
61 | BEGIN
|
62 | U0:LCD_controller
|
63 | PORT MAP(
|
64 | iCLK => clk,
|
65 | iRS => mLCD_RS,
|
66 | iRST_N => iRST_N,
|
67 | istart => mLCD_START,
|
68 | iDATA => mLCD_DATA,
|
69 | oDone => mLCD_DONE,
|
70 | LCD_DATA => LCD_DATA,
|
71 | LCD_RW => LCD_RW,
|
72 | LCD_RS => LCD_RS,
|
73 | LCD_EN => LCD_EN
|
74 | );
|
75 |
|
76 | U1:clk_div
|
77 | PORT MAP( iCLK => clk,
|
78 | sclk => sclk
|
79 | );
|
80 |
|
81 | LCD_ON <= '1';
|
82 | LCD_BLON <= '1';
|
83 |
|
84 | always : process(clk)
|
85 | Begin
|
86 |
|
87 | IF(switch2 = '1' AND switch2'event) THEN
|
88 | startcount <= startcount + 1;
|
89 | END IF;
|
90 |
|
91 | IF(startcount = 1) THEN
|
92 | If(sclk = '1' and sclk'event)THEN
|
93 |
|
94 | ----------LCD Line 1--------------
|
95 |
|
96 | IF(reset = '0')THEN
|
97 | LUT_INDEX <= "00000000";
|
98 | --mLCD_ST <= "000000";
|
99 | mLCD_ST <= "00";
|
100 | --mDLY <= x"0000000";
|
101 | mLCD_DATA <= "00000000";
|
102 | mLCD_START <= '0';
|
103 | mLCD_RS <= '0';
|
104 |
|
105 | startcount <= 0;
|
106 | D1 <= x"130";
|
107 | D2 <= x"130";
|
108 | D3 <= x"130";
|
109 | D4 <= x"130";
|
110 | D5 <= x"130";
|
111 | D6 <= x"130";
|
112 |
|
113 | ELSIF(rising_edge(clk))THEN
|
114 | IF(LUT_INDEX < LUT_SIZE)THEN
|
115 | case mLCD_ST is
|
116 | when "00" => mLCD_DATA <= LUT_DATA(7 downto 0);
|
117 | mLCD_RS <= LUT_DATA(8);
|
118 | mLCD_START<= '1';
|
119 | mLCD_ST <= "01";
|
120 |
|
121 | when "01" => IF(mLCD_DONE = '1') THEN
|
122 | mLCD_START <= '0';
|
123 | mLCD_ST <= "10";
|
124 | END IF;
|
125 |
|
126 | when "10" => IF(switch = '1')THEN
|
127 | IF(LUT_DATA = x"080")THEN
|
128 | mLCD_ST <= "11";
|
129 | END IF;
|
130 | END IF;
|
131 |
|
132 | when "11" => LUT_INDEX <= LUT_INDEX + 1;
|
133 | mLCD_ST <= "00";
|
134 | end case;
|
135 | ELSE
|
136 | IF(sclk = '1')THEN
|
137 | LUT_INDEX <= LCD_INITIAL;
|
138 | END IF;
|
139 | END IF;
|
140 | END IF;
|
141 | END IF;
|
142 | END IF;
|
143 | END PROCESS always;
|
144 |
|
145 |
|
146 |
|
147 | ----READING OF LCD COMMAND----
|
148 | check:process(LUT_INDEX)
|
149 | begin
|
150 |
|
151 | case LUT_INDEX is
|
152 | when LCD_INITIAL+0=>LUT_DATA<=(x"030");
|
153 | when LCD_INITIAL+1=>LUT_DATA<=(x"00C");
|
154 | -- when LCD_INITIAL+2=>LUT_DATA<=(x"001");
|
155 | when LCD_INITIAL+2=>LUT_DATA<=(x"006");
|
156 | when LCD_INITIAL+3=>LUT_DATA<=(x"080");
|
157 |
|
158 |
|
159 |
|
160 |
|
161 | when LCD_LINE1 + 1 => LUT_DATA<=(x"130");
|
162 | when LCD_LINE1 + 2 => LUT_DATA<=(x"130");
|
163 | when LCD_LINE1 + 3 => LUT_DATA<=(x"130");
|
164 | when LCD_LINE1 + 4 => LUT_DATA<=(D6);
|
165 | when LCD_LINE1 + 5 => LUT_DATA<=(D5);
|
166 | when LCD_LINE1 + 6 => LUT_DATA<=(x"13a");
|
167 | when LCD_LINE1 + 7 => LUT_DATA<=(D4);
|
168 | when LCD_LINE1 + 8 => LUT_DATA<=(D3);
|
169 | when LCD_LINE1 + 9 => LUT_DATA<=(x"13a");
|
170 | when LCD_LINE1 + 10=> LUT_DATA<=(D2);
|
171 | when LCD_LINE1 + 11=> LUT_DATA<=(D1);
|
172 | -- when LCD_LINE1 + 12=> LUT_DATA<=(x"130");
|
173 | -- when LCD_LINE1 + 13=> LUT_DATA<=(x"130");
|
174 | -- when LCD_LINE1 + 14=> LUT_DATA<=(x"130");
|
175 | -- when LCD_LINE1 + 15=> LUT_DATA<=(x"130");
|
176 | -- when LCD_LINE1 + 16=> LUT_DATA<=(x"130");
|
177 | when others => LUT_DATA <= (x"000");
|
178 |
|
179 | end case;
|
180 |
|
181 | end process check;
|
182 | end LCDBody;
|