use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity lcd1602 is
port(clk, reset: in std_logic;
LCD_Data: out std_logic_vector(8 downto 0);
en: out std_logic;
rw: out std_logic);
end lcd1602;
architecture gongneng of lcd1602 is
signal LCD_Clk: std_logic;
signal s : integer range 0 to 10000000;
begin
--50MHz to 5Hz
process(clk, reset)
begin
if reset = '0' then
LCD_Clk <= '0';
s <= 0;
elsif clk'event and clk = '1' then
if s = 10000000 then
s <= 0;
LCD_Clk <= not LCD_Clk;
else
s <= s + 1;
end if;
end if;
end process;
rw <='0';
en <= LCD_Clk;
process(LCD_Clk)
variable cnt: std_logic_vector(4 downto 0):="00000";
begin
if Reset='0'then
LCD_Data<="000000001"; -- Reset清屏
--LCD_Data[8..0], 其中LCD_Data[8]对应1602的RS,--LCD_Data[7..0]对应1602的八根数据线cnt:="00000"; --计数器清零
elsif rising_edge(LCD_Clk) then
if cnt<"01111" then cnt:=cnt+1;
else cnt:="00000";
--设计计数器,每次计数间隔LCD_CLK定义的一个周期
case cnt is
when "00000"=>LCD_Data<="000111000";--/*设置8位格式,2行,5*7*/ ,顺序2,3的要求when "00001"=>LCD_Data<="000001100"; --/*整体显示,关光标,光标闪烁/ ,顺序4的要求
when "00010"=>LCD_Data<="000000001";--清屏,顺序5的要求
when "00011"=>LCD_Data<="000000110"; --/*显示移动格式,看最后两位,10表示光标右移,顺序6的要求
when "00100"=>LCD_Data<="010000000";--设定显示的位置在00H+80H,即显示屏第一行第一个位置,顺序7的要求
when "00101"=>LCD_Data<="101000011"; --顺序8的要求,上一步指定位置处显示字符C when "00110"=>LCD_Data<="101101000";--上一步基础上地址加一,显示字符h
when "00111"=>LCD_Data<="101100101";--e
when "01000"=>LCD_Data<="101101110";--n
when "01001"=>LCD_Data<="101011010";--Z
when "01010"=>LCD_Data<="101101000";--h
when "01011"=>LCD_Data<="101100101";--e
when "01100"=>LCD_Data<="011000000";--设定显示的位置在10H+80H,即显示屏第2行第一个位置
when "01101"=>LCD_Data<="100110010";--上一步指定位置处显示字符2
when "01110"=>LCD_Data<="100110000";---上一步基础上地址加一,显示字符0
when "01111"=>LCD_Data<="100110000";---0
when "10000"=>LCD_Data<="100111001";---9
when "10001"=>LCD_Data<="100110001";---1
when "10010"=>LCD_Data<="100110001";---1
when "10011"=>LCD_Data<="100110001";---1
when "10100"=>LCD_Data<="100110001";---1
when "10101"=>LCD_Data<="100110000";---0
when "10110"=>LCD_Data<="100111001";---9
when others =>LCD_Data<="101000100";
end case;
end if;
end process;
end gongneng;