微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32F030F4P6按键函数

STM32F030F4P6按键函数

时间:10-02 整理:3721RD 点击:
本人用STM32F030F4P6写了个按键程序,想要的功能是按键按一次亮再按一次灭,但自己写的程序跟想要的功能差距太大,求指正!(这个程序能实现的功能是:按键按一次就亮,但再按一次就没反应了,如果按了一次那第二次无论按哪个按键都是没反应的;如果第一次按J5那D2亮,按第二次没反应,同时按下J5和J6后在放开D6亮,D2灭,然后同时按J6和J7,D7亮,D6灭;如果第一次按J6那D6亮,同时按J6和J7,D7亮,D6灭,同时按J7和J5,D2亮,D7灭,然后同时按两个都D2都是亮的,(同时按下时都是灭的,松开才亮),还有一个也是这样)之前用过定时器来写也失败了!这个是用外部中断写的,代码如下:
#include "led.h"
#include "delay.h"
void Gpio_init(void)
{
    GPIO_InitTypeDef        GPIO_InitStructure;
          EXTI_InitTypeDef        EXTI_InitTypeStu;
          NVIC_InitTypeDef        NVIC_InitTypeStu;
    /* GPIOC Periph clock enable */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    /* Configure PC8 and PC9 in output pushpull mode */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
//          GPIO_ResetBits(GPIOA,GPIO_Pin_3);
       
       
          EXTI_InitTypeStu.EXTI_Line=EXTI_Line0;
                EXTI_InitTypeStu.EXTI_LineCmd=ENABLE;
                EXTI_InitTypeStu.EXTI_Mode=EXTI_Mode_Interrupt;
                EXTI_InitTypeStu.EXTI_Trigger=EXTI_Trigger_Falling;
          EXTI_Init(&EXTI_InitTypeStu);
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
               
                EXTI_InitTypeStu.EXTI_Line=EXTI_Line1;
                EXTI_InitTypeStu.EXTI_LineCmd=ENABLE;
                EXTI_InitTypeStu.EXTI_Mode=EXTI_Mode_Interrupt;
                EXTI_InitTypeStu.EXTI_Trigger=EXTI_Trigger_Falling;
          EXTI_Init(&EXTI_InitTypeStu);
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1);
               
                EXTI_InitTypeStu.EXTI_Line=EXTI_Line2;
                EXTI_InitTypeStu.EXTI_LineCmd=ENABLE;
                EXTI_InitTypeStu.EXTI_Mode=EXTI_Mode_Interrupt;
                EXTI_InitTypeStu.EXTI_Trigger=EXTI_Trigger_Falling;
          EXTI_Init(&EXTI_InitTypeStu);
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource2);
               
                NVIC_InitTypeStu.NVIC_IRQChannel=EXTI0_1_IRQn;
                NVIC_InitTypeStu.NVIC_IRQChannelCmd=ENABLE;
                NVIC_InitTypeStu.NVIC_IRQChannelPriority=0x00;
                NVIC_Init(&NVIC_InitTypeStu);
               
                NVIC_InitTypeStu.NVIC_IRQChannel=EXTI2_3_IRQn;
                NVIC_InitTypeStu.NVIC_IRQChannelCmd=ENABLE;
                NVIC_InitTypeStu.NVIC_IRQChannelPriority=0x01;
                NVIC_Init(&NVIC_InitTypeStu);
}
void EXTI0_1_IRQHandler(void)
{
         GPIO_InitTypeDef        GPIO_InitStructure;
         
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0)
        {
                delay_ms(10);
                 GPIO_SetBits(GPIOA,GPIO_Pin_3);
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0/*|GPIO_Pin_1|GPIO_Pin_2*/;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
//          GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);
//                GPIOA->ODR ^= GPIO_Pin_0;
                GPIOA->ODR = ~GPIO_Pin_0;
               
        }
               
        }
        EXTI_ClearFlag(EXTI_Line0);
//        EXTI_ClearITPendingBit(EXTI_Line0);
        if(EXTI_GetITStatus(EXTI_Line1) != RESET)
        {
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == 0)
        {
                delay_ms(10);
                GPIO_SetBits(GPIOA,GPIO_Pin_3);
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
//                 GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2);
//                GPIOA->ODR ^= GPIO_Pin_1;
                GPIOA->ODR = ~GPIO_Pin_1;
        }
       
        }
        EXTI_ClearFlag(EXTI_Line1);
        EXTI_ClearITPendingBit(EXTI_Line1);
}
void EXTI2_3_IRQHandler(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
         
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        if(EXTI_GetITStatus(EXTI_Line2) != RESET)
        {
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2) == 0)
        {
                delay_ms(10);
                GPIO_SetBits(GPIOA,GPIO_Pin_3);
                GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_0|GPIO_Pin_1|*/GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
//                GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_0);
//                GPIOA->ODR ^= GPIO_Pin_2;
                        GPIOA->ODR = ~GPIO_Pin_2;
        }
       
        }
        EXTI_ClearFlag(EXTI_Line2);
}

#include "stm32f0xx.h"
#include "delay.h"
#include "led.h"
#include "uart.h"

int main(void)
{
        delay_init();
   Gpio_init();
       
        while(1)
        {
//                Gpio_init();
        }
}


你这个问题比较多:
1.最忌讳的就是在中断服务程序中用延时,其实可以在按键中断后打开定时器定时20ms后再处理按键程序
2.IO口只要配置一次就行了,没有必要每次都在中断中再次配置

没有单独写按键检测函数啊,而且直接用取反指令就能实现的功能啊,你这个程序看起来有点小复杂~

已经解决了

已经解决了

如果你是在中断中用延时解决的,虽然现在解决了,但是以后你肯定会后悔的

很乱的代码,不想看,倒胃口

换了另一种思路写出来了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top