74HC595工作原理及FPGA实现数码管驱动方法

这篇具有很好参考价值的文章主要介绍了74HC595工作原理及FPGA实现数码管驱动方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

74HC595工作原理及FPGA实现数码管驱动方法

 74HC595,移位寄存器,串行输入,8位并行输出,一般用于数码管电路以减少使用的IO口数量。


管脚介绍:

Q0~Q7 :八位并行输出位

Q7'       :  级联位,若输入位数大于8位,先进入的位会从此口连续输出,用于多片之间的级联

VCC GND 不多介绍

Ds        :  串行数据输入位

OE       : 输出使能位,低有效,一般直接全程给低电平就行

SHcp   :  移位寄存器时钟输入,后文详述

STcp    :  存储寄存器时钟输入,同上

MR      : 主复位,低有效,一般直接接到VCC拉高


74HC595工作原理及FPGA实现数码管驱动方法

       上图为74HC595内部结构,一个8位的移位寄存器,一个8位的存储寄存器,再有一个8位的并行输出。

      为讲明Q7'的级联作用,此处应用场景选择为:6位8段数码管,驱动此数码管共需要8位段选端和6位位选端,共14位串行数据输入。

       Ds数据输入端串行输入时,在SHcp的上升沿将数据移入移位寄存器内,每个SHcp上升沿移入一位单bit数据,最先输入的一直向后移直到8个SHcp上升沿后,移位寄存器填满,此时若数据输入端还有数据输入,下一个SHcp上升沿到来时,最先输入的1bit数据就会从Q7'输出(此处可理解为队列,先进先出)。在STcp的上升沿,数据会从移位寄存器进入存储寄存器中,当OE低有效时,存储寄存器中的值从Q0~Q7并行输出。

74HC595工作原理及FPGA实现数码管驱动方法

 

       上述应用场景下,将第一片74HC595的Q7‘串行输出端接到第二片的数据输入端Ds,实现级联功能。经过14个时钟SHcp上升沿后,数据已经全部移位进入移位寄存器,一次共输入14位数据,那么第一位输入的串行数据会在第二片74HC595芯片的Q5输出,此时给一个上升沿的STcp信号就可以将信号移入存储寄存器,OE信号持续给低, 即可输出。

上述过程中还存在一个问题,SHCP频率给多少合适?它是有限制的

74HC595工作原理及FPGA实现数码管驱动方法

        我实验板子的电压为3.3V,取图中2V的亦可,采用50MHZ的四分频12.5MHZ作为SHCP时钟,计数SHCP时钟上升沿,14个上升沿给出一个STCP的上升沿作为STCP时钟,相当于STCP时钟是SHCP时钟的14分频。

主要难点就在于SHCP和STCP时钟的获得,其他的按步骤来即可。

代码如下,需者自取(静态数码管)

