蓝桥杯扩展板模块(基于新版STM32G431)——数码管

蓝桥杯扩展板模块(基于新版STM32G431)——数码管

一、驱动原理

在这里插入图片描述
在比赛的时候,数码管的驱动是没有给的,所以这里需要我们自己写数码管的驱动。既然我们需要自己写数码管的驱动,那么我们就必须要了解这个数码管显示的原理。
由原理图可以看到,数码管一边接的是型号,另一边接的是地,所以采用的是共阴方式的连接,则高电平点亮,低电平熄灭。蓝桥杯扩展板使用的是3片74LS595来静态驱动数码管(其实2片74LS595就可以实现使用动态扫描的方式驱动8位数码管)。
三片74LS595串行连接,每一片的输出接数码管的8个段,3片就可以实现控制三个数码管。

二、74LS595原理

这里我们就要说一下74LS595的原理,74LS595是8位的移位寄存器,之前在网上看到一篇博客,里面举了一个很形象的例子,现在没有找到原博客的地址(感谢),在这次引用一下。
我们可以看到原理图上面使用到了3根信号线,分别是SER,SCK,RCLK,驱动他就相当于我们给手枪上子弹的过程,现在我们就假设有两种型号的子弹都可以装进弹夹,叫做SER_H和SER_L(对应就是高低电平),然后SCK就相当于我们手指把子弹向弹夹里面压(其实就是对应着一个SCK脉冲),当弹夹的容量装满了之后,就把弹夹安装到手枪上面(对应着一个RCLK脉冲)。好了, 上面的解释相信已经很明白了,下面就来实战给手枪换弹夹了:
1. 设置SER的电平(准备好子弹型号)
2. 发一个SCK脉冲(将子弹压入弹夹)
3. 重复第1步和第2步动作8次(因为是8位移位寄存器)(装满弹夹)
4. 发一个RCLK,更新移位寄存器的值(将弹夹安装到手枪)

三、驱动代码


#define SEG_H		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET)
#define SEG_L		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,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 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)

const uint8_t seg_buff[] = {
    
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void seg_set(uint8_t seg1,uint8_t seg2,uint8_t seg3)
{
    
    
	uint32_t seg = (seg_buff[seg3] << 16) | (seg_buff[seg2] << 8) | seg_buff[seg1];
	uint8_t i;
	for(i = 0;i < 24; i++)
	{
    
    
		if(seg & 0x800000)
			SEG_H;
		else
			SEG_L;
		SCK_H;
		SCK_L;
		seg <<= 1;
	}
	RCLK_H;
	RCLK_L;
}

代码使用说明,一定要看

完整代码下载点我

猜你喜欢

转载自blog.csdn.net/qq_43715171/article/details/117473607