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 date;            //需要显示的数据
05   
06   output reg sel;         //位选
07   output reg 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 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;       //第一个数码管,将数据的最高四位给到temp;
32                  3'd1   :temp <= date;       //第二个数码管,将数据的次高四位给到temp;
33               3'd2   :temp <= date;       //第三个数码管,将数据的中间四位给到temp;
34                  3'd3   :temp <= date;      //第四个数码管,将数据的次中间四位给到temp;
35                  3'd4   :temp <= date;          //第五个数码管,将数据的次低四位给到temp;
36               3'd5   :temp <= date;          //第六个数码管,将数据的最低四位给到temp;
37
38                  default:temp <= date;          //其它情况,将数据的最低四位给到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]
查看完整版本: 动态显示之数码管显示