lcd1.vhd
来自「Mars-XC2S50-S-Core-V2.0开发板核心板的说明和设计文档」· VHDL 代码 · 共 236 行
VHD
236 行
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity lcd1 is
port
(clk : in std_logic;
nRST : in std_logic;
lcd_rs : out std_logic;
lcd_rw : out std_logic;
lcd_e : out std_logic;
data : out std_logic_vector(7 downto 0)
);
end lcd1;
architecture behave of lcd1 is
constant idle : std_logic_vector(4 downto 0):="00001";
constant setfunction1_a : std_logic_vector(4 downto 0):="00010";
constant setfunction1_b : std_logic_vector(4 downto 0):="00011";
constant setfunction1_c : std_logic_vector(4 downto 0):="00100";
constant setfunction2_a : std_logic_vector(4 downto 0):="00101";
constant setfunction2_b : std_logic_vector(4 downto 0):="00110";
constant setfunction2_c : std_logic_vector(4 downto 0):="00111";
constant clear_a : std_logic_vector(4 downto 0):="01000";
constant clear_b : std_logic_vector(4 downto 0):="01001";
constant clear_c : std_logic_vector(4 downto 0):="01010";
constant setmode_a : std_logic_vector(4 downto 0):="01011";
constant setmode_b : std_logic_vector(4 downto 0):="01100";
constant setmode_c : std_logic_vector(4 downto 0):="01101";
constant setDDRAM_a : std_logic_vector(4 downto 0):="01110";
constant setDDRAM_b : std_logic_vector(4 downto 0):="01111";
constant setDDRAM_c : std_logic_vector(4 downto 0):="10000";
constant writDDRAM_ha : std_logic_vector(4 downto 0):="10001";
constant writDDRAM_hb : std_logic_vector(4 downto 0):="10010";
constant writDDRAM_hc : std_logic_vector(4 downto 0):="10011";
constant writDDRAM_la : std_logic_vector(4 downto 0):="10100";
constant writDDRAM_lb : std_logic_vector(4 downto 0):="10101";
constant writDDRAM_lc : std_logic_vector(4 downto 0):="10110";
constant delay : std_logic_vector(4 downto 0):="10111";
constant setcursor_a : std_logic_vector(4 downto 0):="11000";
constant setcursor_b : std_logic_vector(4 downto 0):="11001";
constant setcursor_c : std_logic_vector(4 downto 0):="11010";
signal state : std_logic_vector(4 downto 0);
signal div_cnt : std_logic_vector(14 downto 0);--分频计数器
signal clk_div : std_logic;
begin
process(clk,nrst)
begin
if(nrst='0')then
div_cnt<="000000000000000";
elsif(clk'event and clk='0')then
div_cnt<=div_cnt+1;
end if;
end process;
clk_div<=div_cnt(14);
process(nrst,clk_div)
variable cnt:std_logic_vector(7 downto 0);
begin
if(nrst='0')then
state<=idle;
cnt:="10000100";
elsif(clk_div'event and clk_div='1')then
case state is
when idle =>
state<=setfunction1_a;
lcd_e<='0';
lcd_rs<='0';
lcd_rw<='0';
data<="00000000";
when setfunction1_a =>
data<="00110100"; --扩充指令操作
lcd_rs<='0';
lcd_rw<='0';
state<=setfunction1_b;
when setfunction1_b =>
lcd_e<='1';
lcd_rs<='0';
lcd_rw<='0';
state<=setfunction1_c;
when setfunction1_c =>
lcd_e<='0';
lcd_rs<='0';
lcd_rw<='0';
state<=setfunction2_a;
when setfunction2_a =>
data<="00110000"; --基本指令操作
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=setfunction2_b;
when setfunction2_b =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='1';
state<=setfunction2_c;
when setfunction2_c =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=clear_a;
when clear_a =>
data<="00010000"; --清除显示
lcd_rs<='0';
lcd_rw<='0';
state<=clear_b;
when clear_b =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='1';
state<=clear_c;
when clear_c =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e<='0';
state<=setmode_a;
when setmode_a =>
data<="00000110";--指定在资料写入或读取时,光标的移动方向,
--DDRAM 的地址计数器(AC)自动增加
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=setmode_b;
when setmode_b =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='1';
state<=setmode_c;
when setmode_c =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=setcursor_a;
when setcursor_a =>
data<="00001100";--开显示,关光标,不闪
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=setcursor_b;
when setcursor_b =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e<='1';
state<=setcursor_c;
when setcursor_c =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=setDDRAM_a;
cnt:="01000000";
when setDDRAM_a => --设定DDRAM地址
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
data <="10000000";
state<=setDDRAM_b;
when setDDRAM_b =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='1';
state<=setDDRAM_c;
when setDDRAM_c =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=writDDRAM_ha; --调用汉字库显示
when writDDRAM_ha => --写入第一字节数据(高位)
lcd_rs<='1';
lcd_rw<='0';
lcd_e <='0';
data<= "10110000";
state<=writDDRAM_hb;
when writDDRAM_hb =>
lcd_rs<='1';
lcd_rw<='0';
lcd_e <='1';
state<=writDDRAM_hc;
when writDDRAM_hc =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
state<=writDDRAM_la;
when writDDRAM_la => --写入第一字节数据(低位)
lcd_rs<='1';
lcd_rw<='0';
lcd_e<='0';
data <="10100000"+cnt;
state<=writDDRAM_lb;
when writDDRAM_lb =>
lcd_rs<='1';
lcd_rw<='0';
lcd_e <='1';
state<=writDDRAM_lc;
when writDDRAM_lc =>
lcd_rs<='0';
lcd_rw<='0';
lcd_e <='0';
if(cnt="00000000")then
state<= delay;
else
cnt:=cnt-1;
state<=writDDRAM_ha;
end if;
when delay => state<=setfunction1_a;
when others =>state<=idle;
end case;
end if;
end process;
end behave;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?