yf.x 发表于 2010-6-3 21:32:32

8个7segment循环显示hello,给个思路,谢谢。

我的方法:

1.先做一个8进制的计数器。
2.每个7segment对应一个译码包(因为同样的8进制计数器的输出对应不同的译码)。

3.8个segment就要8个译码包。

貌似方法笨了些。

wowbanui 发表于 2010-6-4 01:41:37

楼主所指译码包是?三线-八线译码器?

我也有个笨办法,

如果用动态扫描的办法的话那就把8个数码管的7个段并联,每个数码管的公共脚接出, 这样就类似抽象成一个8行7列的点阵, 扫描即可, 想实现什么效果在软件里都成
优点:硬件成本相对较低
缺点:单片机需要不断刷新显示,需要根据数码管接线取模

如果静态的话倒不如用8个595, 每个595带一个数码管,小数点也有了,8个数码管公共脚接一起,串入并出还带锁存,这样单片机只需3个脚即可,
优点:节省单片机资源, 只需在更新画面的时候操作, 其它时候单片机什么都不用干
缺点:硬件成本高

yf.x 发表于 2010-6-4 07:57:50

回复【1楼】wowbanui
-----------------------------------------------------------------------

谢谢,我这儿板子上的数码管使能端固定了,不能动态扫描显示。要求就是在8个数码管上按从右到左的顺序循环显示hello。我的笨代码如下:

//top-level file
module hello(HEX7,HEX6,HEX5,HEX4,
             HEX3,HEX2,HEX1,HEX0,
             CLOCK_50,KEY);
input CLOCK_50;
input KEY;
output HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,
            HEX1,HEX0;
            
wire clk_1hz;
reg cnt;

div u0(.o_clk(clk_1hz),
         .rst_n(KEY),
         .i_clk(CLOCK_50)
         );
         
