蓝桥杯嵌入式国赛笔记(1):数码管程序设计

目录

1、前言

2、电路原理

3、使用CubeMx进行源工程的配置 

3.1 预备工作

4、代码编写

4.1 bsp_seg头文件编写 

4.2 bsp_seg源文件编写

4.3 main函数编写

5、代码测试


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.cTest\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输出引脚进行高低电平的变换,实现数码管的字符显示。 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值