目录
1、前言
本文开始进行蓝桥杯嵌入式国赛的学习笔记,首先进行扩展板的数码管模块的学习。
2、电路原理
蓝桥杯的扩展板与核心板的引脚图如下:
扩展板的SER、RCLK、SCK与核心板的PA1、PA2、PA3相连。从SER每输入一位数据,串行输入时钟SCK上升沿有效一次,数据被送入移位寄存器中并按QA->QB->QC->...->QH移位,直到八位数据输入完毕,此时RCK引脚输入一个上升沿,移位寄存器的内容就被加载到数据存储寄存器中,即在输出端QA~QH上输出相应的八位数据。
数码管的电路图如下:
本扩展版使用了共阴极的数码管, 常见的数字和字符的字段码如下:
3、使用CubeMx进行源工程的配置
3.1 预备工作
打开之前Source工程的.ioc文件,在Pinout View将PA1、PA2、PA3都设置为GPIO_Output,将默认电平设置为高电平。
随后点击GENERATE CODE来生成源工程代码。
接下来我们分别在Test工程里创建Test\Test_Project\Src\BSP\SEG\bsp_seg.c和Test\Test_Project\Inc\BSP\SEG\bsp_seg.h文件,这就是我们后面要编写的中间层代码文件。打开Test_Project工程,进行文件Group的添加。
随后在bsp_seg.c中依赖bsp_seg.h文件
#include "SEG/bsp_seg.h"
4、代码编写
4.1 bsp_seg头文件编写
进行RCLK、SCK、SER的高低电平设置的宏定义
#include "main.h"
#define RCLK_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
#define RCLK_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
#define SCK_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
#define SCK_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
#define SER_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
#define SER_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
进行函数定义
void Seg_Init(void);
void Seg_Display(uint8_t Bit1,uint8_t Bit2,uint8_t Bit3);
4.2 bsp_seg源文件编写
字符码定义
uint8_t Seg7[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
进行函数实现
void Seg_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
/*Configure GPIO pins : PA1 PA2 PA3 */
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Seg_Display(uint8_t Bit1,uint8_t Bit2,uint8_t Bit3)
{
uint8_t i;
uint8_t Code_Temp;
RCLK_L;//准备将数值从移位寄存器从到输出
Code_Temp = Seg7[Bit3];
for(i = 0; i < 8; i++)//将第三个数码管要显示的内容的段码传递出去
{
SCK_L;
if(Code_Temp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
Code_Temp <<= 1;
SCK_L;
SCK_H;
}
Code_Temp = Seg7[Bit2];
for(i = 0; i < 8; i++)//将第二个数码管要显示的内容的段码传递出去
{
SCK_L;
if(Code_Temp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
Code_Temp <<= 1;
SCK_L;
SCK_H;
}
Code_Temp = Seg7[Bit1];
for(i = 0; i < 8; i++)//将第一个数码管要显示的内容的段码传递出去
{
SCK_L;
if(Code_Temp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
Code_Temp <<= 1;
SCK_L;
SCK_H;
}
RCLK_L;//等待将数值从移位寄存器输出
RCLK_H;//将数值从移位寄存器输出
}
4.3 main函数编写
#include "main.h"
#include "Seg/bsp_seg.h"
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
Seg_Init();
Seg_Display(1,2,3);
while (1)
{
}
}
5、代码测试
使用跳线帽连接扩展板的
- PA1<-->SER;
- PA2<-->RCK;
- PA3<-->SCK;
如图所示,测试代码实现,通过GPIO输出引脚进行高低电平的变换,实现数码管的字符显示。