目录
一、原理
1.1数码管
1.2 74HC595
二、编码说明
2.1 数码管字模
2.2十六进制数字模编码参考
三、程序设计
3.1 原理图
3.2 逻辑分析
3.3 配置方法和参考代码
3.4 参考例程
文章来源地址https://www.toymoban.com/news/detail-440535.html
一、原理
1.1数码管
文章来源:https://www.toymoban.com/news/detail-440535.html
扩展板使用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文件的开头声明。
//*为提高代码的可读性,将控制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[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);
}
}
到了这里,关于【蓝桥杯嵌入式】资源拓展板模块详解——数码管的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!