写的是通过按键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; //计算个位数
这段代码根本就是错误的嘛。
```
而且没有按键的情况下,连刷新都不做了
不知道你这个问题是否已经解决, 如果还没有解决的话: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