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

📄 lcdelectronicclock.txt

📁 液晶显示的电子钟
💻 TXT
字号:
library ieee ;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity lcd_driver is 
port ( clk   : in std_logic ;       --状态机时钟信号,同时也是液晶时钟信号
       reset : out std_logic ;
       psb   : out std_logic ;
       rw    : out std_logic ;
       rscs  : out std_logic ;
       lcde  : out std_logic ;
       data  : buffer  std_logic_vector ( 7 downto 0) ;
       mia1 : in std_logic_vector( 3 downto 0) ;
       mia2 : in std_logic_vector( 3 downto 0) ;
       fe1  : in std_logic_vector( 3 downto 0) ;
       fe2  : in std_logic_vector( 3 downto 0);
       sh1  : in std_logic_vector( 3 downto 0) ;
       sh2  : in std_logic_vector( 3 downto 0) );
       end lcd_driver ;
architecture behav of lcd_driver is
 type states is ( set ,clr ,set_d ,open1,set_addr,set_ddrom1,
                  set_ddrom2,set_ddrom3,set_ddrom4,set_ddrom5,set_1,
                   set_ddrom6,set_ddrom7,set_ddrom8,set_ddrom9,set_ddrom10,
                   set_ddrom11,set_ddrom12,set_ddrom13,set_ddrom14,s1,s2);
 signal current_state  : states :=set ;
signal miao1 :  std_logic_vector ( 7 downto 0) ;
signal miao2 : std_logic_vector  ( 7 downto 0) ;
signal fen1  : std_logic_vector  ( 7 downto 0) ;
signal fen2  : std_logic_vector  ( 7 downto 0) ;
signal shi1  : std_logic_vector  ( 7 downto 0) ;
signal shi2  : std_logic_vector  ( 7 downto 0) ;
 begin 
  miao1<="0011"&mia1;
  miao2<="0011"&mia2;
  fen1 <="0011"&fe1 ;
  fen2 <="0011"&fe2 ;
  shi1 <="0011"&sh1 ;
  shi2 <="0011"&sh2 ;
  psb <='1' ;
  reset <='1';
  rw <= '0' ;