`timescale 1ns/1ns


module seg_static(
    input sys_clk,
    input sys_rst_n,
    output reg [7:0]seg,
    output reg [5:0]sel
);

parameter seg_0 = 8'hc0,
          seg_1 = 8'hf9,
          seg_2 = 8'ha4,
          seg_3 = 8'hb0,
          seg_4 = 8'h99,
          seg_5 = 8'h92,
          seg_6 = 8'h82,
          seg_7 = 8'hf8,
          seg_8 = 8'h80,
          seg_9 = 8'h90,
          seg_a = 8'h88,
          seg_b = 8'h83,
          seg_c = 8'hc6,
          seg_d = 8'ha1,
          seg_e = 8'h86,
          seg_f = 8'h8e;
          
parameter cnt_500ms = 25'd24_999_999 ;
//parameter cnt_500ms = 25'd32_999_999 ;      

reg [24:0]cnt;   
reg [3:0]num;
          
always@(posedge sys_clk or negedge sys_rst_n)          
        if(sys_rst_n==1'b0)  
          cnt <= 25'd0;
          else if(cnt==cnt_500ms)
           cnt <= 25'd0;
           else 
           cnt <= cnt + 1'b1;
           
           
always@(posedge sys_clk or negedge sys_rst_n)          
        if(sys_rst_n==1'b0)  
          num <= 4'd0;
          else if(num==4'd15 && cnt==cnt_500ms)
           num <= 4'd0;
           else if(cnt==cnt_500ms)
           num <= num + 1'b1; 
            else 
           num <= num;
           
always@(posedge sys_clk or negedge sys_rst_n)          
        if(sys_rst_n==1'b0)  
          seg <= 8'b1111_1111;
          else
           case(num)          
          0 : seg <= seg_0;
          1 : seg <= seg_1;
          2 : seg <= seg_2;
          3 : seg <= seg_3;
          4 : seg <= seg_4;
          5 : seg <= seg_5;
          6 : seg <= seg_6;
          7 : seg <= seg_7;
          8 : seg <= seg_8;
          9 : seg <= seg_9;
         10 : seg <= seg_a;
         11 : seg <= seg_b;
         12 : seg <= seg_c;
         13 : seg <= seg_d; 
         14 : seg <= seg_e; 
         15 : seg <= seg_f; 
      default : seg <= 8'b1111_1111;   
      endcase
      
always@(posedge sys_clk or negedge sys_rst_n)          
        if(sys_rst_n==1'b0)  
          sel <= 6'b0;
          else 
          sel <= 6'b111_111;         
         
          
endmodule
`timescale  1ns/1ns


module hc595_ctrl(
    input sys_clk,
    input sys_rst_n,
    input wire [7:0]seg,
    input wire [5:0]sel,
    output reg shcp,
    output reg stcp,
    output reg ds,
    output wire oe
);

reg [1:0]cnt_4;
reg [3:0]cnt_14;

wire [13:0]data;

