stm32两位数码管显示

#include "stm32f10x.h"
#define DIGIT1 GPIO_Pin_0
#define DIGIT2 GPIO_Pin_1
#define SEG_A  GPIO_Pin_2
#define SEG_B  GPIO_Pin_3
#define SEG_C  GPIO_Pin_4
#define SEG_D  GPIO_Pin_5
#define SEG_E  GPIO_Pin_6
#define SEG_F  GPIO_Pin_7
#define SEG_G  GPIO_Pin_8
#define SEG_DP GPIO_Pin_9

void delay_ms(uint16_t ms) {
SysTick->LOAD = (uint32_t)ms * SystemCoreClock / 1000 - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
SysTick->CTRL = 0;
}

void display_digit(int digit) {
GPIO_SetBits(GPIOA, DIGIT1 | DIGIT2);
switch (digit) {
    case 0:
        GPIO_ResetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F);
        break;
    case 1:
        GPIO_SetBits(GPIOB, SEG_B | SEG_C);
        GPIO_ResetBits(GPIOB, SEG_A | SEG_D | SEG_E | SEG_F | SEG_G);
        break;
    case 2:
        GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_D | SEG_E | SEG_G);
        GPIO_ResetBits(GPIOB, SEG_C | SEG_F);
        break;
    case 3:
        GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_G);
        GPIO_ResetBits(GPIOB, SEG_E | SEG_F);
        break;
    case 4:
        GPIO_SetBits(GPIOB, SEG_B | SEG_C | SEG_F | SEG_G);
        GPIO_ResetBits(GPIOB, SEG_A | SEG_D | SEG_E);
        break;
    case 5:
        GPIO_SetBits(GPIOB, SEG_A | SEG_C | SEG_D | SEG_F | SEG_G);
        GPIO_ResetBits(GPIOB, SEG_B | SEG_E);
        break;
    case 6:
        GPIO_SetBits(GPIOB, SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G);
        GPIO_ResetBits(GPIOB, SEG_B);
        break;
    case 7:
        GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C);
        GPIO_ResetBits(GPIOB, SEG_D | SEG_E | SEG_F | SEG_G);
        break;
    case 8:
        GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G);
        break;
    case 9:
        GPIO_SetBits(GPIOB, SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G);
        GPIO_ResetBits(GPIOB, SEG_E);
        break;
    default:
        break;
}
}

int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitTypeDef gpio_init_struct;

gpio_init_struct.GPIO_Pin = DIGIT1 | DIGIT2;
gpio_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &gpio_init_struct);

gpio_init_struct.GPIO_Pin = SEG_A | SEG_B | SEG_C | SEG_D |
                            SEG_E | SEG_F | SEG_G |SEG_DP;
gpio_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &gpio_init_struct);

while (1) {
    for (int i = 0; i < 100; i++) {
        int digit1 = i / 10 % 10;
        int digit2 = i % 10;

        display_digit(digit1);
        GPIO_ResetBits(GPIOA, DIGIT1);
        delay_ms(5);

        display_digit(digit2);
        GPIO_ResetBits(GPIOA, DIGIT2);
        delay_ms(5);

        GPIO_SetBits(GPIOA, DIGIT1 | DIGIT2);
    }
}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32嵌入式仿真静态两位数码管显示实验的原理如下: 1. 数码管的显示原理 数码管是一种数字显示器件,通常由七个LED灯组成,可以显示0-9十个数字和一些字母、符号等。在常规的七段式数码管中,每个数字都可以用七条线段的状态来表示。这七条线段分别代表数码管的a、b、c、d、e、f、g七个LED灯,每个灯都可以点亮或者熄灭,通过不同线段的状态组合,就可以显示出不同的数字或字符。 2. STM32的输入输出控制 STM32是一种微控制器,它可以通过输入输出控制来实现对外部设备的控制。在本实验中,我们需要使用STM32的IO口来控制数码管的显示和按键的输入。具体来说,需要将7个IO口连接到数码管的七个线段上,一个IO口连接到按键上,通过读取IO口的状态来检测按键是否按下,将数字转换成对应的控制信号,通过IO口输出到数码管上控制LED点亮。 3. 程序实现 在程序实现中,需要首先初始化STM32的IO口,将数码管和按键连接到对应的IO口上。然后在主循环中不断读取按键状态,如果按键按下则数码管上的数字加1,如果数字超过99则清零。接着将数字转换成对应的控制信号,输出到数码管上控制LED点亮。 总之,这个实验的基本原理是通过STM32的IO口控制数码管的显示,在数码管上显示相应的数字。需要了解数码管的显示原理,掌握STM32的输入输出控制方法,编写程序实现对数码管和按键的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值