【蓝桥杯嵌入式】资源拓展板模块详解——数码管

本文详细介绍了蓝桥杯嵌入式比赛中的数码管资源拓展板模块,包括数码管的原理、74HC595芯片的工作方式,以及数码管的编码和程序设计。数码管采用5161AS,通过3个74HC595芯片控制。程序设计部分讲解了如何配置和驱动数码管显示十六进制数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、原理

1.1数码管

1.2 74HC595

二、编码说明

2.1 数码管字模

2.2十六进制数字模编码参考

三、程序设计

3.1 原理图

3.2 逻辑分析

3.3 配置方法和参考代码

3.4 参考例程


一、原理

1.1数码管

扩展板使用3位5161AS数码管。

5161AS数码管引脚图:

691d10c0989b4e7db378924b2a8ab5ab.png

5161AS数码管原理图:

cc8c3603652a4843b5430bfa341179c3.png

从上图可知,5161AS数码管为共阴极数码管。每位数码管由八个LED组成,其中a--g显示数字,h显示小数点。

1.2 74HC595

扩展板使用74HC595芯片。74HC595是一个8位串行输入、并行输出的位移缓存器,其中并行输出为三态输出。

注:可能原理图上使用的是74LS595。74HS595为CMOS芯片,74LS595为TTL芯片,两者在功能上类似,使用上也一样。

74HC595芯片引脚图:

329a472635db49fd867a445e24fb9dd5.png

14脚:gif.latex?SER,串行数据输入引脚

12脚:gif.latex?RCLK,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存至 存储寄存器。存储寄存器与数码管直接连接,即存储寄存器的值直接控制数码管的显示。

11脚:gif.latex?SRCLK,移位寄存器时钟引脚,上升沿时,移位寄存器中的数据整体后移,并接受新的数据(从DS输入)。具体可参考数电课本关于移位寄存器的讲解。

10脚:gif.latex?%5Coverline%7BSRCLK%7D,低电平时,清空移位寄存器中已有的数据,一般不用,接高电平即可。

13脚:gif.latex?%5Coverline%7BOE%7D,输出使能控制脚,它是低电才使能输出,所以接GND

9脚:gif.latex?Q_%7BH%27%7D串行数据输出引脚。当移位寄存器中的数据多于8位时,最先进入移位寄存器的数据将会溢出,并从该引脚串行输出。用于多个74HC595芯片的级联。

1-7脚:Q1-Q7并行输出引脚

时序图

a723f5a83deb4b74bc08397f17150d91.png

编码说明

2.1 数码管字模

八位二进制数(即一个字节)控制一个数码管,从高位到低位依次控制h、g、f、e、d、c、b、a,1亮0熄。

:本编码方式的解码,应从最高位开始读取,即首先将一字节的字模数据的最高位与1做与(&)运算以此读取高一位(即h),然后将数据左移一位,通过相同的方法读取高二位(即g)。

:将字符0进行编码

解:通过观察前面列举的数码管引脚图可知,要想使之显示字符0,需要a,b,c,d,e,f这几个LED灯亮,而其余的g,h这两个LED灯灭。因此字符0的字模二进制编码应为:0011 1111(hgfe dcba)。转换成十六进制为0x3f。

2.2十六进制数字模编码参考

uint8_t Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
//依次为 0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、空

三、程序设计

3.1 原理图

扩展板数码管原理图如下:

c31dbcae2de14f5aa6847ea7c0e78ffd.png

排针原理图如下:

4fd0ee8b9dc54927b9b38d1eaa2b62e9.png

综合两个原理图可知,MCU可通过PA1,PA2,PA3三个引脚驱动数码管。其中PA1与SER连接,向74HC595发送串行数据;PA2与RCLK连接,控制存储寄存器;PA3与SCK(即:SRCLK)连接,控制移位寄存器。

3.2 逻辑分析

观察原理图可知,资源拓展板上共有三位数码管,其中DS1为最高位,DS3为最低位。每个数码管分别有一个595芯片控制。在三个595芯片中,U1为最高位,且其数据引脚SER直接与MCU连接,U2,U3为U1的级联。U2的SER引脚连接U1的gif.latex?DH%27,即输入U2的数据为U1经过移位寄存器移位后溢出的数据。U3以此类推。

