搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2010-6-3 21:32:32 | 显示全部楼层 |阅读模式
我的方法:

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

3.8个segment就要8个译码包。

貌似方法笨了些。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-6-4 01:41:37 | 显示全部楼层
楼主所指译码包是?三线-八线译码器?

我也有个笨办法,

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

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

出0入0汤圆

 楼主| 发表于 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 [0:0]KEY;
  output [6:0]HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,
              HEX1,HEX0;
              
  wire clk_1hz;
  reg [3:0]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 [25:0]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 [6:0] oseg,
input      [3:0] 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 [6:0] oseg,
input      [3:0] 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

出0入0汤圆

发表于 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
这样一次循环  就可以了 不要考虑左右移的问题,只要每个位的字型码都这样处理 就自动左移   如果向右移则反向处理送出字型码

出0入0汤圆

发表于 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;

ENTITY  LED 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)
  );
END  LED;

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

出0入0汤圆

发表于 2010-6-4 12:36:47 | 显示全部楼层
HELLO滚动视频ourdev_559502.rar(文件大小:1.89M) (原文件名:100_3680.rar)

出0入0汤圆

 楼主| 发表于 2010-6-4 13:05:16 | 显示全部楼层
回复【5楼】281229961  小朱
-----------------------------------------------------------------------

tks 小朱指导。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-15 01:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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