16数码管静态显示(74hc_595)

一、数码管静态显示
1、数码管
数码管是一种半导体发光器件,其基本单元是发光二极管。
待显示内容 段码(二进制格式) 段码(十六进制格式)
在这里插入图片描述

6位8段数码管
在这里插入图片描述

2、74HC595
74HC595是一个8位串行输入、并行输出的位移缓存器。其内部具有8位移位寄存器和一个存储器,具有三态输出功能。
在这里插入图片描述

输入方式:seg[0]…seg[7] sel[7]…sel[0]
!在这里插入图片描述](https://img-blog.csdnimg.cn/20210123131322340.png)

端口作用
连接到FPGA上的端口有4个,分别是DS、SHCP、STCP、OE
MR:复位端,对数据进行清零,不接到FPGA芯片上面,直接接到vcc上,避免对数据清零
DS:将串行数据传送到移位寄存器中
SHCP:移位寄存器的时钟输入端,在上升沿时将输入的数据移入到移位寄存器中间,先进来的数据在最后面,最多输入8bit数据,如果超过8bit,比如14位,那么最前面输入的6位数据会通过Q7S端口输出,Q7S会与下一个74HC595芯片的DS相连接
STCP:存储寄存器时钟,控制8位的存储器,在上升沿时,将移位寄存器中的数据写入到8位存储器中。
OE:使能信号,低电平有效,当使能信号有效时,会将存储器中的数据通过端口传输出去。

二、实现
实现数码管从000000~FFFFFF的循环显示,每个显示0.5s

1、电路图
在这里插入图片描述

2、输入输出方式
在这里插入图片描述

3、整体框图
在这里插入图片描述

4、数码管显示部分
在这里插入图片描述

波形图
在这里插入图片描述

程序:

module seg_static
#(
    parameter CNT_MAX = 25'd24999999
)
(
    input wire  sys_clk,
    input wire  sys_rst_n,
    
    output  reg [5:0]   sel,
    output  reg [7:0]   seg
);


reg [24:0]  cnt;
reg [3:0]   data;
/* reg         cnt_flag; */

