|
大家好,今天我们继续来分享数码管动态显示。既然是动态显示,那么一方面要显示出静态字符,另一方面是让字符移动起来。现在我们就来说一说静态字符显示。
首先,要知道我们用的数码管一共有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
好了,今天就到这里,下次我们来分享动态显示的最后一个模块:移位模块。
|
|