STM32超级简便的按键代码 只需三行 可实现短按+长按

【蓝桥杯】STM32三行按键详解 长按 短按

用的是国信长天的嵌入式方向的开发板,使用的芯片是STM32F103RBT6,基于stm32f1的固件库编程。
当初写下这篇博客的本意也是让自己的知识更加巩固,希望大家看完后能有所收获。话不多说,直接上代码!

程序思路:
程序每1ms进入一次滴答定时器中断函数,函数内的key_count为按键计数变量,当key_count = 20时,即20ms时,令blKEY_Flag = 1;

当blKEY_Flag = 1时,key_proc函数中的uckey_times变量开始计数,当计数值大于40时,为长按。当计数值大于0小于20时,为短按.

具体代码如下:

按键宏定义

unsigned char ucTrg  = 0;
unsigned char ucCont = 0;
unsigned char uckey_times = 0;
unsigned char uckey_num = 0;
_Bool blKey_Flag = 0;

#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)

#define KEYPORT KEY1 | (KEY2 << 1) | (KEY3 << 2) | (KEY4 << 3) | 0xf0

按键扫描函数

//按键扫描
void key_scan(void)
{
  unsigned char ucRead = 0;
  
  ucRead = (KEYPORT) ^ 0xff;
  ucTrg = ucRead & (ucRead ^ ucCont);
  ucCont = ucRead;
}

按键扫描函数解析

理解不了三行按键代码的同学,可以像如下代码一样,将具体值代入变量中,再去一步一步的往下推,一两遍过后,相信你一定可以理解的!

//未按下:
	KEYPORT = 0xff;
	ucRead  = (KEYPORT) ^ 0xff = 0xff ^ 0xff = 0x00;
	ucTrg   = ucRead & (ucRead ^ ucCount) = 0x00 & (0x00 ^ 0x00) = 0x00;
	ucCount = ucRead = 0x00;

//第一次按下KEY1:
	KEYPORT = 0xfe;
	ucRead  = (KEYPORT) ^ 0xff = 0xfe ^ 0xff = 0x01;
	ucTrg   = ucRead & (ucRead ^ ucCount) = 0x01 & (0x01 ^ 0x00) = 0x01 & 0x01 = 0x01;
	ucCount = ucRead = 0x01;

//持续按下KEY1:
	KEYPORT = 0xfe;
	ucRead  = (KEYPORT) ^ 0xff = 0xfe ^ 0xff = 0x01;
	ucTrg   = ucRead & (ucRead ^ ucCount) = 0x01 & (0x01 ^ 0x01) = 0x00;
	ucCount = ucRead = 0x01;

按键短按

这个函数只有短按的功能,对于一般的题目该函数已经足够了,如果题目要求要用到按键长按,那么请直接跳到后面的长按。

//短按
void key_func(void)
{
  if (blKey_Flag)
  {
    blKey_Flag = 0; //在滴答定时器中计时,每20ms使 blKey_Flag=1
    key_scan();
    
    switch (ucTrg)
    {
      case 0x01: led_control(0x01);
        break;
      case 0x02: led_control(0x04);
        break;
      case 0x04: led_control(0x10);
        break;
      case 0x08: led_control(0x40);
        break;   
    }   
  }
}

按键短按+长按函数

该函数同时具有短按和长按的功能,uckey_times是判断长短按的关键,uckey_times > 40是长按,uckey_times < 20是短按。

//短按+长按
void key_proc(void)
{
  if (blKey_Flag)
  {
    blKey_Flag = 0;
    key_scan();
	/*长按部分*/
    switch (ucCont)
    {
      case 0x01: uckey_times++, uckey_num = 1; 
                 if (uckey_times > 40) led_control(0x55);
          break;
      case 0x02: uckey_times++, uckey_num = 2; 
                 if (uckey_times > 40) led_control(0xaa);
          break;
      case 0x04: uckey_times++, uckey_num = 3; 
                 if (uckey_times > 40) led_control(0x55);
          break;
      case 0x08: uckey_times++, uckey_num = 4; 
                 if (uckey_times > 40) led_control(0xaa);
          break;
    }
    /*短按部分*/
    if (ucTrg == 0x00 && ucCont == 0x00)
    {
      if (uckey_times > 0 && uckey_times < 20)
      {
        switch (uckey_num)
        {
          case 1: led_control(0x01);
            break;
          case 2: led_control(0x04);
            break;
          case 3: led_control(0x10);
            break;
          case 4: led_control(0x40);
            break;     
        }  
      }
       uckey_times = 0; 
    }  
  }
}

systick.c
可以看到我是通过轮询的思想来写的代码,通过中断函数的计时变量来控制多久执行一次我的按键程序,该思想也可以用于ADC,LCD显示,USART打印等…

unsigned char key_count = 0;

void SysTick_Handler(void)
{
	TimingDelay_Decrement();

//	lcd_count++;
//	if (lcd_count > 200) lcd_count = 0,LCD_Flag  = 1;
//	
	key_count++;
	if (key_count > 20) key_count = 0,blKEY_Flag  = 1;
	
//	ADC_count++;
//	if (ADC_count > 800) ADC_count = 0,blADC_Flag  = 1;
//	
//	ucUSART_Times++;
//	if (ucUSART_Times > 50) ucUSART_Times = 0,RxCounter  = 0,memset(RxBuffer2,0,3);
}

第一次写博客,如有不对的地方,欢迎大家在评论区指正。

  • 15
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32按键实现短按按、双击、组合和hold功能主要依赖于按键的扫描和判定逻辑。 首先,要通过GPIO配置STM32按键引脚,将其设置为输入模式。接下来,在主循环中进行按键扫描。可以通过读取GPIO输入状态的方式判断按键是否按下,根据不同按键的组合方式进行逻辑判定。 对于短按功能,只判断按键是否按下,若是则执行对应的短按操作。 对于按功能,要判定按键是否保持一定的持续时间。可以使用计时器来实现按判定,对于每个按键独立的计时器,当按键按下时启动计时器,超过预设时间则判定为按。 对于双击功能,要判定两次按下之间的时间间隔。可以使用计时器记录每次按键按下的时间戳,当第二次按键按下时,判断两次时间差是否在预设的双击时间间隔范围内,若是则执行双击操作。 对于组合功能,要判定多个按键同时按下的情况。可以通过检测多个GPIO输入状态的方式进行判定,若多个按键同时按下则执行对应的组合操作。 对于hold功能,一般指按键按后持续执行某个操作。可以在按判定后,启动一个定时器,并按照一定频率执行对应的操作,直到按键释放。 要注意的是,为了防止按键的抖动现象,可以在按键读取过程中进行消抖处理,例如添加延时、使用软件滤波器等方法。 通过上述判定逻辑和处理方法,可以实现STM32按键短按按、双击、组合和hold功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值