⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.vhd

📁 基于DE2实验板
💻 VHD
字号:
library IEEE;-------------------------------------------Succeed!
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LCD is
port(	clk:in std_logic;       ---------------50MHZ
    	rs: out std_logic;
    	rw: out std_logic;
    	en: out std_logic;
		lcd_on: out std_logic;
        lcd_blon: out std_logic;
		Reset : in std_logic;           --------------key0
 --ckout: out std_logic;-----------------
 --bcout: out std_logic;-------------------
    	data: out std_logic_vector(7 downto 0));
end LCD;

architecture Behavioral of LCD is
type datatype is array (0 to 15) of std_logic_vector(7 downto 0);
CONSTANT WELLCOME : datatype :=(x"31",x"32",x"33",x"34",
                                x"35",x"36",x"37",x"38",
            					x"39",x"41",x"42",x"43",
           					    x"44",x"45",x"46",x"46");
        
type statetype is(s1,s2,s3,s4);
signal state    :statetype;  
signal datacnt  :integer range 0 to 15;
signal b		:integer range 0 to 12499;
signal bc       :std_logic; 
signal ck       :std_logic;

begin
process(clk)
begin
  if rising_edge(clk) then
   		if b=12499 then
   			 b<=0;
   		else
    		 b<=b+1;
   		end if;
  end if;
  if b<6249 then
   		bc<='1';
  else
   		bc<='0';
  end if;
end process;

process(bc)
variable s:integer range 0 to 7;
begin
  if rising_edge(bc) then
   		if s=7 then
    		s:=0;
   		else
    		s:=s+1;
   		end if;
  end if;  
  if s<4 then
   		ck<='0';
  else
   		ck<='1';
  end if;
end process;

process(ck,state)
begin
	if Reset='0' then
	      state <= s1;
	      --LCD_RS <= '0';
  	elsif rising_edge(ck) then
   		case state is
    			when s1=>
     					rs<='0';
					    if(datacnt=0)then
      						data<="00000110";             --/////传送的是命令0x06
      						datacnt<=datacnt+1;
     					elsif(datacnt=1)then
      						data<="00001100";             --/////传送的是命令0X0C
      						datacnt<=datacnt+1;
     					elsif(datacnt=2)then
      						data<="00111000";             ------/ 传送的是吗命令0X38
      						datacnt<=datacnt+1;
     					else
      						data<="10000000";            -------- 传送 的是0X80;
      						datacnt<=0;
      						state<=s2;
     					end if;
    			when s2=>
     					rs<='1';
     					if datacnt=15 then
      						state <= s3;    
      						data <= WELLCOME(datacnt);
      						datacnt<=0;
     					else
      						state <= s2;       
      						data <= WELLCOME(datacnt);    ------/ 把数组中的数据送入液晶控制模块进行显示
      						datacnt<=datacnt+1;
     					end if;
    			when s3=>
						rs<='0';
     					data<="11000000";                 ------/  传递的是命令0XC0;
     					state<=s4;
    			when s4=>
     					rs<='1';
     					if datacnt=15 then              -------- 回到出示状态进行显示
      						state <= s1;    
      						data <= WELLCOME(datacnt);   
      						datacnt<=0;
     					else
      						state <= s4;       
      						data <= WELLCOME(datacnt);   --------  于第二行中显示数据
     						 datacnt<=datacnt+1;
     					end if;
    			when others=>state<=s1;
   			end case;
  		end if;
end process;

rw<='0';
en<=ck;
 --ckout<=ck;--------------------
 --bcout<=bc;-----------------------
  lcd_on <= '1';
lcd_blon <= '1';
end Behavioral;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -