数码管的动态显示(三)

2024-03-15 08:04
文章标签 动态显示 数码管

本文主要是介绍数码管的动态显示(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.原理

data_reg寄存,只寄存符号位和数据位不包含小数点位。

动态数码管每个显示1ms,所以计数到5*10^4-1

为了将sel和seg同步,把sel打了一拍。

6位都使用到了可以这么计算,6位都显示的是数据。或者最高位显示的是小数点,低5位是数据,

因为数码管是共阳数码管,低电平才能点亮。

2.代码

2.1 seg_dynamic.v

module seg_dynamic(input wire 			sys_clk		,input wire 			sys_rst_n	,input wire[19:0] 	data		,input wire[5:0]		point		,input wire			sign		,input wire 			seg_en		,output reg[7:0]		seg			,//因为一个数码管包括小数点位有8位output reg[5:0]		sel //因为总共有6个数码管需要显示
);parameter CNT_MAX=16'd499_99;wire [3:0] unit;
wire [3:0] ten;
wire [3:0] hun;
wire [3:0] tho;
wire [3:0] t_tho;
wire [3:0] h_hun; //999_999需要这6个位
reg [23:0] data_reg;  //6个数码管,每个数码管是BCD码表示,一共有4位,因为上面的ten是4位
reg [15:0] cnt_1ms;//因为计数1ms
reg flag_1ms;
reg [2:0] cnt_sel; //因为要计数6个数码管表示一次扫描周期的结束
reg [5:0] sel_reg; //这个是位选信号,控制哪个数码管亮
reg [3:0] data_disp; //这是上面的data_reg的每个位数的拆分,控制它显示十六进制码
reg dot_disp;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)data_reg<=24'd0;else if((h_hun)||(point[5]))data_reg<={h_hun,t_tho,tho,hun,ten,unit};else if(((t_tho)||(point[4]))&&(sign==1'b0)) //sign=0就是要使用符号位的意思data_reg<={4'd11,t_tho,tho,hun,ten,unit};else if(((t_tho)||(point[4]))&&(sign==1'b1))data_reg<={4'd10,t_tho,tho,hun,ten,unit};	else if(((tho)||(point[3]))&&(sign==1'b0))data_reg<={4'd11,4'd11,tho,hun,ten,unit};	else if(((tho)||(point[3]))&&(sign==1'b1))data_reg<={4'd11,4'd10,tho,hun,ten,unit};else if(((hun)||(point[2]))&&(sign==1'b0))data_reg<={4'd11,4'd11,4'd11,hun,ten,unit};else if(((hun)||(point[2]))&&(sign==1'b1))	data_reg<={4'd11,4'd11,4'd10,hun,ten,unit};else if(((ten)||(point[1]))&&(sign==1'b0))data_reg<={4'd11,4'd11,4'd11,4'd11,ten,unit};	else if(((ten)||(point[1]))&&(sign==1'b1))		data_reg<={4'd11,4'd11,4'd11,4'd10,ten,unit};	else if(((unit)||(point[0]))&&(sign==1'b0))data_reg<={4'd11,4'd11,4'd11,4'd11,4'd11,unit};	else 			data_reg<={4'd11,4'd11,4'd11,4'd11,4'd10,unit};	always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt_1ms<=16'd0;else if(cnt_1ms==CNT_MAX)cnt_1ms<=16'd0;elsecnt_1ms<=cnt_1ms+1'b1;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)flag_1ms<=1'b0;else if(cnt_1ms==CNT_MAX-1'b1)flag_1ms<=1'b1;elseflag_1ms<=1'b0;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt_sel<=3'd0;else if((flag_1ms==1'b1)&&(cnt_sel==3'd5))cnt_sel<=3'd0;else if(flag_1ms==1'b1)cnt_sel<=cnt_sel+1'b1;elsecnt_sel<=cnt_sel;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)sel_reg<=6'd0;else if ((cnt_sel==3'd0)&&(flag_1ms==1'b1))sel_reg<=6'b000_001;else if(flag_1ms==1'b1)sel_reg<=sel_reg<<1;elsesel_reg<=sel_reg;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)data_disp<=4'd0;else if((seg_en==1'b1)&&(flag_1ms==1'b1))case(cnt_sel)3'd0: data_disp<=data_reg[3:0];3'd1: data_disp<=data_reg[7:4];3'd2: data_disp<=data_reg[11:8];3'd3: data_disp<=data_reg[15:12];3'd4: data_disp<=data_reg[19:16];3'd5: data_disp<=data_reg[23:20];default: data_disp<=4'b0;endcaseelsedata_disp<=data_disp;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)dot_disp<=1'b1;else if(flag_1ms==1'b1)dot_disp<=~point[cnt_sel];else dot_disp<=dot_disp;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)	seg<=8'd0;else case(data_disp)4'd0: seg<={dot_disp,7'b100_0000};4'd1: seg<={dot_disp,7'b111_1001};4'd2: seg<={dot_disp,7'b010_0100};4'd3: seg<={dot_disp,7'b011_0000};4'd4: seg<={dot_disp,7'b011_1001};4'd5: seg<={dot_disp,7'b001_0010};4'd6: seg<={dot_disp,7'b000_0010};4'd7: seg<={dot_disp,7'b111_1000};4'd8: seg<={dot_disp,7'b000_0000};4'd9: seg<={dot_disp,7'b001_0000};4'd10: seg<=8'b1011_1111;//10就是符号,只显示中间的那条杠,因此是4'd11: seg<=8'b1111_1111;//就是显示0default:seg<=8'b1100_0000;endcasealways@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)	sel<=6'd0;elsesel<=sel_reg;bcd_8421 bcd_8421_inst(.sys_clk	(sys_clk	)		,.sys_rst_n	(sys_rst_n)	,.data		(data		)	,.unit		(unit		)	,.ten		(ten		)		,.hun		(hun		)		,.tho		(tho		)		,.t_tho		(t_tho		)	,.h_hun      (h_hun    )
);endmodule

