【蓝桥杯嵌入式】拓展板之数码管显示

文章介绍了如何使用74LS595移位缓存器驱动共阴数码管进行数字显示,包括硬件连接、数码管的工作原理和位移过程,以及基于STM32的CubeMX配置和C语言函数实现。同时提供了数码管显示函数的两种版本,讨论了刷新频率对显示的影响,并分享了蓝桥杯嵌入式竞赛的相关资源。
摘要由CSDN通过智能技术生成

硬件电路

在这里插入图片描述
  通过上述原理图,可知拓展板上的数码管是一个共阴数码管,也就是说某段数码管接上高电平时,就会点亮。
  上述原理图还给出一个提示,即:三个数码管分别与三个74HC595移位缓存器并联,而三个移位寄存器串联
  74LS595芯片实际上是一个8位串行输入、并行输出的位移缓存器。也就是说数据是一个一个进入,但是一起输出的。
  当SCK处于上升沿时,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出;而并行输出则是在LCK处于上升沿时,将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
  点亮三个数码管需要3*8=24个数据,而一个74LS595移位寄存器只能够存储8位数据,其存储值远小于输入值。
  根据上述的原理,可知:上图中seg3数码管的数据是经seg2数码管位移过来的,而seg2数码管数据是经seg1数码管位移过来。也就是说数码管刷新的顺序为seg3->seg2->seg1。

共阴数码管显示说明
  首先来看看一个数码管的段码分布吧!🤤🤤🤤
在这里插入图片描述
  也就是说一个数码管是由八段组成,a段为最低位,dp为最高位。
  由于拓展板的数码管是一个共阴数码管(1有效)。那么显示数值的段码由来示例分析为:

显示值dpgfedcba十六进制表示
0001111110x3f
1000001100x06
0.101111110xbf
1.100001100x86

连接方式

在这里插入图片描述
  经过查找原理图,不难发现74LS595芯片的三个输入端(SER、PCLK、SCK)实际上分别与PA1、PA2、PA3引脚相连接。
  因此,其连接方式如下图:
在这里插入图片描述

函数实现

cubeMx配置
在这里插入图片描述

函数示例

  声明定义:

// 声明GPIO分组及引脚
#define RCLK_PIN    GPIO_PIN_2
#define RCLK_PORT   GPIOA
#define SER_PIN   	GPIO_PIN_1
#define SER_PORT    GPIOA
#define SCK_PIN   	GPIO_PIN_3
#define SCK_PORT    GPIOA

// 声明函数别名
#define RCLK_H	HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_SET)
#define RCLK_L	HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_RESET)

#define SER_H	HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_SET)
#define SER_L	HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_RESET)

#define SCK_H	HAL_GPIO_WritePin(SCK_PORT, SCK_PIN, GPIO_PIN_SET)
#define SCK_L	HAL_GPIO_WritePin(SCK_PORT, SCK_PIN, GPIO_PIN_RESET)

  函数实现:

/************   共阴数码管段码  *****************/
//               0     1     2     3      4		5	  6     7     8     9    -    熄灭
u8 segTab[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x00,
//               0.    1.   2.    3.     4.	   5.    6.    7.    8.     9.    -    熄灭	
				0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef, 0x40, 0x00,
//				A      B     C     D      E      F  熄灭
				0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00 };
// 储存数码管需要显示的值
u8 segBuff[3] = {10,10,10};

/* -------------------------------- begin  -------------------------------- */
/**
  * @Name    segDisplay
  * @brief   数码管显示函数
  * @param   None
  * @retval  None
  * @author  黑心萝卜三条杠
  * @Data    2023-03-02
 **/
/* -------------------------------- end -------------------------------- */
void segDisplay(void)
{
    u8 code_tmp = 0,j = 0;
	static u8 i = 3;
	
	code_tmp = segTab[segBuff[i-1]];
	
	// 拉低复位端口 低电平有效 表示需要写入数据
	RCLK_L;
	for(j = 0; j < 8; ++j)
	{
		// 拉低控制信号
		SCK_L;
		// 判断最高位是否为1
		if(code_tmp & 0x80)
			// 写入1
			SER_H;
		else
			// 写入0
			SER_L;
		code_tmp = code_tmp << 1;
		// 拉低控制信号
		SCK_L;
		// 拉高控制信号
		SCK_H;
	}
	// 拉高复位端口 一般默认接VCC  表示写入数据完成
    RCLK_H;
	
	// 移动下一次显示数码管的位置
	if(--i > 0 ) i = 3;
}

  使用说明:使用时直接将要显示的数据放入数组segBuff[],再调用刷新函数segDisplay()code>即可。
例如

void sysWork(void)
{
	static int i = 0;	
	segDisplay();
	
	segBuff[0] = i;
	segBuff[1] = i+1;
	segBuff[2] = i+2;
	i = (i+1)%24;
}

  注意使用上述的segDisplay()函数还需要调整刷新频率,否则会出现闪烁的情况。
  若认为老实调节频率过于麻烦,可以使用下面这个版本的>segDisplay():

/* -------------------------------- begin  -------------------------------- */
/**
  * @Name    segDisplay
  * @brief   数码管显示函数
  * @param   None
  * @retval  None
  * @author  黑心萝卜三条杠
  * @Data    2023-03-02
 **/
/* -------------------------------- end -------------------------------- */
void segDisplay(void)
{
    u8 code_tmp = 0,j = 0,i = 3;
	
	for(i=3;i>0;--i)
	{
		code_tmp = segTab[segBuff[i-1]];
		
		// 拉低复位端口 低电平有效 表示需要写入数据
		RCLK_L;
		for(j = 0; j < 8; ++j)
		{
			// 拉低控制信号
			SCK_L;
			// 判断最高位是否为1
			if(code_tmp & 0x80)
				// 写入1
				SER_H;
			else
				// 写入0
				SER_L;
			code_tmp = code_tmp << 1;
			// 拉低控制信号
			SCK_L;
			// 拉高控制信号
			SCK_H;
		}
		// 拉高复位端口 一般默认接VCC  表示写入数据完成
		RCLK_H;
	}
}

  至于函数调用本质上是一样的,只不过可以不用细调数码管的刷新频率了。🤣🤣🤣

文章福利

下边是小编个人整理出来免费的蓝桥杯嵌入式福利,有需要的童鞋可以自取哟!🤤🤤🤤

也欢迎大家留言或私信交流,共同进步哟!😉😉😉

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值