找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3307|回复: 0
打印 上一主题 下一主题
收起左侧

带液晶、数码管计时和流水灯VHDL程序

[复制链接]
跳转到指定楼层
楼主
ID:51269 发表于 2014-11-10 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity water is
Port(clk:in std_logic;
     RW,EN:out std_logic;
   LCD_Data:out std_logic_vector(8 downto 0);
     LEDR:out std_logic_vector(17 downto 0);
   second:out std_logic;
   Qb0,Qb1:out std_logic_vector(3 downto 0);   
     Qd0,Qd1:out std_logic_vector(6 downto 0));
end;
Architecture dd of water is
signal Qsfp,Qwfp:std_logic_vector(24 downto 0);
signal cps,cpw,LCD_clk:std_logic;
signal qq0,qq1:std_logic_vector(3 downto 0);
signal N:integer range 0 to 73;
signal s:integer range 0 to 1000000;
procedure sum( x:in std_logic_vector(3 downto 0);
               y:out std_logic_vector(6 downto 0))is
begin
     case x is   
     when"0000"=>y:="0111111";
     when"0001"=>y:="0000110";
     when"0010"=>y:="1011011";
     when"0011"=>y:="1001111";
     when"0100"=>y:="1100110";
     when"0101"=>y:="1101101";
     when"0110"=>y:="1111101";
     when"0111"=>y:="0000111";
     when"1000"=>y:="1111111";
     when"1001"=>y:="1101111";
     when others=>y:=Null;
    end case;
end sum;
begin
-------cps means 1s---cpw means flash LED------
Process(clk)
    begin
     if clk'event and clk='1' then
      Qsfp<=Qsfp+1;     --1s court
      Qwfp<=Qwfp+1;     --0.1s court
  s<=s+1;
    ------------------------
      if Qsfp=24999999 then
       Qsfp<="0000000000000000000000000";
       cps<=not cps;  --1Hz  
      end if;
      
    -------------------------
     if Qwfp=1499999 then
       Qwfp<="0000000000000000000000000";
       cpw<=not cpw;   --10Hz
      end if;
    --------------------------
        if s=0 then
      LCD_clk<= not LCD_clk;
      end if;
       end if;
end process;
-------------- 60s court--------------
Process(cps)
    begin
     if cps'event and cps='1' then
         qq0<=qq0+1;
     ------ge-------
     if qq0=9 then
        qq0<="0000";
      qq1<=qq1+1;
     end if;
     ------shi-------
     if qq1=5 and qq0=9 then
         qq1<="0000";
     end if;
   end if;
end process;
----------display   60s court-------
process(qq0,qq1,cps)
    variable y0,y1:std_logic_vector(6 downto 0);
    begin
    second<=cps;
    Qb0<=qq0;
  Qb1<=qq1;
  sum(qq0,y0);
  sum(qq1,y1);
  Qd0<=not y0;
  Qd1<=not y1;
   end process;
---------display flash LED-----------
Process(cpw)

   begin
   if cpw'event and cpw='1' then
      N<=N+1;
      if N=90 then
       N<=0;
      end if;
      if N<18 then  
     LEDR(N)<='1';
  end if;
  if N>17 and N<36 then
      LEDR(35-N)<='0';
  end if;
  if N>35 and N<54 then
     LEDR(N-36)<='0';
   LEDR(N-35)<='1';
  end if;
  if N>53  and N< 73 then
     LEDR(72-N)<='0';
   LEDR(71-N)<='1';
  end if;
  if N>72  and N< 81 then  
    LEDR(N-72)<='1';
    LEDR(90-N)<='1';
  end if;
  If N>80 and N<90 then
     LEDR(N-71)<='0';
   LEDR(90-N)<='0';
  end if;
  ----------------------  
   end if;  
end process;
------------Display LCD------------------
     EN<=LCD_clk;
  RW<='0';
process(LCD_clk)
   variable cnt:std_logic_vector(5 downto 0);
   begin
    if LCD_clk'event and LCD_clk='1' then
      cnt:=cnt+1;
    case cnt is
           --------------写指令--------------   
      when "000000"=>LCD_Data<="000111000";--/*设置8位格式,2行,5*7*/  ,顺序2,3的要求   
      when "000001"=>LCD_Data<="000001100";   --/*整体显示,关光标,光标闪烁/  ,顺序4的要求   
      when "000010"=>LCD_Data<="000000001";--清屏,顺序5的要求   
      when "000011"=>LCD_Data<="000000110";  --/*显示移动格式,看最后两位,10表示光标右移,顺序6的要求   
      when "000100"=>LCD_Data<="010000000";--设定显示的位置在00H+80H,即显示屏第一行第一个位置,顺序7的要求
      --------------写数据---------------
      when "000101"=>LCD_Data<="110100000";--空格   
      when "000110"=>LCD_Data<="110100000";--空格   
      when "000111"=>LCD_Data<="110100000";--空格
      when "001000"=>LCD_Data<="101011001"; --Y   
      when "001001"=>LCD_Data<="101110101";--u   
      when "001010"=>LCD_Data<="101101010";--j   
      when "001011"=>LCD_Data<="101101001";--i   
      when "001100"=>LCD_Data<="101100001";--a   
      when "001101"=>LCD_Data<="101101110";--n   
      when "001110"=>LCD_Data<="101110001";--q      
      when "001111"=>LCD_Data<="101110101";--u   
      when "010000"=>LCD_Data<="101100001";--a   
      when "010001"=>LCD_Data<="101101110";--n   
      when "010010"=>LCD_Data<="110100000";---空格   
      when "010011"=>LCD_Data<="110100000";---空格   
      when "010100"=>LCD_Data<="110100000";---空格
      
      when "010101"=>LCD_Data<="011000000";--设定显示的位置在10H+80H,
     
      when "010110"=>LCD_Data<="101000100";---D diangong xueyuan   
      when "010111"=>LCD_Data<="101101001";---i   
      when "011000"=>LCD_Data<="101100001";---a
      when "011001"=>LCD_Data<="101101110";---n   
      when "011010"=>LCD_Data<="101100111";---g   
      when "011011"=>LCD_Data<="101101111";---o
      when "011100"=>LCD_Data<="101101110";--n   
      when "011101"=>LCD_Data<="101100111";---g   
      when "011110"=>LCD_Data<="110100000";--- 空格   
      when "011111"=>LCD_Data<="101011000";---X
      when "100000"=>LCD_Data<="101110101";---u   
      when "100001"=>LCD_Data<="101100101";---e   
      when "100010"=>LCD_Data<="101111001";---y
      when "100011"=>LCD_Data<="101110101";---u   
      when "100100"=>LCD_Data<="101100001";---a   
      when "100101"=>LCD_Data<="101101110";---n      
      when others =>LCD_Data<="110100000";
     --when "01100"=>LCD_Data<="011000000";--设定显示的位置在10H+80H,即显示屏第2行第一个位置  
     end case;
    end if;
end process;   
end;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表