八段数码管动态显示(输入数据为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编码) 的相关文章

  • 「Verilog学习笔记」游戏机计费程序

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点 刷题网站用的是牛客网 timescale 1ns 1ns module game count input rst n 异位复位信号 低电平有效 input clk 时
  • 为什么这个 verilog 关系语句返回 true?

    我有一条名为 sin hall2 的 9 位签名线 该语句返回 true sin hall2 8 0 gt 9 d1 当我查看模拟时 sin hall2 169 我假设这是 verilog 处理比较负数的方式 但我做错了什么 当我执行 si
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 同时读取和写入寄存器

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

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • 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
  • 「HDLBits题解」Gates4

    本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接 Gates4 HDLBits module top module input 3 0 in out
  • Verilog 错误:必须连接到结构网络表达式

    我收到错误 output or inout port Qout must be connected to a structural net expression 我评论了下面代码中发生错误的行 代码被修剪 压缩 我搜索了答案 似乎我无法将输
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 向左旋转 verilog 大小写

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

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • 为什么 Verilog 不被视为编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 教授在课堂上说学生不应该说他们学会了用Verilog 编程 他说 Verilog 之类的东西不是用来编程的 而是用来设计的 那么 Verilog
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • reg 声明中的位顺序

    如果我需要使用 4 个 8 位数字 我会声明以下 reg reg 7 0 numbers 3 0 我对第一个和第二个声明 7 0 和 3 0 之间的区别感到很困惑 他们应该按什么顺序来 第一个是保留数字的大小 而第二个是保留数字的数量 还是
  • Verilog 数组语法

    我是 Verilog 新手 并且遇到了很多麻烦 例如 我想要一个包含八个单元的数组 每个单元都是 8 位宽 以下不起作用 reg 7 0 transitionTable 0 7 assign transitionTable 0 10 仅仅做

随机推荐

  • 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