
一、项目概述1.1 项目功能基于 STM32F10x 标准库开发使用 GPIOB 端口 PB8~PB15 作为数码管段选输出引脚驱动单个静态共阳极数码管循环依次显示数字 0~ 字母 F每个字符保持 500ms 自动切换。1.2 硬件资源分配表格硬件模块引脚功能说明数码管段选引脚PB8、PB9、PB10、PB11、PB12、PB13、PB14、PB15输出 8 位段码对应数码管 a~dp 段系统定时器SysTick72MHz 系统时钟提供精准 ms/us 延时主控芯片STM32F103C8T6内核主频 72MHz1.3 硬件电路说明数码管类型共阳极公共端接 3.3V 电源段脚 a~dp 依次对应 PB8~PB15每段串联 1k 限流电阻防止 IO 灌电流损坏单片机IO 输出低电平对应数码管段点亮高电平段熄灭。二、头文件 (smg.h) 技术说明c运行#ifndef __SMG_H #define __SMG_H #include stm32f10x.h #define SMG_PORT_RCC RCC_APB2Periph_GPIOB #define SMG_PORT GPIOB #define SMG_PIN GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 void SMG_Init(void); #endif宏定义详解SMG_PORT_RCC外设时钟掩码对应 APB2 总线 GPIOB 时钟用于开启端口供电外设默认关闭时钟未调用时钟使能则 IO 无电平输出。SMG_PORT数码管对应 GPIO 端口 GPIOB。SMG_PIN定义全部段选引脚 PB8~PB15作为 GPIO 初始化引脚参数。函数声明void SMG_Init(void)数码管 GPIO 初始化函数。三、驱动文件 (smg.c) 技术说明c运行#include smg.h void SMG_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(SMG_PORT_RCC, ENABLE); GPIO_InitStructure.GPIO_Pin SMG_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(SMG_PORT, GPIO_InitStructure); }执行流程开启 GPIOB 外设时钟配置 PB8~PB15 为50MHz 通用推挽输出调用 GPIO_Init 完成寄存器配置上电默认引脚输出高电平数码管全灭。四、主程序 (main.c) 技术说明完整代码c运行#include system.h #include SysTick.h #include smg.h int main(void) { uint8_t i 0; // 共阳极标准段码 0 1 2 3 4 5 6 7 8 9 A B C D E F uint8_t smg_code[16] { 0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E }; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); SMG_Init(); while(1) { // 将8位段码左移8位输出至PB8~PB15 SMG_PORT-ODR (SMG_PORT-ODR 0x00FF) | ((uint16_t)smg_code[i] 8); delay_ms(500); i; if(i 16) { i 0; } } }关键模块解析段码数组说明 共阳极段码特性段码 bit 为 0 对应段点亮bit 为 1 对应段熄灭数组依次存储 0~F 显示编码。外设初始化SysTick_Init(72)配置 72MHz 系统时钟延时定时器NVIC_PriorityGroupConfig中断优先级分组本工程无中断仅标准化初始化SMG_Init()初始化 PB8~PB15 输出引脚。PB8~PB15 输出核心逻辑c运行SMG_PORT-ODR (SMG_PORT-ODR 0x00FF) | ((uint16_t)smg_code[i] 8);smg_code[i] 88 位段码左移 8 位数据存放至 ODR 寄存器 bit8~bit15对应 PB8~PB15 0x00FF屏蔽高 8 位保留 PB0~PB7 原有电平不影响其他外设直接操作 ODR 寄存器规避GPIO_Write仅能改写低 8 位 (PB0~PB7) 的限制。循环逻辑 输出当前字符段码→延时 500ms→下标自增→下标到 16 归零无限循环切换 0~F。五、核心技术要点PB8~PB15 属于 GPIO 端口高 8 位标准库GPIO_Write函数仅修改低 8 位无法直接输出段码必须通过寄存器移位操作实现共阳极数码管公共端接高电平IO 低电平点亮段宏统一管理硬件引脚更换端口仅需修改 smg.h 内宏定义代码可移植性强SysTick 硬件定时器延时无软件空循环误差字符切换间隔稳定 500ms。六、运行效果上电初始化完成数码管首先显示数字 0每 500ms 切换下一个字符顺序0→1→2…9→A→B→C→D→E→F显示 F 停留 500ms 后自动回到 0循环往复。七、故障排查1. 数码管完全不亮未开启 GPIOB 时钟检查SMG_Init内时钟使能代码数码管公共端未接 3.3V硬件接线错误延时函数失效SysTick 初始化参数与系统时钟不匹配。2. 字符乱码、缺段段码移位逻辑错误未使用8将数据送至 PB8~PB15段脚 a~dp 与 PB8~PB15 接线顺序颠倒段码使用共阴极编码与硬件共阳极不匹配。3. 字符不切换、定格不动delay_ms函数卡死SysTick 驱动异常循环下标 i 未自增或归零判断失效。