蓝桥杯嵌入式扩展板数码管例程

基于stm32G431 HAL库数码管例程

数码管原理图

在这里插入图片描述
数码管是共阴极的,所以当输入为1时,数码管亮。
74HC595是一个8位串行输入、并行输出的位移缓存器
RCLK引脚 :当RCLK到上升沿时,移位寄存器进入存储寄存器,也就是负责将数据传到数码管。
SCK 引脚到上升沿时:数据寄存器移位
SER 引脚是串行数据输入端
简单概括就是 SER负责写数据(0或1)然后写一位sck存储,然后sck移位,数据写完RCLK负责把数据传到数码管进行显示。

用赛点资源包中的液晶驱动程序进行编写例程

打开stm32cubemx
在这里插入图片描述
由于我们用扩展板,所以我索性将PA1~PA7都打开了,数码管是PA1到PA3,模式为输出。
在这里插入图片描述
然后生成文件,到keil里,为了方便,也不独立写seg.c和seg.h文件了,直接在main函数里写,也方便比赛的时候节省时间。
先创建一个数组,用来存放0~F对应的显示数码管16进制数。
在这里插入图片描述
i用于下面主函数循环。
下面写数码管的显示函数:
在这里插入图片描述

三个参数对应的就是三组数码管,code_tmp = Seg7[Bit3];将对应的16进制数赋给code_tmp,进入for循环,移位数码管有八位,所以循环八次,code_tmp与上0x80,从code_tmp的最高位开始判断一下code_tmp是1还是0,如果是1,SER写1,else写0 。然后code_tmp向左移1位,SCK来一个上升沿,让数据寄存器移移位,。重复循环8次,一个数码管就写好了。三个数码管组就需要三个循环来做。
下面展示显示函数 内联代码片

uc8 Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
u8 i=0;	

void SEG_DisplayValue(u8 Bit1,  u8 Bit2, u8 Bit3)
{
	
	u8 code_tmp = 0; //存放数组Seg7[]对应的16进制数
	u8 a=0;//用于循环
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2对应RCLK,用于存储寄存器
	
	code_tmp = Seg7[Bit3];
	for(a=0;a<8;a++)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//PA3对应SCK,用于数据寄存器移位
		if(code_tmp&0x80)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1对应SER,用于向数据寄存器写数据
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
		}
		 code_tmp = code_tmp << 1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
	}
	
	code_tmp = Seg7[Bit2];
	for(a=0;a<8;a++)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		if(code_tmp&0x80)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
		}
		 code_tmp = code_tmp << 1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
	}
	
	code_tmp = Seg7[Bit1];
	for(a=0;a<8;a++)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		if(code_tmp&0x80)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
		}
		 code_tmp = code_tmp << 1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
	}
	
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//来一个上升沿,将三组数据送入数码管
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);


}

主函数里,首先需要一个用于显示的数组display。
下面展示一些 内联代码片

 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 for(i = 0; i < 17; i++)
        {
            SEG_DisplayValue(i, i, i);
            sprintf(display, "SEG display:%d %d %d", i, i, i);
            LCD_DisplayStringLine(Line6, (u8 *)display);
            HAL_Delay(1000);
        }
        if(i == 17)
        {
            sprintf(display, "SEG display:              ");
            LCD_DisplayStringLine(Line6, (u8 *)display);
            i = 0;
        }
  }

显示函数就放在主函数上面
在这里插入图片描述

main函数全部代码。

#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uc8 Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
u8 i=0;	

void SEG_DisplayValue(u8 Bit1,  u8 Bit2, u8 Bit3)
{
	
	u8 code_tmp = 0; //存放数组Seg7[]对应的16进制数
	u8 a=0;//用于循环
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2对应RCLK,用于存储寄存器
	
	code_tmp = Seg7[Bit3];
	for(a=0;a<8;a++)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//PA3对应SCK,用于数据寄存器移位
		if(code_tmp&0x80)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1对应SER,用于向数据寄存器写数据
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
		}
		 code_tmp = code_tmp << 1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
	}
	
	code_tmp = Seg7[Bit2];
	for(a=0;a<8;a++)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		if(code_tmp&0x80)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
		}
		 code_tmp = code_tmp << 1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
	}
	
	code_tmp = Seg7[Bit1];
	for(a=0;a<8;a++)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		if(code_tmp&0x80)
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
		}
		 code_tmp = code_tmp << 1;
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
	}
	
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);


}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
		char display[20];
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	
	LCD_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	
	
		LCD_Clear(Blue);
    LCD_SetBackColor(Blue);
    LCD_SetTextColor(White);

    LCD_DisplayStringLine(Line0, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line1, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line2, (uint8_t *)"      SEG Demo      ");
    LCD_DisplayStringLine(Line3, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line4, (uint8_t *)"                    ");

    LCD_SetBackColor(White);
    LCD_SetTextColor(Blue);

    LCD_DisplayStringLine(Line5, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line6, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line7, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line8, (uint8_t *)"                    ");
    LCD_DisplayStringLine(Line9, (uint8_t *)"                    ");
		SEG_DisplayValue(0,0,0);
	
	
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 for(i = 0; i < 17; i++)
        {
            SEG_DisplayValue(i, i, i);
            sprintf(display, "SEG display:%d %d %d", i, i, i);
            LCD_DisplayStringLine(Line6, (u8 *)display);
            HAL_Delay(1000);
        }
        if(i == 17)
        {
            sprintf(display, "SEG display:              ");
            LCD_DisplayStringLine(Line6, (u8 *)display);
            i = 0;
        }
  }
  /* USER CODE END 3 */
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV大法练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值