学习STM32的数码管显示

学习STM32的数码管显示内容,需要先了解数码管的原理和控制方法。数码管是一种用于显示数字和一些基本字符的显示装置,它由多个LED组成,可以通过控制LED点亮的方式来显示不同的字符或数字。

在STM32开发板上,常用的数码管是七段数码管,它由7个LED组成,分别表示数字0-9和一些基本字符。每个LED可以独立控制,通过控制哪些LED点亮来显示不同的字符或数字。

下面我将为你提供一个基于STM32的数码管显示的代码案例,并尽量详细地解释每个步骤和代码的含义。

首先,我们需要准备一个基于STM32的开发板,然后安装好开发环境和相应的库文件。本案例使用的是STM32F103系列的开发板,使用的开发环境是Keil uVision 5。

  1. 引入必要的库文件 首先,在代码中引入必要的库文件,包括标准库、GPIO库和定时器库。这些库文件提供了一些常用的函数和宏定义,用于控制STM32的GPIO和定时器等功能。
#include "stm32f10x.h"           // 标准库文件
#include "stm32f10x_gpio.h"      // GPIO库文件
#include "stm32f10x_tim.h"       // 定时器库文件

  1. 配置GPIO和定时器 接下来,我们需要配置GPIO和定时器,以控制数码管的显示。在这个案例中,我们使用的是GPIOA的PIN0~7来控制数码管的7个LED,使用的是TIM2定时器来控制数码管的显示时间。
void GPIO_Configuration(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置GPIO模式为推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    // 配置GPIO的PIN0~7
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
                                | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM_Configuration(void) {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
    // 使能TIM2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    // 配置TIM2为计数模式
    TIM_TimeBaseStructure.TIM_Period = 999;                      // 定时器溢出时间
    TIM_TimeBaseStructure.TIM_Prescaler = 7199;                   // 预分频系数,10ms
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                  // 时钟分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 计数模式
    
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}

  1. 数码管显示函数 接下来,我们实现一个函数,用于控制数码管的显示。在这个函数中,我们通过控制GPIO的输出来控制数码管的LED点亮情况。在这个案例中,我们实现一个简单的计时器功能,用于显示从0到999的数字。
void DisplayNumber(uint16_t number) {
    uint8_t i;
    uint8_t digit[3];
    
    digit[0] = number / 100;         // 获取百位数
    digit[1] = (number / 10) % 10;   // 获取十位数
    digit[2] = number % 10;          // 获取个位数
    
    // 设置数码管的显示
    for (i = 0; i < 3; i++) {
        GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
                             | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
        
        // 根据数字设置数码管的LED点亮情况
        switch (digit[i]) {
            case 0:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
                                    | GPIO_Pin_4 | GPIO_Pin_5);
                break;
            case 1:
                GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
                break;
            case 2:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
                break;
            case 3:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_3);
                break;
            case 4:
                GPIO_ResetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_6);
                break;
            case 5:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6);
                break;
            case 6:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_5 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_4);
                break;
            case 7:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
                break;
            case 8:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4
                                    | GPIO_Pin_5 | GPIO_Pin_6);
                break;
            case 9:
                GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);
                break;
        }
        
        // 设置引脚的输出模式
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        // 配置GPIO的对应引脚
        switch (i) {
            case 0:
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
                break;
            case 1:
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
                break;
            case 2:
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
                break;
        }
        
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        // 延时一段时间,用于数码管的显示
        delay(10);
    }
}

  1. 主函数 最后,我们在主函数中调用上面定义的函数,实现数码管的显示功能。在这个案例中,我们使用TIM2定时器来实现计时功能,每隔一定时间更新一次数码管的显示。
int main(void) {
    uint16_t number = 0;
    
    // 配置GPIO和定时器
    GPIO_Configuration();
    TIM_Configuration();
    
    // 启动定时器
    TIM_Cmd(TIM2, ENABLE);
    
    while (1) {
        // 检查定时器的溢出标志
        if (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != RESET) {
            TIM_ClearFlag(TIM2, TIM_FLAG_Update);
            
            // 数码管的显示
            DisplayNumber(number);
            
            // 数字加一
            number++;
            
            // 数字归零
            if (number == 1000) {
                number = 0;
            }
        }
    }
}

以上就是一个基于STM32的数码管显示的代码案例。在这个案例中,我们通过配置GPIO和定时器,使用循环来控制数码管的显示。通过不断更新数码管的显示内容,实现了一个简单的计时器功能。你可以根据需要,修改代码中的数字和延时时间,实现不同的数码管显示效果。

希望以上内容能够帮助你学习STM32的数码

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值