八段数码管动态显示(输入数据为BCD编码)

2023-11-19

八段数码管动态显示(输入数据为BCD编码)

一、数码管概述

八段共阴数码管内部等效原理图

图1 八段共阴数码管内部等效原理图
八段共阳数码管内部等效原理图
图2 八段共阳数码管内部等效原理图

  上面两图分别是对应八段共阴、共阳的数码管内部等效图,共阴是将八个LED数码管的阴极连接在一起接低,阳极segment信号只需要输入高电平,相应的数码管就被点亮;将上面八个数码管按照下面形状排列,就构成了数码管。
数码管示意图

图3 数码管示意图

如何让数码管显示出对应的数据?
  拿八段共阴数码管显示2举例,如上图显示2需要点亮a、b、g、e、d这五个LED,其余LED全部熄灭。所以segment信号应该输出的数据是0101_1011。显示其余数字也是类似的原理,而h一般是用作小数点处理,不需要的时候一般都不点亮这个LED。下面是不包括h段LED的数码管译码对应表。

表一 八段共阴共阳数码管译码数据
显示数字 共阳gfedcba 2进制 共阳gfedcba 16进制 共阴gfedcba 2进制 共阴gfedcba 16进制
0 8’b11000000 8’hC0 8’b00111111 8’h3f
1 8’b11111001 8’hF9 8’b00000110 8’h06
2 8’b10100100 8’hA2 8’b01011011 8’h5b
3 8’b10110000 8’bB0 8’b01001111 8’h4f
4 8’b10011001 8’h99 8’b01100110 8’b66
5 8’b10010010 8’h92 8’b01101101 8’h6d
6 8’b10000010 8’h82 8’b01111101 8’h7d
7 8’b11111000 8’hF8 8’b00000111 8’h07
8 8’b10000000 8’h80 8’b01111111 8’h7f
9 8’b10010000 8’h90 8’b01101111 8’h6f

  经过上面可知,想让数码管显示对应的数据,就必须给此数码管的八个数据线(八个LED输入端)输入对应的数据,将这8根数据线称为一组数据线。那如果需要同时使用两个数码管呢?此时就需要控制16个LED,所以就需要2组数据线。由此需要n个数码管显示n个数字,就需要n组数据线,这会极大消耗数据线资源,但是平常单片机或者FPGA这些开发板上面的数码管很多,却只有一组数据线,这是怎么做到的呢?

  为了解决上面问题,一般是将四个数码管制作成下图所示的三线制数码管,将四个独立数码管四组数据线接在一起,四个数码管共用一组数据线,同时每个数码管增加一个DIG片选信号,如下图当DIG1引脚为低电平时,此时数据线HEX的数据驱动第1个数码管显示对应的数字。通过控制4个DIG引脚实现一组数据线驱动多个数码管,比如20us点亮第一个数码管,之后每隔20us点亮下一个数码管,最后循环点亮四个数码管,在点亮不同数码管的时候控制数据线HEX输入不同的数据,就可以实现一组数据线驱动多个数码管显示不同的数据。
在这里插入图片描述

图3 4个八段数码管原理图

二、FPGA实现驱动数码管

1、信号列表

信号 位宽 输入/输出 描述
clk 1 I 系统时钟,1MHz
rst_n 1 I 系统复位,低电平有效
din 4*数码管个数 I 待显示的BCD码数据
segment 8 O 八段数码管的数据线
seg_sel 数码管个数 O 数码管片选信号,电平有效

2、设计思路

  通过参数实现该模块可以驱动任意个数码管,通过自动计算位宽函数自动计算寄存器的位宽。

  该设计实现FPGA可以驱动SEG_NUM个数码管,每个数码管显示的时间为TIME_20MS。所以本设计以20us计数器cnt_20us和点亮的第几个计数器sel为主体架构,其余信号对齐这两个计数器。计数器示意图如下,cnt_20us计数计数时,sel计数器加一,表示点亮下一个数码管。例如使用8个数码管同时显示12345678,则SEG_NUM=8,din=64‘h12345678,之后sel计数器为0时,segment译码显示4’d8,此时第0个数码管显示8,之后计数器cnt_20us计数结束,sel+1,此时点亮第一个数码管,则数据线segment应该将4’d7译码进行输出,之后各位显示类似。
ji计数器架构

图4 计数器架构

  参数设计以及自动计算位宽函数如下:

