You are on page 1of 5

library ieee;

use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity lcd is
port(clock:in std_logic; --clock i/p
rw: out std_logic; --read write control
rs:out std_logic; --command data control
en:out std_logic; --lcd enable
a1 : inout std_logic_vector(3 downto 0) ; --row scan line
a2 : inout std_logic_vector(3 downto 0) ; --column scan line
data:out std_logic_vector(7 downto 0)); --data lines
end lcd;

architecture arch of lcd is


type state is(state1,state2,state3,state4,state5,state6); --fsm for data
signal ro : state := state1;
begin
process(clock)
variable output:std_logic_vector(3 downto 0):="1111"; --logic high connection
variable input:std_logic_vector(3 downto 0):="0000"; --logic low connection
variable verify : std_logic_vector(3 downto 0) ;
variable verify1 : std_logic_vector(3 downto 0) ;
variable i,j : integer := 0 ;
variable datas,datam : std_logic_vector(7 downto 0) := "00110001";
begin
rw<='0';
-------------------------------------------------------------------------
if clock'event and clock='1' then
if ro = state1 then
a2 <= input;
else
a2 <= (OTHERS => 'Z');
end if;
if ro /= state1 then
a1 <= output;
else
a1 <= (OTHERS => 'Z');
end if;
verify1 := a1 ;
verify := a2 ;

case ro is
when state1 => --column scan state
case verify1 is
when "1111" => --no key pressed
ro <= state1 ;
when "0111" => --1st column
datas := x"31";
ro <= state2;
when "1011" => --2nd column
datas := x"32";
ro <= state3;
when "1101" => --3rd column
datas := x"33";
ro <= state4;
when "1110" => --4th column
datas := x"34";
ro <= state5;
when others =>
ro <= state1 ;
end case;
when state2 => --1st row scan logic
case verify is
when "1000" =>
datam := x"31";
ro <= state6 ;
when "0100" =>
datam := x"32";
ro <= state6;
when "0010" =>
datam := x"33";
ro <= state6 ;
when "0001" =>
datam := x"34";
ro <= state6 ;
when others =>
ro <= state2 ;
end case;
when state3 => --2nd row scan logic
case verify is
when "1000" =>
datam := x"31";
ro <= state6 ;
when "0100" =>
datam := x"32";
ro <= state6 ;
when "0010" =>
datam := x"33";
ro <= state6 ;
when "0001" =>
datam := x"34";
ro <= state6 ;
when others =>
ro <= state3 ;
end case;
when state4 => --3rd row scan logic
case verify is
when "1000" =>
datam := x"31";
ro <= state6 ;
when "0100" =>
datam := x"32";
ro <= state6 ;
when "0010" =>
datam := x"33";
ro <= state6 ;
when "0001" =>
datam := x"34";
ro <= state6 ;
when others =>
ro <= state4 ;
end case;
when state5 => --4th row scan logic
case verify is
when "1000" =>
datam := x"31";
ro <= state6 ;
when "0100" =>
datam := x"32";
ro <= state6 ;
when "0010" =>
datam := x"33";
ro <= state6 ;
when "0001" =>
datam := x"34";
ro <= state6 ;
when others =>
ro <= state5 ;
end case;
-------------------------------------------------------------------------
when state6 =>
if i <= 500000 then
i := i + 1;
elsif i > 500000 then
i := 0 ;
if j < 36 then
j := j + 1 ;
ro <= state6;
elsif j = 36 then
j := 0 ;
ro <= state1;
end if;
end if;
case j is
when 1=>
data<="00111000"; --ascii code of data to be displayed
en<='1';
rs<='0';
when 2=>
en<='0';
when 3=>
data<="00001110";
en<='1';
rs<='0';
when 4=>
en<='0';
when 5=>
data<="00000001";
en<='1';
rs<='0';
when 6=>
en<='0';
when 7=>
data<="00000110";
en<='1';
rs<='0';
when 8=>
en<='0';
when 9=>
data<="10000000";
en<='1';
rs<='0';
when 10=>
en<='0';
--------------------------------------------------------------------------------
when 11=>
data<="01010010"; -- ascii code for "R"
en<='1';
rs<='1';
when 12=>
en<='0';
when 13=>
data<="01001111"; -- ascii code for "O"
en<='1';
rs<='1';
when 14=>
en<='0';
when 15=>
data<= "01010111"; -- ascii code for "W"
en<='1';
rs<='1';
when 16=>
en<='0';
when 17=>
data<="00100000"; -- ascii code for "SPACE"
en<='1';
rs<='1';
when 18=>
en<='0';
when 19=>
data<="00111010"; -- ascii code for ":"
en<='1';
rs<='1';
when 20=>
en<='0';
----------------------------------------------------------------
when 21=>
data<=datam; -- ascii code for " "
rs<='1';
en<='1';
when 22=>
en<='0';
when 23=>
data<="00100000"; -- ascii code for "SPACE"
rs<='1';
en<='1';
when 24=>
en<='0';
when 25=>
data<="01000011"; -- ascii code for "C"
rs<='1';
en<='1';
when 26=>
en<='0';
-----------------------------------------------------------------
when 27=>
data<="01001111"; -- ascii code for "O"
rs<='1';
en<='1';
when 28=>
en<='0';
when 29=>
data<="01001100"; -- ascii code for "L"
en<='1';
rs<='1';
when 30=>
en<='0';
when 31=>
data<="00100000"; -- ascii code for "SPACE"
rs<='1';
en<='1';
when 32=>
en<='0';
when 33=>
data<="00111010"; -- ascii code for ":"
rs<='1';
en<='1';
when 34=>
en<='0';
when 35=>
data<=datas; -- ascii code for " "
rs<='1';
en<='1';
when 36=>
en<='0';
-----------------------------------------------------------------
when others=>
data<=datas; -- ascii code for " "
rs<='1';
en<='0';
end case;
end case;
----------------------------------------------
end if;
----------------------------------------------
end process;
end arch;

You might also like