2.2 tb_seg_dynamic.v

module tb_seg_dynamic();reg 		sys_clk		;
reg 		sys_rst_n   ;
reg[19:0]  data		;
reg[5:0]	point		;
reg		sign		;
reg 		seg_en		;wire[7:0] 	seg;			
wire[5:0]    sel;initial beginsys_clk=1'b1;sys_rst_n<=1'b0;data<=20'd0;point<=6'b000_000;sign<=1'b0;seg_en<=1'b0;#30sys_rst_n<=1'b1;data<=20'd98_76;point<=6'b000_010;sign<=1'b1;seg_en<=1'b1;endalways #10 sys_clk=~sys_clk;
defparam seg_dynamic_inst.CNT_MAX=20'd5;seg_dynamic seg_dynamic_inst(.sys_clk	(sys_clk	)	,.sys_rst_n	(sys_rst_n),.data		(data		),.point		(point		),.sign		(sign		),.seg_en		(seg_en		),.seg		(seg		)	,.sel        (sel      )
);
endmodule

这篇关于数码管的动态显示(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811296

相关文章

基于MicroPython的ESP8266控制七段数码管的设计方案

以下是一个基于MicroPython的ESP8266控制七段数码管的设计方案: 一、硬件准备 1. ESP8266开发板(如NodeMCU)             2. 七段数码管(共阳或共阴型)                      3. 限流电阻(根据数码管的电流要求选择合适的阻值

51单片机仿真单只共阳级数码管循环显示0-9

51单片机仿真单只共阳级数码管循环显示0-9 单片机AT89C51控制7段共阳数码管的实验报告 一、实验目的 本实验旨在通过使用AT89C51单片机和7段共阳数码管,学习如何编写控制程序以及实现数码管的动态显示。通过此实验,加深对单片机基本原理和实际应用的理解。 二、实验硬件 单片机:AT89C51晶振:12MHz电容:22pF(两个)复位电路:10KΩ电阻与10μF电容

51单片机数码管详解

一.数码管基础知识 LED数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用的段数一般为7段,有的另加一个小数点 。LED数码管根据LED的接法不同,分为共阳和共阴两类 。 1.共阳极数码管 指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制,如图a所示。 2.共阴极数码管 指

MFC中【Button】控件上局部动态显示字体信息和【对话框】名字的动态字体赋值性变化

①【Button】控件上局部动态显示字体信息 CString n;n.Format("与%s聊天", (char*)(_bstr_t)TheAdoData.m_pRecordset->GetCollect("xingming"));GetDlgItem(IDC_BUTTON2)->SetWindowText(n); ②【对话框】名字的动态字体赋值性变化 SetWindowT

设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身的列名

不用写代码轻轻松松得到你想要的。。。 问题:设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身的列名 解决方法: 把DataGridView控件拖放在窗体中,就看到DataGridView控件的右上角有个小三角,单击小三角,出现了“DataGridView任务”,或是直接右键DataGridView控件,选择“编辑列”;在弹出的“编辑列窗口中”,点“添加”

数码管进阶设计验证

前言         随着数字电路和嵌入式系统的广泛应用,数码管作为一种常见的显示设备,在各种电子产品中扮演着重要角色。数码管以其结构简单、显示清晰和成本低廉的特点,广泛应用于计数器、时钟、测量仪器等领域。然而,传统的数码管设计通常仅支持基本的数字显示功能,难以满足现代应用对更复杂显示需求的要求。         近年来,随着FPGA技术的发展和应用,数码管的驱动设计也迎来了新的机遇。FPGA

江协科技51单片机学习- p11 静态数码管显示

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: 51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili c51语言变量语句意思,C51中循环语句-CSDN博客 数码管显示: 【51单片

51单片机STC89C52RC——4.1 独立按键(数码管显示按键值)

目录 目录 目的 一,STC单片机模块 二,矩阵按键模块 2.1 针脚定义 ​编辑  2.2 矩阵按键位置 2.3 如何理解按键按下后针脚的高低电平 2.3.1 错误理解1 2.3.2 错误理解2 2.3.3 正确判定按下的是那个按键的逻辑 2.3.4 判定按键按下的依次扫描程序代码如下 三,创建Keil项目 四,代码  五,代码编译、下载到51单片机 六,效果

el-table 表格列实现动态显示与隐藏

el-table 表格列实现动态隐藏显示 通常一个表格横向展示的时候,字段过多,但是我们又想要只显示部份字段,这时可以使用本组件实现你想要的效果。 1、实现原理:通过给列添加v-if来实现动态显示与隐藏效果 一、编写列显示与隐藏控制组件 <template><div><el-dialog title="自定义列" class="column-dialog" :visible.sync

51单片机STC89C52RC——3.1 数码管静态展示

目的 让数码管在指定位置显示指定数字 一,STC单片机模块 二,数码管  2.1 数码管位置 2.2 生活中用到的数目管 红绿灯 LED数码管在生活中随处可见,洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数码管(段为LED灯的个数)。 2.3 数码管的分类 按显示段数分:分为七段、八段、九段、十四段和十六段 七段:七段数