由于没有具体的四位数码管型号和连接方式,以下代码仅供参考。

h文件:

#ifndef __DISPLAY_H
#define __DISPLAY_H

#include "stm32f10x.h"

#define DIGIT_1 GPIO_Pin_0
#define DIGIT_2 GPIO_Pin_1
#define DIGIT_3 GPIO_Pin_2
#define DIGIT_4 GPIO_Pin_3

#define SEG_A GPIO_Pin_4
#define SEG_B GPIO_Pin_5
#define SEG_C GPIO_Pin_6
#define SEG_D GPIO_Pin_7
#define SEG_E GPIO_Pin_8
#define SEG_F GPIO_Pin_9
#define SEG_G GPIO_Pin_10
#define SEG_DP GPIO_Pin_11

extern uint8_t digit[4];
extern uint8_t seg_num[10];

void display_init(void);
void display_update(void);

#endif

c文件:

#include "display.h"

uint8_t digit[4] = {0, 0, 0, 0}; // 数码管的位数
uint8_t seg_num[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数字对应的段码

void display_init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 数码管共阴极,设置为低电平
    GPIO_InitStructure.GPIO_Pin = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP);

    // 数码管的位选,设置为高电平
    GPIO_InitStructure.GPIO_Pin = DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4);
}

void display_update(void) {
    static uint8_t digit_index = 0; // 当前显示的位数

    // 数码管的位选
    GPIO_ResetBits(GPIOA, DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4);
    switch (digit_index) {
        case 0:
            GPIO_SetBits(GPIOA, DIGIT_1);
            break;
        case 1:
            GPIO_SetBits(GPIOA, DIGIT_2);
            break;
        case 2:
            GPIO_SetBits(GPIOA, DIGIT_3);
            break;
        case 3:
            GPIO_SetBits(GPIOA, DIGIT_4);
            break;
        default:
            break;
    }

    // 数码管的段选
    GPIO_ResetBits(GPIOA, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP);
    GPIO_SetBits(GPIOA, seg_num[digit[digit_index]]);
    if (digit_index >= 3) {
        digit_index = 0;
    } else {
        digit_index++;
    }
}

使用方法:

  1. 在主函数中调用 display_init() 进行初始化。
  2. 在定时器中断中调用 display_update() 进行数码管显示更新

原文地址: https://www.cveoy.top/t/topic/che2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录