assign data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel};

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        cnt_4 <= 2'b0;
        else if(cnt_4==2'd3)
        cnt_4 <= 2'b0;
        else 
        cnt_4 <= cnt_4 + 1'b1;


//sys_clk的四分频当作shcp时钟
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        shcp <= 1'b0;
        else if(cnt_4 <= 2'd1)
        shcp <= 1'b0;
        else  
        shcp <= 1'b1;
        
        
//产生stcp时钟
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        cnt_14 <= 4'b0;
        else if(cnt_14==4'd13 && cnt_4==2'd3)
        cnt_14 <= 4'b0;
        else if(cnt_4==2'd3)
         cnt_14 <= cnt_14 + 1'b1;
        else 
        cnt_14 <= cnt_14;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        stcp <= 1'b0;
        else if(cnt_14==4'd13 && cnt_4==2'd3)
        stcp <= 1'b1;
        else 
        stcp <= 1'b0;


//产生ds信号

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        ds <= 1'b0;
        else if(cnt_4==2'd0)
        ds <= data[cnt_14];
        else 
        ds <= ds;


//产生oe信号

assign oe = ~sys_rst_n;



endmodule
`timescale  1ns/1ns

module smg_static(
    input  sys_clk,
    input  sys_rst_n,
    output shcp,
    output stcp,
    output oe,
    output ds
);

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

seg_static seg_static_inst(
   .sys_clk(sys_clk),
   .sys_rst_n(sys_rst_n),
   .seg(seg),
   .sel(sel)

);

hc595_ctrl hc595_ctrl_inst(
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .seg(seg),
    .sel(sel),
    .shcp(shcp),
    .stcp(stcp),
    .ds(ds),
    .oe(oe)
);

endmodule

动态数码管随缘更新文章来源地址https://www.toymoban.com/news/detail-402045.html

到了这里,关于74HC595工作原理及FPGA实现数码管驱动方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 4位数码管和74HC595

            在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共有12个IO口。         当选择数码管1显示的时候,这可以

    2024年04月17日
    浏览(99)
  • 51单片机驱动8位数码管(74HC595驱动)滚动显示

    原文链接:https://www.yourcee.com/newsinfo/2929591.html 点击图片购买 主要关注下供电电压是3.0-5.0v(建议5V),请在规定范围内供电。 模块上芯片引出5个引脚,芯片引脚与模块引脚对应关系是:VCC-VCC SCK-SCLK, RCK-RCLK,SER-DIO,GND-GND 可以对比程序学习时序图,便于理解。 1.显示异常可排除

    2024年02月15日
    浏览(58)
  • 【基础知识】【模块介绍】8位8段数码管(74HC595)【硬件部分】

    数码管实际上是 多个LED按照一定顺序排列,并加上遮罩所构成的元件。 八段一般会引出9个引脚,其中7个引脚显示数字(或某些字母),1个显示小数点,1个作为片选端。 根据连接方式的不同,数码管分为共阳和共阴。 共阳在这端输出低电平时点亮,高电平时会熄灭,共阴

    2023年04月17日
    浏览(81)
  • 51单片机通过两片74HC595级联,用8位LED数码管,分别显示当前日期,如:“2”、“0”、“-”、“0”、“5”、“-”、“2”、“6”,用Proteus仿真实现。

    1.先上仿真图,但这么连仿真图是不太正确的,要注意。展示的话能用就行。 2.从上到下依次放上数据手册上的引脚解释和逻辑功能和时序图    3.贴上代码:写了发送一字节数据函数,发送全部字节函数,加上一些写了很久的解释(求赞)。

    2024年02月08日
    浏览(61)
  • 基于MAX-10 FPGA 读取超声波模块HC_SR04距离数据到数码管上

    将MAX-10小脚丫FPGA和超声波模块HC_SR04插在面包板上,用杜邦线将对应的引脚连接好,烧录程序,小脚丫自带的数码管显示距离数据(单位是厘米)。 这张图拍花了,数码管显示的数据是18CM HC-SR04是一种基于超声波的测距模块。该模块向前15度内发送超声波并接收回响,通过发

    2024年02月14日
    浏览(42)
  • 51单片机LED点阵控制原理、74HC595工作原理和字母和滚动显示实验代码

    目录 1. 74HC595工作原理图解  2.LED点阵控制原理 3.点阵LED实验 3.1 配置74HC595代码 3.2 D点阵LED显示H   3.3 滚动LED  (1) 滚动扫描图示  (2)程序代码 4.遇到奇怪的bug    :        输出使能,输入低电平允许输出,因此需要用接线帽j24让oe和地短接。 (但是我普中A2的板子,不

    2024年02月04日
    浏览(61)
  • 51单片机---编程实现流水灯----键盘控制数码管显示--利用74LS164扩展并行输出口---定时中断方式驱动一个数码管

    目录 基于51单片机,用c语言编程实现流水灯 代码: 使用C语言编写的基于51单片机的键盘控制数码管显示 代码: 基于51单片机,用c语言编程实现利用74LS164扩展并行输出口 代码: 基于51单片机,用c语言编程实现定时中断方式驱动一个数码管  代码:  1- 2- 上述代码中,使用

    2024年02月16日
    浏览(51)
  • FPGA项目(5)--FPGA控制数码管动态显示的原理

            数码管是现在电子产品上常用的显示器件,它有驱动简单、显示清晰、价格低廉等优势。数码管的实物图:          数码管的内部结构图如下所示:          从图中可以看出,它由八个段组成,即A B C D E F G DP(小数点),只要将这八个段按规律组合点亮,就

    2024年02月11日
    浏览(56)
  • FPGA学习—通过数码管实现电子秒表模拟

    请参阅博主以前写过的一篇电子时钟模拟,在此不再赘述。 https://blog.csdn.net/qq_54347584/article/details/130402287 项目说明:本次项目是为了通过数码管实现秒表模拟。其中,六位数码管分别显示秒表的分位,秒位,毫秒位(由于毫秒有三位,在此只取百位和十位),其中分位和秒位

    2024年02月14日
    浏览(47)
  • 四位数码管3641AS的FPGA实现

             四位数码管3641AS为一款 共阴极 的四位八段数码管,其具体的每一段为单个二极管,可通过压降实现点亮,通过控制单位多段二极管的点亮实现数字或字母等字符。         共阴极:八段发光二极管的阴极端连接在一起,阳极端分开控制,使用时候公共端接地

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包