parameter       TIME_20US                   =   20              ,//数码管刷新时间,默认20us。
parameter       SEG_NUM                     =   6                //需要显示的数码管个数。
//参数定义
localparam              TIME_W    =     clogb2(TIME_20US);//计算数码管扫描时间的时钟数据位宽;
localparam              SEG_W     =     clogb2(SEG_NUM);
localparam              ZERO      =     8'hC0  ; //8'h3F;前面的数据是共阳数码管使用的,后面数据是共阴数码管使用的;
localparam              ONE       =     8'hF9  ; //8'h06;
localparam              TWO       =     8'hA4  ; //8'hB;
localparam              THREE     =     8'hB0  ; //8'hF;
localparam              FOUR      =     8'h99  ; //8'h66;
localparam              FIVE      =     8'h92  ; //8'h6D;
localparam              SIX       =     8'h82  ; //8'h7D;
localparam              SEVEN     =     8'hF8  ; //8'h07;
localparam              EIGHT     =     8'h80  ; //8'h7F;
localparam              NINE      =     8'h90  ; //8'h6F;
localparam              ERR       =     8'h86  ; //8'h79;

//自动计算位宽的函数;
    function integer clogb2(input integer depth);begin
        if(depth==0)
            clogb2=1;
        else if(depth!=0)
            for(clogb2=0; depth>0;clogb2=clogb2+1)
                depth=depth>>1;
        end
    endfunction

计数器cnt_20us初始值为0,对系统时钟进行计数,计数到TIME_20US-1时结束,对应代码如下:

//20us计数器,用于对一个数码管点亮的持续时间进行计数,计数器初始值为0,对
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin//计数器初始值为0;
            cnt_20us <= 0;
        end
        else if(end_cnt_20us)begin//当计数器计数到20us时,表示一个数码管已经被点亮20US了,将计数器清零;
            cnt_20us <= 0;
        end
        else begin//否则,计数器加一;
            cnt_20us <= cnt_20us + 1'b1;
        end
    end

    //计数器结束条件,当计数器计数到TIME_20US-1时表示20US已经到了,将计数器清零;
    assign end_cnt_20us = cnt_20us == TIME_20US - 

计数器sel初始值为0,表示最初点亮第0个数码管,当计数器cnt_20us计数计数结束时,表示一个数码管被点亮20us了,此时计数器sel加一,开始点亮下一个数码管,当计数器sel计数到SEG_NUM-1并且cnt_20us计数结束时,表示所有数码管都被点亮一次了,将计数器sel清零,从第一个数码管在此循环点亮;

综上:计数器sel初始值为0,加一条件add_sel=end_cnt_20us,结束条件end_sel=add_sel && sel==SEG_NUM-1,对应代码如下:

always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始值为0;
            sel <= 0;
        end
        else if(add_sel) begin
            if(end_sel)//当计数器sel计数结束时,计数器清零;
                sel <= 0;
            else
                sel <= sel + 1;
        end
    end
    assign add_sel = end_cnt_20us;//计数器sel的加一条件是,计数器cnt_20us计数器结束;
    assign end_sel = add_sel && sel == SEG_NUM - 1;//计数器sel计数到SEL_NUM-1时,计数器sel清零;

接下来还需要做两件事:

2.1、输入信号译码成数码管数据信号segment

  输入数据din是BCD码,所以只需要在计数器sel为0是将din[3:0]译码成segment输出给数码管即可。根据这个原理,sel_result信号先根据计数器sel的值从din取出对应的四位数据,代码如下:

//sel_result信号是当前被点亮数码管需要显示的数据,根据计数器sel的值确定此时应该将输入信号的哪几位数据译码输出给数码管进行显示;
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始值为0;
            sel_result <= 4'd0;
        end
        else begin//取输入信号din[4*sel+3 : 4*sel]信号给译码部分进行译码,之后输出给数码管数据信号驱动数码管显示该数据;
            sel_result <= din[4*sel+3 -: 4];//{din[4*sel+3],din[4*sel+2],din[4*sel+1],din[4*sel]};
        end
    end

之后将sel_result译码成能驱动数码管显示对应数据信号segment,对应代码如下:

//译码器部分,将sel_result十进制信号译码成数码管显示该数字对应的八位数据信号;
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始上电时,所有数码管显示数据0;
            segment <= ZERO;
        end
        else begin
            case(sel_result)//将sel_result译码成对应的segment数据,segment数据驱动数码管才能显示sel_result代表的数字;
                0: segment <= ZERO ;//想要数码管显示0,就要给数码管数据信号segment输入ZERO数据,其余类似;
                1: segment <= ONE  ;
                2: segment <= TWO  ;
                3: segment <= THREE;
                4: segment <= FOUR ;
                5: segment <= FIVE ;
                6: segment <= SIX  ;
                7: segment <= SEVEN;
                8: segment <= EIGHT;
                9: segment <= NINE ;
                default: segment <= ERR;
            endcase
        end
    end

  对应仿真如下,六个数码管显示24’h044039,sel为0时,sel_result=4’d9,segment将sel_result通过译码表1译码成NINE对应的数据8’h90,则第一个数码管显示9,其余类推;
