数码管显示同一个数字

写的是通过按键key0和key1使数码管显示0-29,但是数码管显示的是1111 2222 请问哪里出错了?


#include    // Device header
#include "smg.h"
#include "delay.h"
#include "key.h"

void SMG_Display1(u8 arr[]);
u16 dis[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳数码管码表co-90为0-9,后面为A-F
u8 wei[] = {0x0001, 0x0002, 0x0004, 0x008}; //四位数码管,需要四个位选控制码
u8 arr[] = {0x00, 0x00, 0x00, 0x00}; //数码管显示数组,初始值为0
u8 count = 0; //计数器,初始值为0

int main(void)
{
    SMG_GPIO_Config(); //数码管GPIO口初始化
    Key_Init(); //按键初始化
    while(1)
    {
        if(KEY0 == 0) //按下按键KEY0,数码管依次显示00~29
        {
            count++;
            while(KEY0 == 0); //等待按键释放
            if(count >= 29) count = 0; //计数器溢出,重新从0开始计数
            arr[0] = count / 10; //计算千位数
            arr[1] = count % 10; //计算百位数
            arr[2] = count / 10; //计算十位数
            arr[3] = count % 10; //计算个位数
            SMG_Display1(arr); //刷新数码管显示
            delay_ms(500); //延时500ms
        }
        if(KEY1 == 0) //按下按键KEY1,减1
        {
            count--;
            while(KEY1 == 0); //等待按键释放
            if(count <= 0) count = 29; //计数器溢出,重新从29开始计数
            arr[0] = count / 10; //计算千位数
            arr[1] = count % 10; //计算百位数
            arr[2] = count / 10; //计算十位数
            arr[3] = count % 10; //计算个位数
            SMG_Display1(arr); //刷新数码管显示
        }
    }
}

void SMG_Display1(u8 arr[]) //数码管显示函数
{
GPIO_Write(GPIOA, dis[arr[0]]); 
GPIO_Write(GPIOB, wei[0]); 
delay_ms(5); 
 GPIO_Write(GPIOB,0x0000);

    
GPIO_Write(GPIOA, dis[arr[1]]); 
GPIO_Write(GPIOB, wei[1]); 
delay_ms(5); 
 GPIO_Write(GPIOB,0x0000);

GPIO_Write(GPIOA, dis[arr[2]]); 
GPIO_Write(GPIOB, wei[2]); 
delay_ms(5); 
GPIO_Write(GPIOB, 0x0000); 

GPIO_Write(GPIOA, dis[arr[3]]);
GPIO_Write(GPIOB, wei[3]);
delay_ms(5); 
GPIO_Write(GPIOB, 0x0000); 

}

延时函数初始化了吗



```c
 arr[0] = count / 10; //计算千位数
            arr[1] = count % 10; //计算百位数
            arr[2] = count / 10; //计算十位数
            arr[3] = count % 10; //计算个位数
这段代码根本就是错误的嘛。

```

而且没有按键的情况下,连刷新都不做了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/988533
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:蓝桥杯嵌入式KEY配置(中断、扫描)
  • 除此之外, 这篇博客: 【蓝桥杯】KEY(基础板上的四个按键)中的 KEY软件驱动 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    key.c

    #include "key.h"
    #include "stm32f10x_it.h"
    #include "led.h"
    
    void KEY_Init(void)
    {
    	EXTI_InitTypeDef   EXTI_InitStructure;
    	GPIO_InitTypeDef   GPIO_InitStructure;
    	NVIC_InitTypeDef   NVIC_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    	//PA0
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    
    	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure);
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	//PA8
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
    	
    	EXTI_InitStructure.EXTI_Line = EXTI_Line8;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure);
    	
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	//PB1
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
    	
    	EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure);
    	
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	//PB2
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
    	
    	EXTI_InitStructure.EXTI_Line = EXTI_Line2;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure);
    	
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    }
    //按键1:PA0
    void EXTI0_IRQHandler(void)
    {
    	delay_ms(5);
      if(EXTI_GetITStatus(EXTI_Line0) != RESET)
      {
    	LED_Control(LED1,1);
        /* Clear the  EXTI line 0 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line0);
      }
    }
    //按键2:PA8
    void EXTI9_5_IRQHandler(void)
    {
    	delay_ms(5);
      if(EXTI_GetITStatus(EXTI_Line8) != RESET)
      {
    	LED_Control(LED1,0);
        /* Clear the  EXTI line 8 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line8);
      }
    }
    //按键3:PB1
    void EXTI1_IRQHandler(void)
    {
    	delay_ms(5);
      if(EXTI_GetITStatus(EXTI_Line1) != RESET)
      {
    	LED_Control(LED2,1);
        /* Clear the  EXTI line 0 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line1);
      }
    }
    //按键4:PB2
    void EXTI2_IRQHandler(void)
    {
    	delay_ms(5);
      if(EXTI_GetITStatus(EXTI_Line2) != RESET)
      {
    	LED_Control(LED2,0);
        /* Clear the  EXTI line 0 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line2);
      }
    }
    

    key.h

    #ifndef __KEY_H
    #define __KEY_H
    
    #include "stm32f10x.h"
    
    void KEY_Init(void);
    
    #endif
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^