在向595芯片传输字模数据时,应首先传DS3显示所需的字模数据,然后传DS2显示所需的字模数据,最后传DS1所需的字模数据。在经过移位寄存器移位后,各数码管显示所需的字模数据将一一对应。此时,再向存储寄存器发出上升沿脉冲信号(即RCLK置1),即可将信号输出芯片,用以控制数码管的显示。

3.3 配置方法和参考代码

在扩展板上使用跳线帽将排针P3的1,2,3号针脚分别与P4的1,2,3号针脚连接。

在CubeMX中,将PA1,PA2,PA3配置为推挽输出模式,无上下拉电阻,初始电位为低电平。

生成初始化代码后即可编写数码管的驱动代码。参考代码如下:

uint8_t Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
//该数组应在.h中或驱动代码所在的.c文件的开头声明。

//*为提高代码的可读性,将控制PA1,PA2,PA3引脚输出高\低电平的指令替换为对应数据线的高低电平转换*//
#define RCLK_H   (HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET))
#define RCLK_L   (HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET))
#define SCK_H    (HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET))
#define SCK_L	 (HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET))
#define SER_H	 (HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET))
#define SER_L	 (HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET))

void SegDisp(int Bit1,int Bit2,int Bit3)//Bit1:DS1 Bit2:DS2 Bit3:DS3,对应实参都为0~16的整型数据,	直接对应字模数组中的相应字模数据
{
	uint8_t temp = 0;//缓存单元,用于缓存字模数据
	uint8_t i = 0;//循环变量
	RCLK_L;//RCLK置0,准备向芯片发送数据
	temp = Seg7[Bit3];//将DS3显示所需的字模数据写入缓存单元
	
	for(i=0;i<8;i++)
	{
		SCK_L;//RCK置0,准备向芯片发送一位数据
		if(temp&0x80 )//读取最高位数据,若为1,则数据线传输高电平信号;若为0,则数据线传输低电平信号
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_L;
		SCK_H;//SCK置1,SRCLK时钟产生上升沿,移位寄存器将数据整体后移一位
		temp = temp<<1;//缓存数据左移一位,准备读取高二位数据。
	}
	temp = Seg7[Bit2];
	for(i=0;i<8;i++)
	{
		RCLK_L;
		if(temp&0x80 )
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_L;
		SCK_H;
		temp = temp<<1;
	}
	temp = Seg7[Bit1];
	for(i=0;i<8;i++)
	{
		SCK_L;
		if(temp&0x80 )
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_L;
		SCK_H;
		temp = temp<<1;
	}
	RCLK_L;
	RCLK_H;//RCLK置1,RCLK时钟产生上升沿,存储寄存器转存移位寄存器数据,并向数码管发出控制信号。
	
}

3.4 参考例程

例:控制三位数码管同时循环显示0--15的十六进制数。

参考代码:

While(1)
{
    int i;
	for(i=0;i<16;i++)
    {
		SegDisp(i,i,i);
		HAL_Delay(500);
	}
}

5161AS是一种常见的七段数码管驱动模,它常用于电子项目中显示数字或其他字符。下面是使用它的基本步骤: 1. **硬件连接**: - 将5161AS的电源脚接到项目的电源上,通常Vcc对应+5V电源。 - 数码管的D0~D7脚分别连接到5161AS的a~g脚,对应数码管的七个LED段。 - 地线(GND)连接到项目的地线上。 - 如果有公共端COM,将其连接在一起作为所有数码管共阳极或共阴极的控制信号。 2. **配置I/O口**: - 对于单片机如Arduino或通过串行通信使用的设备,你需要将控制数码管的I/O口设置为输出模式,以便发送数据。 3. **编写程序**: - 使用循环遍历每个数码管的字节,按位操作(AND或OR)来生成对应字符的显示代码。例如,字母"A"的二进制表示需要逐位设置为1。 - 控制数码管亮灭的方法通常是先清零所有段,然后按需点亮对应的段。 4. **动态显示**: - 可能需要用到位寻址技术,你可以通过更改每一位的状态来改变数码管显示的内容,比如计数器、ASCII字符等。 **示例代码片段**(仅做参考,实际编程语言可能会有所不同): ```cpp void displayChar(char ch) { static const int dp[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, // 数码管的映射表 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; for (int i = 0; i < 8; ++i) { digitalWrite(dp[ch & 0x80], HIGH); // 设置对应位高电平 ch <<= 1; // 从高位向低位移位 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值