|
控制LCD1602显示的程序,要实现在液晶屏第一行第一列显示一个字符‘A’,下到板子里调试不出来,纠结了一周了,不知道问题在哪,求高人帮看一下,不胜感激~~~~,下面是程序。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LCD1602 is
Port
(
Clk : in std_logic; --50M Hz
Reset:in std_logic; --复位
Lcd_rs : out std_logic; --命令或数据选择控制
Lcd_rw : out std_logic; --读写控制信号
Lcd_en : out std_logic; --液晶时钟信号
Lcd_data : out std_logic_vector(7 downto 0) --数据信号
);
end LCD1602;
architecture BHV of LCD1602 is
constant dataA:std_logic_vector:="01000001"; --显示的数据为A
signal Clk1:std_logic:='1';
type state is (szl1,szl3,szl4,szl6,saddr,sdata,sw);
signal Cstate:state;
--signal Nstate:state;
begin
Lcd_en<=Clk1;
div_80us:process(Clk)
variable cnt1:integer range 0 to 99999;--200000分频,分频后时钟Clk1周期为4ms
begin
if Clk'event and Clk='1' then
if cnt1<99999 then cnt1:=cnt1+1;
else
cnt1:=0;
Clk1<= not Clk1;
end if;
end if;
end process;
com:process(Clk1,Reset)
begin
if Reset='0' then Cstate<=szl1;Lcd_rs<='0';
elsif Clk1'event and Clk1='1' then
Lcd_rs<='0';
case Cstate is
when szl1=>
Lcd_rw<='0';
Lcd_data<="00000001"; --清屏
Cstate<=szl3;
when szl3=>
--Lcd_rs<='0';
Lcd_rw<='0';
Lcd_data<="00000110";--光标右移,显示屏不移动
Cstate<=szl4;
when szl4=>
--Lcd_rs<='0';
Lcd_rw<='0';
Lcd_data<="00001111";--显示功能开,有光标,光标闪烁
Cstate<=szl6;
when szl6=>
--Lcd_rs<='0';
Lcd_rw<='0';
Lcd_data<="00111000";--8位数据,显示两行,5*7
Cstate<=saddr;
when saddr=>
--Lcd_rs<='1';
Lcd_rw<='0';
Lcd_data<="10000000";--设置DDRAM地址,即在液晶屏第一行第一列显示
Cstate<=sdata;
when sdata=>
Lcd_rw<='0';
Lcd_rs<='1';
Lcd_data<=dataA; --显示的数据为A
Cstate<=sw;
when sw=> --不明白这个状态是什么意思,参考别人的写的
--Lcd_rs<='1';
Lcd_rw<='1';
Lcd_data<="00000000";
Cstate<=szl3;
when others=>null;
end case;
end if;
end process;
end BHV; |
|