文章目录

  • 前言
  • 一、软件准备
  • 二、SEG
    • 1.扩展板上模块的原理图以及我们需要配置的元素
    • 2.CubeMx的配置步骤
  • 三、测试代码
  • 四、演示效果
  • 五、工程链接
  • 六、总结

前言

初赛结束之后就应该火速准备决赛,先从数码管开始

一、软件准备

1、MDK4或者MDK5(可到官网或者其他途径获取,本人使用的是MDK5)
2、Cubemx(可到官网自行下载)
3、安装G4的包(1.2.0,1.3.0以及1.4.0均可)
4、串口调试助手(COM)

二、SEG

1.扩展板上模块的原理图以及我们需要配置的元素

SEG部分原理图:

分析:可以看出,板上三个数码管由三块级联的74LS595控制
OE(open enable):打开使能位→低电平给予芯片使能
SRCLR(serial clear):连续清零/串行清零→若为低电平则将芯片中的数据清空(原理图中接入的是高电平)
SER(serial):串行输入→串行数据的输入口,串行数据由此进入移位寄存器的最高位
SRCLK(serial clock):连续时钟/串行时钟→每次接收到一个上升沿时将SER引脚的数据送入移位寄存器(将接收之前的数据整体向右移一位,再将接收到的数据放在最高位,若SER为高电平则接收的数据为1,若为低电平则接收的数据为0)
RCLK(receive clock):接收时钟→当接收到一个上升沿时,将移位寄存器中的所有位传入存储寄存器中;同时,当OE为0时存储寄存器的数据会在芯片的QA-QH输出。
QA-QH以及QH’(output):输出端→当OE为低电平,存储寄存器的值通过这几个引脚输出,其中QA-QH分别连着数码管的段选的 a b c d e f g dp;QH’作为级联输出口与下一个级联的芯片的SER引脚相连,这时若移位寄存器的空间已满,则移位寄存器会把最低位的数据传给下一个级联芯片SER,再通过下一个级联芯片的SER传入到它的移位寄存器的最高位。

其中SER,RCLK,SRCLK由单片机的PA1, PA2, PA3控制,SER,RCLK,SRCLK这三个引脚就相当于餐厅中的依次入门的顾客,服务员1, 服务员2,串行数据相当于进入餐厅而排起的队伍,当有一个队伍中的顾客进入餐厅,服务员2(SRCLK)会说来了一位顾客,并将这位顾客接入到餐桌1(也就是级联的第一块芯片)中,每个桌子只有八个座位,当八个座位坐满之后服务员2(SRCLK)会把依次入门的顾客接入到餐桌2(也就是级联的第二块芯片),依次类推,当餐桌三都已经接入了8个顾客时,服务员1就会大喊(上升沿到来)“坐下!!!”,此时三个桌子上的24位顾客全部坐下(24位数据全部传入存储寄存器),坐下之后这24位顾客开始用餐(也就是开始输出)。
我们在编程使数码管显示数字用的就是这个思路。
下图是实际的数据传输图:

可以看出:串行数据的最高位→移位寄存器的最低位→存储寄存器最高位,所以我们如果要传数据还是从高位开始传输。

2.CubeMx的配置步骤

RCC配置如下:

设置调试接口:


IO配置:
将PA1, PA2, PA3设为GPIO_Output输出模式

生成工程:

三、测试代码

生成工程之后,自行编写seg.c和seg.h文件并加入到工程中。
seg.h:

#ifndef __SEG_H__
#define __SEG_H__#include "main.h"#define SER_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET) //拉高SER
#define SER_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET) //拉低SER#define RCK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET) //拉高RCLK
#define RCK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET) //拉低RCLK#define SCK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET) //拉高SRCLK
#define SCK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET) //拉低SRCLKextern unsigned char seg_code[];
extern unsigned char seg_buf[3];void SEG_Disp(unsigned char Seg1, unsigned char Seg2, unsigned char Seg3);#endif

seg.c:

#include "seg.h"unsigned char seg_code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //数码管段码
unsigned char seg_buf[3]; //数据管数据缓存区void SEG_Disp(unsigned char Seg1, unsigned char Seg2, unsigned char Seg3)
{unsigned char i = 0;seg_buf[0] = seg_code[Seg1]; //缓存区装载数据seg_buf[1] = seg_code[Seg2];seg_buf[2] = seg_code[Seg3];for(i = 0; i < 8; i++){if(seg_buf[2] & 0x80) SER_H;//取seg3的数据缓存区的最高位给SERelse SER_L;SCK_L; //先拉低再拉高,制造上升沿使SER数据传入芯片的移位寄存器SCK_H;seg_buf[2] <<= 1; //左移使第二高位变成最高位,位下一位传输做好准备}for(i = 0; i < 8; i++) //与seg3方法一样{if(seg_buf[1] & 0x80) SER_H;else SER_L;SCK_L;SCK_H;seg_buf[1] <<= 1;}for(i = 0; i < 8; i++) //与seg3方法一样{if(seg_buf[0] & 0x80) SER_H;else SER_L;SCK_L;SCK_H;seg_buf[0] <<= 1;}RCK_L; RCK_H;/*24位数据全部装载到移位寄存器之后,RCLK先拉低再拉高,将24位数据传入存储寄存器并使其输出*/
}

main.c:

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "seg.h"
#include "stdlib.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 */
unsigned char SegNum;
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* 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 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */SegNum = rand(); //产生随机数SEG_Disp(SegNum / 100 % 10, SegNum / 10 % 10, SegNum % 10); //取随机数的百位,十位,个位显示HAL_Delay(1000);}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;RCC_OscInitStruct.PLL.PLLN = 20;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

