蓝桥杯之数码管

1.数码管基础知识

LED数码管:它是由多个发光二极管封装在一起的组成的“8”字型器件。

分类:共阴极数码管、共阳极数码管(板载)

2.板载数码管电路分析

 

 

 

 

如图所示,板载数码管为共阳极数码管,其中U8锁存器控制COM端,决定了点亮哪一位,U7锁存器控制A、B、C、D、E、F、G、DP来控制所选择的位置显示的字符。

因此,可得到控制数码管的方法:①:P0输出数据(期望显示的数字/英文),选通Y7C段选,关闭锁存器。②:P0输出数据(期望点亮的位),选通Y6C位选,关闭锁存器。

动态显示数码管:利用“视觉残留”,依次点亮单个数码管,使人感觉8个同时点亮。(推荐:单个数码管显示时间为1ms或者2ms)

3.利用动态显示法实现显示“01234567”

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "system.h"
#include "Delay.h"
#include "Device.h"

//定义数码管所显示的字符对应的数组
u8 smg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x3e,0x73};

HexToBin led_ctrl,uln_ctrl;

//系统初始化函数:关闭蜂鸣器、继电器
void vSystem_Init(void)
{
	vDevice_Ctrl(0xa0,0);
	led_ctrl.hex=0xff;
	vDevice_Ctrl(0x80,led_ctrl.hex);
}

void Timer2Init(void)		//2ms@12.000MHz
{
	AUXR &= 0xFB;		
	T2L = 0x18;		
	T2H = 0xFC;		
	AUXR |= 0x10;		
	IE2 |= 0x04;		//打开定时器2中断
	EA = 1;					//打开总中断
}

void main()
{
	vSystem_Init();
	Timer2Init();
	while(1)
	{
	}
}

//数码管显示函数
void vSmg_Display()
{
	static u8 i=0;
	vDevice_Ctrl(0xe0,~smg_code[i]);
	vDevice_Ctrl(0xc0,0x01<<i);
	i++;
	if(i==8) i=0;
}

void Timer2_Routine(void) interrupt 12
{
	vSmg_Display();
	
}

 实际现象:

4.数码管的“鬼影“现象

出现“鬼影” 现象的原因:在操作段选时,上一个COM处于打开状态。

消除”鬼影“现象的方法:在操作段选前,先关闭所有位选。

//数码管操作函数
void vSmg_Display()
{
	static u8 i=0;
	vDevice_Ctrl(0xc0,0);   //在进行段选前,关闭所有位选,以消除鬼影
	vDevice_Ctrl(0xe0,~smg_code[i]);
	vDevice_Ctrl(0xc0,0x01<<i);
	i++;
	if(i==8) i=0;
}

### 蓝桥杯 FPGA 数码管实现方案 在蓝桥杯竞赛中,FPGA 实现数码管显示是一个常见的题目。以下是关于如何通过 FPGA 控制数码管的详细说明以及代码示例。 #### 1. 数码管的工作原理 数码管是一种由多个发光二极管组成的显示器,通常用于显示数字或字符。对于八段数码管来说,它有八个 LED 段分别对应字母 A 到 G 和一个小数点 DP[^2]。控制这些段的状态可以形成不同的数字和字符。 #### 2. FPGA 的基本配置 为了驱动数码管,在 FPGA 中需要完成以下几个部分的设计: - **译码器模块**:将输入数据转换成对应的七段/八段编码。 - **动态扫描模块**:由于大多数应用中会使用多位数码管,因此需要设计动态刷新机制来减少硬件资源占用并提高效率[^3]。 #### 3. Verilog HDL 示例代码 下面提供了一个简单的基于 Verilog 的四位共阳极数码管显示程序: ```verilog module seven_seg_display( input wire clk, // 主时钟信号 input wire reset_n, // 复位信号 (低电平有效) output reg [7:0] seg, // 连接到数码管的8根线(a-g & dp) output reg [3:0] anode // 阳极为高选通的4个位置指示灯 ); // 定义内部变量 reg [3:0] current_digit; reg [3:0] counter; always @(posedge clk or negedge reset_n) begin if (!reset_n) begin current_digit <= 4'b0000; counter <= 4'b0000; seg <= 8'hFF; anode <= 4'b1111; end else begin case(current_digit) 4'd0 : seg <= 8'b11111100; // 显示 '0' 4'd1 : seg <= 8'b01100000; // 显示 '1' 4'd2 : seg <= 8'b11011010; // 显示 '2' ... default: seg <= 8'hFF; endcase // 动态切换到下一个数码管 anode[counter] <= ~anode[counter]; // 增加计数值以改变当前被激活的数码管编号 if(counter == 3) counter <= 0; else counter <= counter + 1; // 更新current_digit以便下一轮循环继续处理新的数字 current_digit <= {current_digit[2:0], current_digit[3]}; end end endmodule ``` 此代码片段展示了如何利用状态机结构配合定时逻辑去更新各个独立的数码管单元上的内容,并且实现了基础的时间片轮转算法来进行多路复用操作[^4]。 #### 4. 关键技术要点 - 使用分频电路降低原始高频时钟频率至适合人类视觉暂留效应的速度范围之内[^5]。 - 对于静态显示模式,则无需考虑时间分割问题;而对于动态显示方式而言,必须精确计算好每帧之间间隔周期长度才能保证图像稳定清晰可见[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值