//cnt_wait:0.5秒计数
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        cnt <= 25'd0;
    else if (cnt == CNT_MAX)
        cnt <= 25'd0;
    else
        cnt <= cnt + 1'b1;

 //num:从 4'h0 加到 4'hf 循环       
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        data <= 4'd0;
    else if ((data == 4'd15)&&(cnt == CNT_MAX))
        data <= 4'd0;
    else if (cnt == CNT_MAX)//也可以使用标志信号进行控制
        data <= data + 1'b1;
    else
        data <= data;
        
//add_flag:0.5s拉高一个标志信号        
/* always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n ==1'b0)
        cnt_flag <= 1'b0;
    else if (cnt == (CNT_MAX-25'd1))
        cnt_flag <= 1'b1;
    else
        cnt_flag <= 1'b0;  */

//sel:选中六个数码管       
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n ==1'b0)
        sel <= 6'd0;
    else
        sel <=  6'b111111;
//给要显示的值编码,段显示        
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        seg <= 8'hff;
    else  case(data)
            4'd0:   seg <= 8'hc0;
            4'd1:   seg <= 8'hf9;
            4'd2:   seg <= 8'ha4;
            4'd3:   seg <= 8'hb0;
            4'd4:   seg <= 8'h99;
            4'd5:   seg <= 8'h92;
            4'd6:   seg <= 8'h82;
            4'd7:   seg <= 8'hf8;
            4'd8:   seg <= 8'h80;
            4'd9:   seg <= 8'h90;
            4'd10:   seg <= 8'h88;
            4'd11:   seg <= 8'h83;
            4'd12:   seg <= 8'hc6;
            4'd13:   seg <= 8'ha1;
            4'd14:   seg <= 8'h86;
            4'd15:   seg <= 8'h8e;
            default:    seg <= 8'hff;
          endcase
endmodule

5、hc595控制
在这里插入图片描述在这里插入图片描述

程序:

module hc595_ctrl
(
    input   wire        sys_clk         ,
    input   wire        sys_rst_n       ,
    input   wire [5:0]  sel             ,
    input   wire [7:0]  seg             ,
    
    output  reg         ds   , //串行数据输入
    output  reg        shcp  , //移位寄存器时钟
    output  reg        stcp  , //移位寄存器时钟
    output  wire        oe     //使能信号,低有效       

);
wire    [13:0]  data    ;   //数码管信号寄存
reg     [1:0]   cnt     ;   //分频计数器
reg     [3:0]   cnt_bit ;   //传输位数计数器

//将数码管信号寄存
assign  data ={seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel[5:0]};

//分频计数器:0~3循环计数
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt <= 2'd0;
    else if (cnt == 2'd3)
        cnt <= 2'd0;
    else
        cnt <= cnt + 1'b1;
        
//cnt_bit:每输入一位数据加一        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)     
        cnt_bit <= 4'b0;
    else if ((cnt_bit == 4'd13)&&(cnt == 2'd3))
        cnt_bit <= 4'b0;
    else if(cnt == 2'd3)
        cnt_bit <= cnt_bit +1'b1;
    else
        cnt_bit <= cnt_bit;
        
//ds:将寄存器里存储的数码管信号输入即        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        ds <= 1'b0;
    else if (cnt == 2'd0)
        ds <= data [cnt_bit];
    else
        ds <= ds;

//shcp:产生四分频移位时钟
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        shcp <= 1'b0;
    else if (cnt >= 2'd2)
        shcp <= 1'b1;
    else 
        shcp <= 1'b0;

//stcp:14个信号传输完成之后产生一个上升沿  
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        stcp <= 1'b0;
    else if ((cnt_bit == 4'd0)&&(cnt == 2'd0))
        stcp <= 1'b1;
    else if ((cnt_bit == 4'd0)&&(cnt == 2'd2))
        stcp <= 1'b0;
    else
        stcp <= stcp;
 
//使能信号,低电平有效,所以一直为低电平 
 assign oe = 1'b0;   


endmodule

6、整体程序(将前面两个模块连接起来)

module seg_595_static
(
    input wire  sys_clk,
    input wire  sys_rst_n,
    
    output  wire    ds,
    output  wire    shcp,
    output  wire    stcp,
    output  wire    oe


);
wire [5:0]  sel;
wire [7:0]  seg;

seg_static
#(
    .CNT_MAX (25'd24999999)
)
seg_static_inst
(
    . sys_clk  (sys_clk),
    . sys_rst_n(sys_rst_n),

    .  sel     (sel ),
    .  seg     (seg )
);

hc595_ctrl  hc595_ctrl_inst
(
    . sys_clk    (sys_clk)    ,
    . sys_rst_n  (sys_rst_n)    ,
    . sel        (sel)    ,
    . seg        (seg)    ,

    . ds         (ds)    ,
    .shcp        (shcp)   ,
    .stcp        (stcp)   ,
    . oe         (oe)

);
endmodule

测试程序
对整体的框图进行编写测试程序

`timescale  1ns/1ns
module  tb_seg_595_static();


wire    stcp    ;   //输出数据存储寄时钟
wire    shcp    ;   //移位寄存器的时钟输入   
wire    ds      ;   //串行数据输入
wire    oe      ;   //输出使能信号


reg     sys_clk     ;
reg     sys_rst_n   ;


//对sys_clk,sys_rst_n赋初始值
initial
    begin
        sys_clk     =   1'b1;
        sys_rst_n   <=  1'b0;
        #100
        sys_rst_n   <=  1'b1;
    end

//clk:产生时钟
always  #10 sys_clk <=  ~sys_clk;

//-------------seg_595_static_inst-------------
//使用顶层模块的实例化
seg_595_static  seg_595_static_inst
(
    .sys_clk     (sys_clk   ),  //系统时钟,频率50MHz
    .sys_rst_n   (sys_rst_n ),  //复位信号,低电平有效

    .stcp        (stcp      ),   //输出数据存储寄时钟
    .shcp        (shcp      ),   //移位寄存器的时钟输入
    .ds          (ds        ),   //串行数据输入
    .oe          (oe        )    //输出使能信号
);

endmodule

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
74HC595是一种常见的8位移位寄存器,常用于控制数码管显示。接下来我将用文回答74HC595控制数码管显示的代码。 步骤如下: 1. 首先,我们需要定义数码管的引脚连接。常规连接方式是将74HC595的SER(Serial Data Input)引脚连接到单片机的一个GPIO引脚,将74HC595的SRCLK(Serial Clock Input)引脚连接到另一个GPIO引脚,将74HC595的RCLK(Register Clock Input)引脚连接到第三个GPIO引脚。此外,还将74HC595的Q0-Q7引脚连接到对应的数码管的A-G引脚,以及DP引脚。 2. 在代码,首先需要初始化相应的GPIO引脚。将SER引脚设置为输出模式,SRCLK和RCLK引脚设置为输出模式。 3. 接下来,我们可以通过移位操作来发送数据到74HC595的SER引脚,以控制数码管显示的内容。具体操作为:将要显示的数据逐位移位,然后通过SRCLK引脚发送时钟信号,最后通过RCLK引脚锁存数据。 4. 如果需要显示多个数码管,可以将显示的数据存储在一个数组或者变量,然后循环发送数据到74HC595。 下面是一个简单的示例代码: ```c++ #include <Arduino.h> // 定义74HC595引脚连接 const int SER_Pin = 2; // SER引脚连接到GPIO2 const int SRCLK_Pin = 3; // SRCLK引脚连接到GPIO3 const int RCLK_Pin = 4; // RCLK引脚连接到GPIO4 // 数码管显示数据(以共阴数码管为例) byte ledData[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6}; void setup() { // 初始化引脚 pinMode(SER_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); } void loop() { for(int i = 0; i < 10; i++) { // 移位并发送数据 shiftOut(SER_Pin, SRCLK_Pin, MSBFIRST, ledData[i]); digitalWrite(RCLK_Pin, HIGH); digitalWrite(RCLK_Pin, LOW); delay(1000); // 延时1秒 } } ``` 以上就是使用74HC595控制数码管显示的代码示例。在循环,我们将依次显示0至9的数字。你可以根据自己的需求修改代码以实现更复杂的显示模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值