always @(posedge clk_1hz or negedge KEY)
begin
    if(!KEY)
      cnt<=4'b0;
    else
    begin
      if(cnt==4'b0111)
      cnt<=4'b0;
      else
      cnt<=cnt+1'b1;
    end
end

seg7_h0 h0(.oseg(HEX0),
             .idig(cnt)
             );
seg7_h1 h1(.oseg(HEX1),
             .idig(cnt)
             );
seg7_h2 h2(.oseg(HEX2),
             .idig(cnt)
             );
seg7_h3 h3(.oseg(HEX3),
             .idig(cnt)
             );
seg7_h4 h4(.oseg(HEX4),
             .idig(cnt)
             );
seg7_h5 h5(.oseg(HEX5),
             .idig(cnt)
             );
seg7_h6 h6(.oseg(HEX6),
             .idig(cnt)
             );
seg7_h7 h7(.oseg(HEX7),
             .idig(cnt)
             );
endmodule


//divider
module div(
         output reg o_clk,
         input      rst_n,
         input      i_clk
         );
         
         parameter N=50_000_000;
         parameter M=24_999_999;
         
         reg cnt;
         
         always @(posedge i_clk or negedge rst_n)
         begin
             if(!rst_n)
               cnt<=26'b0;
             else
               begin
               if(cnt==N-1)
                   cnt<=26'b0;
               else
                   cnt<=cnt+26'b1;
               end
         end
         always @(posedge i_clk or negedge rst_n)
         begin
             if(!rst_n)
               o_clk<=0;
             else
             begin
               if(cnt<=M)
               o_clk<=1;
               else
               o_clk<=0;
             end
         end
         
endmodule

//seg7_lut
module seg7_h0
(
output reg oseg,
input       idig
);
always @ (idig)
begin
case (idig)
   4'h0: oseg = 7'b1000000; //O
   //4'h1: oseg = 7'b1111001;
   //4'h2: oseg = 7'b0100100;
   //4'h3: oseg = 7'b0110000;
   4'h4: oseg = 7'b0001001;//H
   4'h5: oseg = 7'b0000110;//E
   4'h6: oseg = 7'b1000111;//L
   4'h7: oseg = 7'b1000111;//L

   default: oseg = 7'b1111111;
endcase
end
endmodule

。。。。。。

//seg7_lut
module seg7_h7
(
output reg oseg,
input       idig
);
always @ (idig)
begin
case (idig)
   4'h7: oseg = 7'b1000000; //O
   //4'h1: oseg = 7'b1111001;
   //4'h2: oseg = 7'b0100100;
   //4'h3: oseg = 7'b0110000;
   4'h3: oseg = 7'b0001001;//H
   4'h4: oseg = 7'b0000110;//E
   4'h5: oseg = 7'b1000111;//L
   4'h6: oseg = 7'b1000111;//L

   default: oseg = 7'b1111111;
endcase
end
endmodule

281229961 发表于 2010-6-4 09:17:24

在每个左移脉冲的时候 给当前位的字型码加一就可以了!
比如 字型码顺序0-H 1-E 2-L 3-L 4-O
假如当前是H 下一次显示就是E
    当前是E 下一次显示就是L
    当前是L 下一次显示就是L
    当前是L 下一次显示就是O
    当前是O 下一次显示就是H
这样一次循环就可以了 不要考虑左右移的问题,只要每个位的字型码都这样处理 就自动左移   如果向右移则反向处理送出字型码

281229961 发表于 2010-6-4 11:00:16

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITYLED IS
PORT(
    clk   : IN STD_LOGIC;
    leddrv        :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
    segint: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
    segset        :OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
ENDLED;

ARCHITECTURE maxii_lamp2 OF LED IS
SIGNAL reg : STD_LOGIC_VECTOR(3 DOWNTO 0) :="0000";
signal clkd:STD_LOGIC;
signal clkv:STD_LOGIC;
signal oseg: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL seg1 : STD_LOGIC_VECTOR(2 DOWNTO 0) :="000";
signal segv :STD_LOGIC_VECTOR(2 DOWNTO 0):="000";
BEGIN
leddrv <= reg;
segint <= oseg;
        PROCESS(clk)
        VARIABLE cnt : INTEGER RANGE 0 TO 2400000 :=0;
        BEGIN
                IF clk'EVENT AND clk='1' THEN
                  cnt := cnt+1;
                  IF cnt= 2400000 THEN
                        cnt := 0;
                        clkd<=not clkd; --------左移时钟
                        reg <= reg+"0001";    -----led显示
                  END IF;
                END IF;
        END PROCESS;
-------------------------------------
        PROCESS(clk)
        VARIABLE cnt1 : INTEGER RANGE 0 TO 24000 :=0;
        BEGIN
                IF clk'EVENT AND clk='1' THEN
                  cnt1 := cnt1+1;
                  IF cnt1= 24000 THEN
                        cnt1 := 0;
                        clkv<=not clkv;-----动态扫描时钟
                  END IF;
                END IF;
        END PROCESS;
-------------------------------------
        PROCESS(clkv)
       
        BEGIN
                IF clkv'EVENT AND clkv='1' THEN
                                segv<=segv+"001";
                        if segv="011" then
                                segv<="000";
                        END IF;
                END IF;
        END PROCESS;
----------------------------------------
        process(clk,clkd)
        begin
        IF clkd'EVENT AND clkd='1' THEN
                        seg1<=seg1+"001";
                        if seg1="100"then
                                seg1<="000";
                        end if;
        end if;
        end process;
---------------------------------------
        process(clkv,clk)
        begin
                IF clk'EVENT AND clk='1' THEN
                        if segv="000"then
                                segset<="1110";
                                case seg1 is
                                       when"100"=>oseg <="11000000";--o
                                       when"000"=>oseg <="10001001";--h
                                       when"001"=>oseg <="10000110";--e
                                       when"010"=>oseg <="11000111";--l
                                       when"011"=>oseg <="11000111";--l
                                       when others=> oseg <="11111111";--8
                                  end case;
                        end if;
---------------------------------------------------
                if segv="001"then
                        segset<="1101";
                        case seg1 is
                               when"100"=>oseg <="10001001";--h
                               when"000"=>oseg <="10000110";--e
                               when"001"=>oseg <="11000111";--l
                               when"010"=>oseg <="11000111";--l
                               when"011"=>oseg <="11000000";--o                               
                               when others=> oseg <="11111111";--8
                        end case;
                        end if;
----------------------------------------------------
                if segv="010"then
                        segset<="1011";
                        case seg1 is
                               when"011"=>oseg <="10001001";--h
                               when"100"=>oseg <="10000110";--e
                               when"000"=>oseg <="11000111";--l
                               when"001"=>oseg <="11000111";--l
                               when"010"=>oseg <="11000000";--o                               
                               when others=> oseg <="11111111";--8
                        end case;   
                        end if;
---------------------------------------------------------       
                        if segv="011"then
                        segset<="0111";
                        case seg1 is
                               when"010"=>oseg <="10001001";--h
                               when"011"=>oseg <="10000110";--e
                               when"100"=>oseg <="11000111";--l
                               when"000"=>oseg <="11000111";--l
                               when"001"=>oseg <="11000000";--o                               
                               when others=> oseg <="11111111";--8
                        end case;
                        end if ;
                        end if;
---------------------------------------------------------
        end process;
       
END maxii_lamp2;
说明 :我的板子上只有4个数码管 所以只能写四位了!附带4个led自加流动0000--》1111

281229961 发表于 2010-6-4 12:36:47

HELLO滚动视频ourdev_559502.rar(文件大小:1.89M) (原文件名:100_3680.rar)

yf.x 发表于 2010-6-4 13:05:16

回复【5楼】281229961小朱
-----------------------------------------------------------------------

tks 小朱指导。
页: [1]
查看完整版本: 8个7segment循环显示hello,给个思路,谢谢。