在这里插入图片描述

图5 modelsim部分仿真结果

2.2、根据计数器sel控制数码管片选信号seg_sel

  计数器sel表示此时应该点亮第几个数码管,所以计数器sel=0时,应该将第一个数码管的片选拉低,其余数码管的片选拉高,此时数据线segment的数据用于驱动第一个数码管显示对应数据。segment信号滞后计数器sel变化两个时钟,所以seg_sel也需要滞后sel两个时钟,才能使得segment与seg_sel信号对齐。所以先将sel延迟一个时钟得到sel_ff0,代码如下:

//为了与段选动态扫描,保持同步,此时位选应该打一拍再赋给位选信号 seg_sel
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            sel_ff0 <= 0;
        end
        else begin
            sel_ff0 <= sel;
        end
    end

  之后根据sel_ff0得到数码管片选信号,将1左移sel_ff0之后取反,就可以将第sel_ff0位数码管片选拉低,其余数码管片选拉高,对应代码如下:

always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin//初始值为0,全部数码管被点亮;
            seg_sel <= {{SEG_NUM}{1'b0}};
        end
        else begin//将1左移sel_ff0位之后取反,seg_sel的第sel_ff0输出低电平,对应的第sel_ff0个数码管被点亮了,其余位输出高电平,对应的数码管熄灭;
            seg_sel <= ~({{{SEG_NUM-1}{1'b0}},1'b1} << sel_ff0);//~(6'h1<<sel_ff0);
        end
    end

三、源文件获取

  在公众号” 数字站 “回复“数码管fpga”获取下载链接。
在这里插入图片描述
  下载后解压得到源文件如下图:
在这里插入图片描述

图6 解压文件夹下的文件

  其中seg_disp.v是数码管驱动文件,test.v文件是仿真测试激励生成文件。可以直接使用modelsim打开该文件夹下的test.mpf文件进行仿真,如下图操作:
在这里插入图片描述

图7 modelsim打开工程

  一定要先修改查找的文件类型,不然很可能找不到该类型的文件,然后选择test.mpf文件打开即可,步骤如下所示:
在这里插入图片描述

图8 modelsim选择工程文件

  之后点击Library,然后选中work库里面的test右键选择Simulate即可。
在这里插入图片描述

图9 modelsim运行激励文件

  之后可以自己在sim选项卡里面添加文件,也可以加入我之前配置好的页面,下面是使用我之前配置好页面的方法。点击file,之后点击load,最后点击Macro File,如下图所示:

在这里插入图片描述

图10 modelsim打开已有波形页面配置文件

  首先还是选择打开文件夹显示所有类型的文件,之后选中wave.do文件打开,如下图所示:
在这里插入图片描述

图11 modelsim选择wave.do文件打开

  打开结果如下图所示:
在这里插入图片描述

图12 modelsim仿真结果

如果要重新仿真,进行如下图步骤操作即可:

在这里插入图片描述

图13 modelsim重新仿真

由于test.v文件有仿真结束设置,所以运行到时间后会自动停止仿真,回到该页面即可。

四、modelsim仿真6个数码管显示

在这里插入图片描述

图14 modelsim仿真结果

  仿真结果正确,在使用该模块时,例化时只需要更改SEG_NUM参数确定数码管个数以及是共阴数码管还是共阳数码管即可,其余信号可变位宽可以由自动计算位宽函数自动计算得出,不需要认为更改,该过程是在综合工具编译是完成的,不会消耗额外资源。

五、总结

  1、注意:主要是以两个数码管为主体架构,需要注意数码管数据信号要与片选信号对齐,如果没有对齐则会出现数码管显示数据奇怪的问题,原因在于一个数码管在某个别时钟显示了上一个数码管或者下一个数码管该显示的数据。
  2、扩展:后续可以加入小数点的控制电路,以及使用控制信号选择共阴还是共阳的数码管。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

八段数码管动态显示(输入数据为BCD编码) 的相关文章

  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • 使用 VHDL 实例化 FPGA 中的 RAM

    我试图按照中的指导实现双端口 RAM这篇优秀的博文 http danstrother com 2010 09 11 inferring rams in fpgas 然而 ModelSim 在编译时给出以下警告 Warning fifo ra
  • 同时读取和写入寄存器

    我计划在 FPGA 上用 VHDL 设计一个类似 MIPS 的 CPU CPU 将具有经典的五级管道 没有转发和危险预防 在计算机体系结构课程中 我了解到第一个 MIPS CPU 用于在时钟上升沿读取寄存器文件并在时钟下降沿写入 我使用的F
  • 使用 Verilator 和 VPI 读取寄存器数组

    所以我在我的verilog中定义了以下寄存器 reg 31 0 register mem 0 15 verilator public 我的目标是从我的 verilator c 代码中读取存储在其中的 16 个值中的每一个 我发现有关 VPI
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 在逻辑中使用单端端口期待差异对?

    我使用的逻辑被设置为需要一个差分对时钟端口 然而 对于一个特定的应用程序 我只能输入一个单端时钟 由于硬件限制 修改逻辑以接受单端时钟不是一种选择 因为涉及许多文件和代码行 有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口
  • 您可以使用类 C 语言对 FPGA 进行编程吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在大学里 我用类似 C 的语言编写了 FPGA 不过 我也知道人们通常使用 Verilog 或 VHD
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • 如何将时钟门映射到技术库单元

    我的设计中有以下时钟门 module my clkgate clko clki ena Clock gating latch triggered on the rising clki edge input clki input ena ou
  • 如何在 Verilog 中综合 While 循环?

    我尝试设计一个 Booth 乘法器 它在所有编译器中运行良好 包括 Modelsim Verilogger Extreme Aldec Active Hdl 和 Xilinx Isim 我知道模拟和综合是两个不同的过程 而且只有少数Veri
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 向左旋转 verilog 大小写

    我的任务是用verilog编写一个16位ALU 当我做需要旋转操作数和进行2的补码加法和减法的部分时 我发现了困难 我知道如何用纸和铅笔解决这个问题 但我无法弄清楚如何在 Verilog 中做到这一点 例如 A表示为a15 a14 a13
  • 在 Verilog 设计中产生时钟故障

    我正在使用 Verilog 设计芯片 我有一个 3 位计数器 我希望当计数器处于第 8 次循环时 应该有一个时钟故障 之后就可以正常工作了 在 Verilog 设计中产生时钟故障的可能方法是什么 在时钟信号上注入毛刺的一种方法是使用forc
  • 标识符必须用端口模式声明:busy。 (Verilog)

    我有如下所示的 Verilog 代码 当我编译它时 我收到以下错误消息 并且代码的第一行突出显示 Error 标识符必须用端口模式声明 busy Code module main clk rst start busy ready cnt s
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • VIM 高亮匹配开始/结束

    我正在尝试找到一个插件 它将突出显示与 Verilog 匹配的开始 结束语句 VIM 可以使用花括号 方括号 但不能使用它的开始 结束 我希望 VIM 突出显示正确的开始到正确的结束 在我看来 最好的选择是使用 matchit 该脚本是 v
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa

随机推荐

  • Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

    1 打开新立得包管理器 搜索JDK 选择openjdk 6 jdk安装 2 打开Ubuntu软件中心 搜索Eclipse 选择Eclipse集成开发环境 安装 3 打开Eclipse File gt New gt Java Project
  • 剑指Offer 22. 链表中倒数第k个节点(Easy)/ 19. 删除链表的倒数第 N 个结点(Medium)/ ListNode调用!!!

    LeetCode 19 删除链表的倒数第 N 个结点 Medium 题目链接 题解 链表中倒数第 k 个节点 双指针 清晰图解 思路 代码 Definition for singly linked list class ListNode d
  • Unity 音频卡顿 静帧 等待等问题的解决方案

    是否遇到过在Unity中加载音频文件卡顿 也就是画面卡住 的现象 特别是加载外部音频文件时 虽然时间很短 但这终归不是什么好现象 尤其是打游戏的话 影响很大 但是一些有牌面的Boss也不能不配音乐 当然也可以通过其它方式解决 比如特定条件统
  • 《人工智能导论》 第7章 机器学习

    机器学习 机器学习的基本概念 机器学习 Machine learning 使计算机能模拟人的学习行为 自动地通过学习来获取知识和技能 不断改善性能 实现自我完善 机器学习主要研究以下三个问题 学习机理 人类获取知识 技能和抽象概念的天赋能力
  • win7安装PS2019CC启动时报d3dcompiler_47.dll的问题解决

    原先安装的PS2017太卡顿了 有些功能用的也不习惯 卸载准备重装一下PS2019 在安装时发现报错 具体如下图所示 因此在网上下载了D3DCOMPILER 47 dll程序 放到了指定文件夹还是不行 百度参考这个解决了 WIN7缺少D3D
  • 全局光照算法:reflective shadow maps

    1 技术理解 RSM的全称是reflective shadow maps 受到Instant Radiosity这个离线技术的启发 其思想和ShadowMap的思想近似 在正式介绍和了解这个技术之前 我需要确定RSM用处何在 我想 RTR4
  • Docker-swarm 介绍,集群,多服务部署实战

    一 什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台 几乎全部用GO语言来完成的开发的 代码开源在https github com docker swarm 它是将一群Docker宿主机变成一
  • flutter doctor不识别已安装的android studio及授权报错

    不识别解决 flutter config android studio dir C Program Files Android Android Studio 授权报错解决 Open Android Studio Tools gt SDK M
  • Unity使用Remote直接在手机上调试游戏

    Unity Remote是一个调试小工具 方便在手机上直接显示运行效果 并不需要Unity打包 只要在手机上安装UnityRemote APK程序 然后Unity上点击运行就可以了 因为我一般很少在手机上测试 本来都想不起来这个Remote
  • 用Python帮忙找指定小说最新更新且网速最快的网站

    一 引言 这个五一假期自驾回老家乡下 家里没装宽带 用手机热点方式访问网络 这次回去感觉4G信号没有以前好 通过百度查找小说最新更新并打开小说网站很慢 有时要打开好多个网页才能找到可以正常打开的最新更新 为了躲懒 老猿决定利用Python爬
  • 基于rCore的试点班lab1 实现一个系统调用

    实现一个属于你的系统调用 并写一个用户进程来调用该系统调用 该系统调用的功能为 输出你的名字 拼音即可 和学号 相关知识 系统调用 是操作系统提供给应用程序使用的接口 可以理解为一种可供应用程序调用的特殊函数 应用程序可以发出系统调用请求来
  • Python 基础(一):入门必备知识

    目录 1 标识符 2 关键字 3 引号 4 编码 5 输入输出 6 缩进 7 多行 8 注释 9 数据类型 10 运算符 10 1 常用运算符 10 2 运算符优先级 基础 进阶 爬虫 自动化 数据分析 编写小游戏 趣味 Python 文档
  • ajax xhr参数无法接收到,AJAX XHR-Call会创建无效的参数异常

    所以我尝试从异步任务 在此处未显示 因为它不相关 我认为它工作 中的值通过Jquery xhr请求放入进度条中 服务器端的方法并不相关 因为它的工作方式和jquery xhr call都可以 仅限第一次 AJAX XHR Call会创建无效
  • Rasa中文聊天机器人开发指南(3):Core篇

    文章目录 1 对话管理1 1 多轮对话1 2 对话管理 2 Rasa Core 2 1 Stories 2 2 Domain 2 3 Responses 2 4 Actions 2 5 Policies 2 6 Slots 2 6 1 Sl
  • nvm-use成功,但是实际并没有切换到对应node版本

    nvm use命令行运行成功 但是nvm list显示并没有成功 解决方案 情况描述 说明 使用nvm安装完node版本成功之后 nvm list显示并没有切换成功 node v使用的不是use版本 原因 因为在安装nvm之前 独自安装了一
  • rtsp协议c语言,RTSP协议

    RTSP简介 RTSP Real Time Streaming Protocol 是由Real Network和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议 RTSP对流媒体提供了诸如暂停 快进等控制 而它本身
  • 浏览器无法加载本地文件

    问题描述 在Visual Studio Code 编写HTML文件时需要将 csv文件内容在浏览器控制台窗口输出 浏览器控制一直报错 如下图所示 原因 跨域资源共享问题 本地文件是放在file 这样的系统下 而非网络资源比如http 下 造
  • Matlab实现PID控制仿真(附上30个完整仿真源码+数据)

    本文介绍了如何使用Matlab实现PID控制器的仿真 首先 我们将简要介绍PID控制器的原理和控制算法 然后 我们将使用Matlab编写一个简单的PID控制器 并使用仿真环境来验证其性能 最后 我们将通过调整PID控制器的参数来优化控制系统
  • LVGL笔记7--lv_label标签控件

    LVGL笔记7 lv label标签控件 lv label标签控件是LVGL中使用最频繁的控件 主要是用来显示文本信息的 可在程序运行中动态修改文本内容 支持换行显示 图标字体 部分文本重绘色 长文本显示 6种显示模式等功能 lv labe
  • 八段数码管动态显示(输入数据为BCD编码)

    八段数码管动态显示 输入数据为BCD编码 一 数码管概述 图1 八段共阴数码管内部等效原理图 图2 八段共阳数码管内部等效原理图 上面两图分别是对应八段共阴 共阳的数码管内部等效图 共阴是将八个LED数码管的阴极连接在一起接低 阳极segm