×
单片机 > 单片机程序设计 > 详情

利用STM32的Systick中断实现按键消抖

发布时间:2020-09-03 发布时间:
|

在系统初始化的时候对systick进行初始化


 void SysTickConfig(void)

{

  /* Set SysTick Timer for 100us interrupts  */

  if (SysTick_Config(SystemCoreClock / 10000))

  {

    /* Capture error */

    while (1);

  }

  /* Configure the SysTick handler priority */

  NVIC_SetPriority(SysTick_IRQn, 0x0);

}

在stm32f4xx_it.c中加入

void SysTick_Handler(void)

{

Key_Scan();

}


在按键初始化中加入按键扫描函数


void Key_Scan(void)

{                        

         /*检测是否有按键按下 */

         if( (GPIOG->IDR&(1UL<<5))!=(1UL<<5) )

         {         

                 kcount++;                         //有键按下,计数kcount加1

                 if(kcount>=32)                    //1MS中断一次,kcount大于等于32,即按键已按下32ms

                 {

                         if(label==0)                //判断有没有重按键,1为有,0为没有

                        {

                        keys1=1;                       //设置按键标志

                        kcount=0;        

                        label=1;                     //设置重按键标志

                        }

                        else

                        kcount=0;

                 }      

                 else

                         keys1=0;

         }

         else                                            //无按键按下

         {

                 kcount=0;                      //清零kcount

                 keys1=0;                            //清除按键标志

                 label=0;                          //清除重按键标志

         }               

}

按键IO口初始化 PA0 PG4 PG5 三个IO口

void KeyInit(void)

{

  /* Enable clock and init GPIO inputs */

  RCC->AHB1ENR |= (1UL << 0) |

                  (1UL << 6) ;

 

  GPIOA->MODER &= ~(3UL << 2* 0);

  GPIOG->MODER &= ~(3UL << 2* 4);

  GPIOG->MODER &= ~(3UL << 2* 5);

}

UL是指32位无符号整形数据  ,因此GPIOG->MODER &= ~(3UL << 2* 0);是指让PG5口作为输入;

uint8_t kcount;

uint8_t label;

extern uint8_t keys1;


最后忘了要定义这几个变量,否则编译通不过。

关键字:STM32  Systick中断  按键消抖

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义