搜索
bottom↓
回复: 4

整理后再一次求助两个并联hc595驱动四位数码管的问题,已经显示了,数不对。。求求各位

[复制链接]

出0入0汤圆

发表于 2011-7-22 16:47:41 | 显示全部楼层 |阅读模式
前天发了一个差不多的贴,没有解决,经过自己在实验,最后终于算是把数码管点亮了。不过显示的数值不对。很乱,这次我整理了程序,有说明,而且程序没了警告,请求大家再次帮看看怎么回事。。我已经弄两三天啦,昨天还搞到病了。。。程序电路在下面。。。程序目的是数码管动态显示 1234。


先谢谢大家帮忙。。。

`timescale 1ns / 1ps


module led1(clk,dclk,dlk,drst,dain);
         
          input clk;                                //内部时钟,接P83
    output reg dclk;                        //输出移位时钟到hc595,接P94
    output reg dlk;                        //输出锁存时钟到hc595,接P95
    output drst;                                //输出复位时钟到hc595,接P98
    output reg dain;                        //输出串行数据口到hc595,接P99
         reg flag,ready;                        //flag标志用来赋值给
         reg [7:0] tim;                        //时间计数器 根据tim[7:6] 为的00,01,10,11 来却分位选和个各段选
         reg [15:0] buf1;                        //数据寄存器
         reg [7:0] dat;                        //段选寄存器
         reg [6:0] cou=0;                        //数据传送计数器
               
         assign drst=1;                        //复位输出等于0
         
          parameter
                zero = 8'b1100_0000,
                one  = 8'b1111_1001,
                two  = 8'b1010_0100,
                three= 8'b1011_0000,
                four = 8'b1001_1001,
                five = 8'b1001_0010,
                six  = 8'b1000_0010,
                seven= 8'b1111_1000,
                eight= 8'b1000_0000,
                nine = 8'b1001_0000;

        always @(posedge clk)
                begin
                        tim=tim+1;                                //计数
                                if(!flag) begin flag<=1; buf1<=16'h1234;end                                //第一次给显示数据:1234       
                                else
                                        begin
                                        if(!ready)      //是否将译码后数据最高位放到dain(串行输出)口上                                                                                       
                                                                begin
                                                                dclk<=0;                        //移位时钟下降沿:准备下次给dain数据
                                                                        if(!buf1)                //判断译码后数据是否传完,传完继续赋值
                                                                        begin
                                                                        dlk<=0;                        //给锁存时钟下降沿,准备下次锁存
                                                                        case (tim[7:6])                        //根据之间段判断位选
                                                        0:           begin
                                                                        case(buf1[15:12])
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                        buf1<={8'b0000_1000,dat};                                                //给译码数据
                                                                        end
                                                       
                                                        1:    begin
                                                                        case(buf1[11:8])
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                                buf1<={8'b0000_0100,dat};
                                                                        end
                                                       
                                                        2:    begin
                                                                        case(buf1[7:4])
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                                buf1<={8'b0000_0010,dat};
                                                              end
                                                       
                                                       
                                                        3:           begin
                                                                        case(buf1[3:0])
                                                                        0: dat <= zero;
                                                                        1: dat <= one;
                                                                        2: dat <= two;
                                                                        3: dat <= three;
                                                                        4: dat <= four;
                                                                        5: dat <= five;
                                                                        6: dat <= six;
                                                                        7: dat <= seven;
                                                                        8: dat <= eight;
                                                                        9: dat <= nine;
                                                                        endcase
                                                                buf1<={8'b0000_0001,dat};
                                                                        end
                                                        endcase
                                                        end
                                                        else
                                                        begin
                                                        dain<=buf1[15];                                //将数据最高位移到dain串行输出口
                                                        buf1<=buf1<<1;                                //数据左移
                                                        ready<=1;                                //数据已经放好,准备输出移位寄存器
                                                        end
                                                        end
                                                        else
                                                        begin
                                if(cou<17) begin dclk<=1;ready<=0;cou<=cou+1;end//移位,ready信号复位,表示数据已经移位到595里面,cou+1;
                             else begin dlk<=1;cou<=0; end                                         //16位数据传完,输出锁存一次输出
                                                        end
                                                        end
                end
endmodule





电路图 (原文件名:54fbb2fbc99cdb6f4f4aeabc.jpg)

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-7-22 17:35:47 | 显示全部楼层
LZ还没去找什么叫“动态显示”和“静态显示”吗?


说句实话,没看到源码里面有比较清晰的时序线索。

出0入0汤圆

 楼主| 发表于 2011-7-22 18:12:02 | 显示全部楼层
回复【1楼】Jigsaw  
-----------------------------------------------------------------------

额。。记错概念了。。不过大概就是这个意思啦。。数码管显示1234.。我想问问清晰的时序线索是怎么构成的。。麻烦教教我。。谢谢。。

出0入0汤圆

发表于 2011-7-22 21:51:34 | 显示全部楼层
你去EDN China的FPGA/CPLD助学小组或者特权的博客看看吧,有这个例子
我这边现在进不去,太慢了,页面一直出错

出0入0汤圆

 楼主| 发表于 2011-7-22 22:23:04 | 显示全部楼层
回复【3楼】Jigsaw  
-----------------------------------------------------------------------

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

本版积分规则

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

GMT+8, 2024-8-27 17:20

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

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