main.h:没有做修改所以不放了

四、演示效果

五、工程链接

数码管模块工程

六、总结

以上就是SEG的配置过程,测试代码以及测试效果
参考的学习视频:
1.1【数码管】基础知识 | 【扩展板】【蓝桥杯嵌入式国赛】
1.2【数码管】程序设计 | 【扩展板】【蓝桥杯嵌入式国赛】
参考的文章:
74HC595原理图”中“ RCLK SRCLK SRCLR”是什么意思
【STM32G4】备战蓝桥杯嵌入式—模块配置—数码管(拓展板)

【STM32G431RBTx】备战蓝桥杯嵌入式→扩展模块→SEG相关推荐

  1. 【STM32G431RBTx】备战蓝桥杯嵌入式→扩展模块→DHT11

    文章目录 前言 一.软件准备 二.DHT11 1.扩展板上模块的原理图以及我们需要配置的元素 2.CubeMx的配置步骤 3.代码修改以及应用 方法1.以移植F103驱动包为方法 ①.在工程中添加大赛 ...

  2. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→I2C→M24C02

    文章目录 前言 I2C 1.原理图以及配置元素 2.CubeMx的配置步骤 3.生成工程 4.测试代码 5.演示效果 总结 前言 G4板载了一块M24C02(eeprom)和一块MCP4017(可编程 ...

  3. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→KEY→单击

    文章目录 前言 KEY 1.原理图以及配置元素 2.CubeMx的配置步骤 3.生成工程 4.测试代码 5.演示效果 总结 前言 学完了LED和LCD后,我们开始学习按键. KEY 1.原理图以及配置 ...

  4. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→TIM→PWM

    文章目录 前言 PWM 1.配置元素以及配置步骤 2.编写代码 3.演示效果 总结 前言 前面我们以及学完了按键的单,双,长击写法,这其实都是归功于定时器TIM的计时功能,这篇文章讲述的是TIM的输出 ...

  5. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→LCD

    文章目录 前言 LCD 1.原理图以及配置元素 2.CubeMx的配置步骤 3.移植LCD支持包 4.测试代码 5.效果显示 总结以及我的发现 1.总结 2.我的发现 前言 前面我们已经学完了LED的 ...

  6. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→DAC

    文章目录 前言 1.CubeMx的配置步骤 2.生成工程 3.测试代码 4.演示效果 总结 前言 前面我们配置了ADC模块,本节我们学习配置DAC模块. 1.CubeMx的配置步骤 修改之前的ADC的 ...

  7. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→ADC

    文章目录 前言 ADC 1.原理图以及配置元素 2.CubeMx的配置步骤 3.生成工程 4.测试代码 5.演示效果 总结 前言 G4板载了四个电位器,其中左边两个是电压采集用的,本篇文章将讲述如何单 ...

  8. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→LED

    文章目录 前言 一.软件准备 二.LED 1.G431RETx的原理图以及我们需要配置的元素 2.CubeMx的配置步骤 3.别忘了设置调试接口为SW 4.生成工程 5.测试代码 三.效果展示 总结 ...

  9. 【STM32G4】备战蓝桥杯嵌入式---模块配置---TIM_Output_Compare

    文章目录 前言 TIM_Output_Compare 1.TIM_Output_Compare原理 1.定时器通道的工作模式 2.输出比较模式简介 3.如何输出不同频率的方波 4.如何输出不同频率的可 ...

最新文章

  1. linux挂载设备类型lvm,linux——管理系统设备之LVM的管理
  2. [js高手之路]从原型链开始图解继承到组合继承的产生
  3. 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
  4. krita绘图_使用Krita 2.9的Digital Painting提供了缺少的Krita文档
  5. 飞龙的程序员书单 – 前端
  6. BUFF 在C++ 中取其中一部分 并且写到固定的目录下
  7. 联想服务器(RD540)安装双系统
  8. wordpress文章发布时区时间延迟8小时解决方法
  9. CentOS 设置网络(修改IP修改网关修改DNS)
  10. mov和mp4格式哪个好_pr视频剪辑后导出文件格式那么多,你知道怎么选择吗?
  11. 在word中选择所有匹配查找内容的文档内容
  12. leecode.1758. 生成交替二进制字符串的最少操作数
  13. 示波器中的Trigger
  14. 【WinForm】TextBox只能输入数字
  15. 值得一看的网络课程推荐(不限于计算机科学)
  16. 华为服务器2288H v3和V5关机不能启动处理
  17. chrome设置黑暗模式的4种方法
  18. 软件工程方法论对我们开发软件有多大用?谈谈你的看法。
  19. javac编译错误: 程序包 com.sun.xxx 不存在
  20. 记一次个人博客被刷恶意评论的分析与解决

热门文章

  1. 2022 年适用于旧硬件的 10 个轻量级 Linux 发行版-谷歌翻译
  2. 深度剖析Java集合之ArrayDeque
  3. Grafana简介及使用
  4. 解决服装老手瓶颈——服装店铺软件全方面调控
  5. mysql 查看错误连接数_MySql状态查看方法 MySql查看连接数和状态
  6. js生成div后添加html(),JS动态添加div,然后在div中添加元素
  7. java 新建文件_Java创建文件的常用方法
  8. 教你认识 阿迪达斯(ADI) 鞋标
  9. 黑帽SEO之暗链方法大全,那种最好,不易被蜘蛛搜索引擎察觉
  10. EasyHook Creating a remote file monitor