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 + -
显示快捷键?