微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32学习笔记-按键设计

STM32学习笔记-按键设计

时间:10-02 整理:3721RD 点击:
废话不说,直接先上程序
#include "stm32f10x.h"
/***************************************************************************************************************
函数名:KeyRead
功能:独立按键扫描函数
入口参数:无
返回值:无
说明: Trg的值表示对应哪个按键按下,它只出现一次,也就是说按键按下时对应按键值,之后不关有没有持续按下,都变为0
       Cont的值表示有没有长按,因为只要松开按键,它就会变为0
       Time是定时器进入一次中断时间,由定时器配置时决定
       LongPres为长按键值       ClickTimes为敲击次数,在规定时间内没有连续敲击则变为0,规定时间有连续不断敲击则连续加一。
****************************************************************************************************************/
u16 Trg,Cont,LongPres;
u8 Time,ClickTimes;
void KeyRead( void )
{
    u16 ReadData = ((GPIO_ReadInputData(GPIOB)&0x03f8)|(GPIO_ReadInputData(GPIOA)&0xC000));  // PB3456789和PA14 15
     ReadData = ReadData^0xffff;   // 1
    Trg = ReadData & (ReadData ^ Cont);    // 2
    Cont = ReadData;     // 3
     if(Trg)//按键一次则清除定时器计数值,
     {
          ClickTimes++;
          Time=0;
          LongPres=0;
     }
     if(ClickTimes)//检测到每次按键后200ms若没有再次按键,则清零标志,否则,单击次数加一
     {
          if(Time>2)//此处可以改变单击间隔时间
               ClickTimes=0;
     }
     if((Cont&GPIO_Pin_6)||(Cont&GPIO_Pin_4))
     {
          if(Time>25)//长按时间     约2.5s
          LongPres=Cont; //它置位后就与定时器没有关系了,只有停止按键时才能复位
     }
     else
          LongPres=0;
}

以上就是按键程序,此外还需要定时器,其配置这里就不说了,定时器中断时间是100ms,中断函数如下:
//定时器4中断服务函数
void TIM4_IRQHandler()
{   
     TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
     Time++; //这里不用担心它能加到多大,因为每次按键都会清除Time值,
              //也就是说每次长按都是从0开始计数的,不管Time本身是多少,
               //到达指定长按键计数值时,长按变量LongPres置位,而此时定时器已经对按键没有用了,
               //只有停止按键时LongPres才能复位。此时因此这里不用为其清零,不用担心它能加到多大。
}
下面这个例子看看怎么使用这个程序
          if(ClickTimes==2) //双击
          {
               switch(Trg)     //判断是哪个按键按下
               {
                    case GPIO_Pin_7:    要执行的程序
                    case GPIO_Pin_8:    要执行的程序
                    default :          break;
               }
          }
          if(ClickTimes==3) //三击
          {
               switch(Trg)     //判断是哪个按键按下
               {
                    case GPIO_Pin_14:  要执行的程序;
                    case GPIO_Pin_15:  要执行的程序
                    case GPIO_Pin_3:   要执行的程序
                    default :          break;
               }
          }
          if(ClickTimes==4) //4击
          {
               if(Trg&GPIO_Pin_5)     //判断是哪个按键按下
               {
                要执行的程序   
          }
          }
          if(Trg&GPIO_Pin_6||LongPres&GPIO_Pin_6)//短按一次或者长按
          {                                                
                    要执行的程序
          }
当然,这个程序还是有点bug,比如abc三键依次按,也会被认为是三击,当然认为是最后最后按下的按键三击,这就要看你觉得这个bug有木有影响了,需要大家自己去改进

沙发一个。谢谢小编!

谢谢!

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

网站地图

Top