栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

一、原理

1.1数码管

1.2 74HC595

二、编码说明

2.1 数码管字模

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

三、程序设计

3.1 原理图

3.2 逻辑分析

3.3 配置方法和参考代码

3.4 参考例程


一、原理

1.1数码管

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

5161AS数码管引脚图:

5161AS数码管原理图:

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

1.2 74HC595

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

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

74HC595芯片引脚图:

14脚:,串行数据输入引脚

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

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

10脚:,低电平时,清空移位寄存器中已有的数据,一般不用,接高电平即可。

13脚:,输出使能控制脚,它是低电才使能输出,所以接GND

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

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

时序图

二、编码说明

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 原理图

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

排针原理图如下:

综合两个原理图可知,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的,即输入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文件的开头声明。

//
#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[Bit3];
	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--16的十六进制数。

参考代码:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883725.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号