集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1337|回复: 2

动态显示之数码管显示

[复制链接]
zxopenljx 发表于 2020-4-29 13:44:22 | 显示全部楼层 |阅读模式
大家好,今天我们继续来分享数码管动态显示。既然是动态显示,那么一方面要显示出静态字符,另一方面是让字符移动起来。现在我们就来说一说静态字符显示。


首先,要知道我们用的数码管一共有6个,一个数码管显示需要4位数据。那么6的数码管就需要24位数据。6个数码管和24位数据date,都是最高位在最左边,然后依次降低,最右边是最低位。

其次,要想让数码管显示出我们想要的数据,需要三个步骤:
首先是循环扫描6个数码管;
其次是将对应的数据给到相应的数码管;
最后就是通过译码,让数码管显示出我们想要的数据。
最后,我们要知道所用的数码管是低电平“0”点亮,还是高电平“1”点亮。这里,作者使用的是共阳极数码管,所以是低电平“0”点亮。


接下来,我们来分享一下源代码:

00 module seg7(clk_out, rst_n, date, sel, seg);
01
02     input clk_out;                  //驱动时钟
03     input rst_n;                    //系统复位
04     input [23:0] date;              //需要显示的数据
05     
06     output reg [2:0] sel;           //位选
07     output reg [7:0] seg;           //段选
08     
09     
10     /*循环扫描6个数码管*/
11     always@ (posedge clk_out,negedge rst_n)
12     begin
13          if(!rst_n)                      //判断复位
14              sel <=3'd0;                //如果复位,选中第一个数码管
15          else
16              if(sel <3'd5)              //判断是否扫描到最后一个数码管
17                  sel <= sel +3'd1;     //如果没扫描最后一个数码管,就继续扫描下一个数码管
18              else
19                  sel <=3'd0;            //如果到了,就重新开始扫描
20     end
21     
22     /*将对应数据给到相对应的数码管上*/
23     reg[3:0] temp;                     //定义一个4位的数据存储器
24     
25     always@(*)                        //用组合逻辑来写
26     begin
27          if(!rst_n)
28              temp <=4'd0;               //如果复位,将4位2进制数"0"给到temp
29         else
30              case(sel)                   //否则,进入分支语句:以数码管位选作为条件
31                  3'd0   :  temp <= date[23:20];       //第一个数码管,将数据的最高四位给到temp;
32                  3'd1   :  temp <= date[19:16];       //第二个数码管,将数据的次高四位给到temp;
33                 3'd2   :  temp <= date[15:12];       //第三个数码管,将数据的中间四位给到temp;
34                  3'd3   :  temp <= date[11:8];        //第四个数码管,将数据的次中间四位给到temp;
35                  3'd4   :  temp <= date[7:4];          //第五个数码管,将数据的次低四位给到temp;
36                 3'd5   :  temp <= date[3:0];          //第六个数码管,将数据的最低四位给到temp;
37
38                  default:  temp <= date[3:0];          //其它情况,将数据的最低四位给到temp。
39              endcase
40     end
41     
42
43     /*译码*/
44     always@(*)
45      begin
46          if(!rst_n)
47              seg =8'b1011_1111;             //"一"
48          else
49                  case(temp)
50                      4'd0   :  seg =8'b1000_1001;        //数码管显示"H"
51                      4'd1   :  seg =8'b1000_0110;        //数码管显示"E"
52                      4'd2   :  seg =8'b1100_0111;        //数码管显示"L"
53                      4'd3   :  seg =8'b1100_0111;        //数码管显示"L"
54                                                            
55                     4'd4   :  seg =8'b1100_0000;        //数码管显示"O"
56                      4'd5   :  seg =8'b0111_1111;        //数码管显示"."
57                     
58                      default:  seg =8'b1011_1111;    //其它情况,数码管显示"一"
59                  endcase
60     end
61
62 endmodule

好了,今天就到这里,下次我们来分享动态显示的最后一个模块:移位模块。
hellokity 发表于 2020-4-29 13:48:31 | 显示全部楼层
动态显示之数码管显示
zhangyukun 发表于 2020-4-29 15:31:04 | 显示全部楼层
动态显示之数码管显示
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-20 03:32 , Processed in 0.057965 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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