程序消抖求解决哪位大神帮忙看下啊,急急,谢谢

2019-07-21 00:36发布

用拨码开关调频,下载好后可以用,不过几天后就有异常,高手能帮我看下吗?急急,异常是我没做拨码开关的消抖吗
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
#include "timer.h"
#include "led.h"
#include "24cxx.h"
extern u16 f,w;               

void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        t++;       
                        if(t<w)
                        {
                                LED3=0;
                                LED4=0;
                        }       
                        else
                        {
                                LED3=1;
                                LED4=1;
                        }
                        if(t>=f)t=0;
                }
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志        
}

//按键初始化函数
void KEY_Init(void) //IO初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9;//PB9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);//
       
        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;//KEY0-KEY6
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
        GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE0,1,2,3
}

////////////
void KEY_Scan1()//拨码开关调频
{
        if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)//0
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=200;w=100;       
        }
        else if(KEY0==0&&KEY1==1&&KEY2==1&&KEY3==1)//1
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=140;w=70;
        }
        else if(KEY0==1&&KEY1==0&&KEY2==1&&KEY3==1)//2
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=100;w=50;
        }
        else if(KEY0==0&&KEY1==0&&KEY2==1&&KEY3==1)//3
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=70;w=35;
        }
        else if(KEY0==1&&KEY1==1&&KEY2==0&&KEY3==1)//4
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=50;w=25;
        }
        else if(KEY0==0&&KEY1==1&&KEY2==0&&KEY3==1)//5
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=40;w=20;
        }
        else if(KEY0==1&&KEY1==0&&KEY2==0&&KEY3==1)//6
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=30;w=15;
        }
        else if(KEY0==0&&KEY1==0&&KEY2==0&&KEY3==1)//7
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=16;w=8;
        }
        //
        else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)//8
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=10;w=5;
        }
        else if(KEY0==0&&KEY1==1&&KEY2==1&&KEY3==0)//9
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=8;w=4;
        }
       
        else
        {
                  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE); //时钟使能
                        LED3=0;LED4=1;
        }
       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
32条回答
hlphzy123456
1楼-- · 2019-07-22 18:53
非常感谢你啊,uchar KeyScan()        
{
        uchar cord ;
        cord = GPIOE->IDR & 0x0f;                 
        return (cord);        
}
void KeyPro()
{
        switch( KeyScan() )
        {
                case 0x0f:要执行的                break;          //这里的0x0f代表gpioe,的PE0到PE3都为高电平对吗?如果case 0x00,则PE0到PE3都为低电平电平对吗?
               
        }        

下面还有一个问题。我想通过定时器中断里面的时间进行消抖,我如下写的程序对吗?麻烦帮我再看下啊万分感谢,
void TIM3_IRQHandler(void)   //TIM3中断ARR=499,还有一个是359,算下来5ms中断一次
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        t++;        
                        if(t<w)
                        {
                                LED3=0;
                                LED4=0;
                        }        
                        else
                        {
                                LED3=1;
                                LED4=1;
                        }
                        if(t>=f)t=0;
                }
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志     
    KeyScan();//我把这个放在中断里面进行扫描
}
//下面我再把KeyScan()函数修改下,如下
uchar KeyScan()        
{
        uchar cord ;
        static uint flag;//定时器中断一次5MS
        cord = GPIOE->IDR & 0x0f;
        flag++;
       if(flag==4)//20ms
      {
             if( cord = GPIOE->IDR & 0x0f)//判断拨码开关是否拨下
             {
                      cord = GPIOE->IDR & 0x0f;//确定拨下这样进行消抖可以吗
             }
      }               
        return (cord);        
}
edmund1234
2楼-- · 2019-07-23 00:29
 精彩回答 2  元偷偷看……
hlphzy123456
3楼-- · 2019-07-23 01:42
 精彩回答 2  元偷偷看……
edmund1234
4楼-- · 2019-07-23 02:23
hlphzy123456 发表于 2019-5-29 19:36
那我修改成如下void KEY_Scan1()//拨码开关调频
{
        if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)//0

  //---------------- 1ms 定时中断
  SysTick->CTRL=0;
  SysTick->VAL=0;
  SysTick->LOAD = 72000-1;
  SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|
                  SysTick_CTRL_ENABLE_Msk;
hlphzy123456
5楼-- · 2019-07-23 04:48
非常谢谢啊,我是两个拨码开关,一个拨码开关接是PB9,PE0到PE2,一个拨码开关接的是PE3到PE6
DipSwR = GPIOE->IDR & 0x0F;这个我修改成DipSwR =GPIOB|GPIOE->IDR & 0xFF;对吗?
edmund1234
6楼-- · 2019-07-23 05:54
hlphzy123456 发表于 2019-5-29 20:19
非常谢谢啊,我是两个拨码开关,一个拨码开关接是PB9,PE0到PE2,一个拨码开关接的是PE3到PE6
DipSwR = GPIO ...


int tem =  GPIOE->IDR&0x7F;
if (GPIOE->IDR & (1<<9)
  tem+=0x80;

if ((DipSwR ^ GPIOE->IDR)&0x0F)    -->    if ((DipSwR ^ tem)
  .....
  ....
DipSwR = GPIOE->IDR & 0x0F; -->  DipSwR = tem;

一周热门 更多>