control:  process ( clk,current_state ) 
          variable fanwei:integer:=2500;
          variable cnt : integer:=0 ;
    begin
     if clk'event and clk='1' then      
        case current_state is 
         when    set => rscs<='0';                        --功能设定
                        data<="00110000" ;                 ----30h
                        lcde<='0';
                   if cnt=2 then lcde<='1' ;cnt:=cnt+1 ;
                      else lcde<='0' ; cnt:=cnt+1 ;
                   end if ;
                   if cnt=fanwei*2 then 
                      current_state<=clr ;cnt:=0 ;else current_state<=set ;
                   end if ;
         when    clr => lcde<='0' ;
                        rscs<='0' ;
                        data<="00000001";                ---清除显示  ,01H
                   if cnt=2 then lcde<='1'; cnt:=cnt+1 ;
                       else lcde<='0'; cnt:=cnt+1;
                   end if ;
                   if cnt=fanwei*2 then 
                        current_state<=set_d ;cnt:=0 ; else current_state<=clr ;
                   end if ;
         when  set_d => lcde<= '0' ;                 -----设定显示的移动方向,06H
                        rscs<= '0' ;
                        data<="00000110";
                    if cnt=2 then lcde<='1';cnt:=cnt+1;
                         else lcde<='0';cnt:=cnt+1;
                    end if ;
                    if cnt=fanwei*2 then 
                         current_state <=open1; cnt :=0 ;  else current_state<=set_d;
                    end if ;
         
         
          when open1=> lcde<='0' ;                   -----显示状态开或关    0FH
                       rscs<='0' ;
                       data<="00001111";
                     if cnt=2 then lcde<= '1'; cnt:=cnt+1 ;
                        else lcde<='0'; cnt:=cnt+1 ;
                     end if ;
                     if cnt=fanwei*2 then 
                         current_state<=set_addr ;cnt:=0 ; else current_state<=open1;
                      end if ;
          when set_addr=>lcde<='0' ;
                         rscs<='0' ;              
                         data<="10000000";           --------设定地址 80H
                       if cnt=2 then lcde<='1'; cnt:=cnt+1 ;
                           else lcde<='0'; cnt :=cnt+1 ;
                       end if ;
                       if cnt=fanwei*2 then 
                         current_state<=set_ddrom1 ;cnt:=0;  else current_state<=set_addr;
                       end if ;
          when set_ddrom1=>lcde<='0' ;
                         rscs<='1' ;
                         data<="11001010";                   ----送字‘时’
                       if cnt=2 then lcde<='1'; cnt:=cnt+1 ;
                           else lcde<='0'; cnt :=cnt+1 ;
                       end if ;
                       if cnt=fanwei*2 then 
                         current_state<=set_ddrom2 ;cnt:=0; else current_state<=set_ddrom1;
                       end if ;
          
         when set_ddrom2=> lcde<='0';
                        rscs<='1';
                        data<="10110001";      -----送字  ‘时’
                         if cnt=2 then   
                              lcde<='1';cnt:=cnt+1;                 
                              else lcde<='0';cnt:=cnt+1;   
                            end if;
                            if cnt=fanwei*2 then
                              current_state<=set_ddrom3;cnt:=0;  else current_state<=set_ddrom2;  
                      end if;
  when set_ddrom3=> lcde<='0';             -----送字 ‘间’
                    rscs<='1';
                    data<="10111100";
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom4;cnt:=0;else current_state<=set_ddrom3;
                        end if;
  when set_ddrom4=> lcde<='0';             -----送字 ‘间’
                    rscs<='1';
                    data<="11100100";
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom5;cnt:=0;else current_state<=set_ddrom4;
                        end if;
         
  when set_ddrom5=> lcde<='0';                -----送小时的数据
                    rscs<='1'; 
                    data<=shi2;
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom6;cnt:=0;else current_state<=set_ddrom5;
                        end if;
  when set_ddrom6=> lcde<='0';               -----送小时的数据
                    rscs<='1';
                    data<=shi1;
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom7;cnt:=0;else current_state<=set_ddrom6;
                        end if;
  when set_ddrom7=> lcde<='0';             -------送  :
                    rscs<='1';
                    data<="10100011";
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom8;cnt:=0;else current_state<=set_ddrom7;
                        end if;
  when set_ddrom8=> lcde<='0';               -------送  :
                    rscs<='1';
                    data<="10111010";
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom9;cnt:=0;else current_state<=set_ddrom8;
                        end if;
        
  when set_ddrom9=> lcde<='0';          -----送分
                    rscs<='1';
                    data<=fen2;
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom10;cnt:=0;else current_state<=set_ddrom9;
                        end if;
  when set_ddrom10=> lcde<='0';               -----送分
                    rscs<='1';
                    data<=fen1;
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom11;cnt:=0;else current_state<=set_ddrom10;
                        end if;
        when set_ddrom11=> lcde<='0';
                    rscs<='1';                     -------送  :
                    data<="10100011";
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom12;cnt:=0;else current_state<=set_ddrom11;
                        end if;
           when set_ddrom12=> lcde<='0';
                    rscs<='1';               -------送  :
                    data<="10111010";
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom13;cnt:=0;else current_state<=set_ddrom12;
                        end if;
             when set_ddrom13=> lcde<='0';                ----送秒
                    rscs<='1';
                    data<=miao2;
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=set_ddrom14;cnt:=0;else current_state<=set_ddrom13;
                        end if;
   when set_ddrom14=> lcde<='0';
                    rscs<='1';        -----送秒
                    data<=miao1;
                      if cnt=2 then 
                               lcde<='1';cnt:=cnt+1;
                             else lcde<='0';cnt:=cnt+1;
                            end if ;
                        if cnt=fanwei*2 then
                           current_state<=open1;cnt:=0;else current_state<=set_ddrom14;
                        end if;
   when others=>current_state<=open1;
  
           end case;
           end if;
end process control;
end behav;                                   

⌨️ 快捷键说明

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