蓝桥杯嵌入式——KEY模块(双击)

配置

这个和之前没变化

编程

.h文件中的结构体新增了三个变量

 1 #ifndef _interrupt_H_
 2 #define _interrupt_H_
 3 
 4 #include "main.h"
 5 #include "stdbool.h"
 6 
 7 struct keys
 8 {
 9     bool key_now;
10     uint8_t key_flag;
11     bool key_single;
12     
13     uint8_t key_time;
14     bool key_long;
15     
16     uint8_t key_interval;
17     uint8_t key_twiceEn;
18     bool key_double;
19 };
20 
21 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
22 
23 #endif

然后中断函数的编写,长按键是松开后依据按住时间的长短判断是长还是短,双击是第一次按下松开后开始计时,且key[i].key_flag置零(case 0),然后一定时间后,key[i].key_twiceEn=1开始发挥作用,要么使key[i].key_single 为1(这一过程未在switch语句中),要么再次进入case2,让key[i].key_double为1,之后将key[i].key_twiceEn置零

 1 #include "interrupt.h"
 2 
 3 struct keys key[4]={0,0,0,0,0,0,0,0};
 4 
 5 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 6 {
 7     if(htim->Instance==TIM3)
 8     {
 9         key[0].key_now = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
10         key[1].key_now = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
11         key[2].key_now = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
12         key[3].key_now = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
13         
14         for(uint8_t i=0;i<4;i++)
15         {
16             switch(key[i].key_flag)
17             {
18                 case 0:
19                 {
20                     if(key[i].key_now==0)
21                     {
22                         key[i].key_flag = 1;
23                         key[i].key_time = 0;
24                     }
25                 }
26                 break;
27                 case 1:
28                 {
29                     if(key[i].key_now==0)
30                     {
31                         key[i].key_flag = 2;
32                     }
33                     else
34                     {
35                         key[i].key_flag = 0;
36                     }
37                 }
38                 break;
39                 case 2:
40                 {
41                     if(key[i].key_now==1&&key[i].key_time < 70)
42                     {
43                             if(key[i].key_twiceEn==0)
44                             {
45                                 key[i].key_twiceEn = 1;
46                                 key[i].key_interval = 0;
47                             }
48                             else
49                             {
50                                 key[i].key_double = 1;
51                                 key[i].key_twiceEn = 0;
52                             }
53                         key[i].key_flag = 0; 
54                     }
55                     else if(key[i].key_now==1&&key[i].key_time >= 70)
56                     {
57                         key[i].key_long = 1;
58                         key[i].key_flag = 0; 
59                     }
60                     else
61                     {
62                         key[i].key_time++;
63                     }
64                 }
65                 break;
66             }
67             if(key[i].key_twiceEn == 1)
68             {
69                 key[i].key_interval ++;
70                 if(key[i].key_interval >= 20)
71                 {
72                     key[i].key_twiceEn = 0;
73                     key[i].key_single = 1;
74                 }
75             }
76         }
77     }
78 }

应用

 1 void led_prc(void)
 2 {
 3     if(key[0].key_single==1)
 4     {
 5         if(led_sta)
 6         {
 7             LED_Disp(0x01);
 8         }
 9         else
10         {
11             LED_Disp(0x02);
12         }
13         led_sta = !led_sta;
14         key[0].key_single = 0;
15     }
16     if(key[0].key_long==1)
17     {
18         LED_Disp(0x04);
19         key[0].key_long = 0;
20     }
21     if(key[0].key_double==1)
22     {
23         LED_Disp(0x08);
24         key[0].key_double = 0;
25     }
26 }

 

原文地址:https://www.cnblogs.com/Euphonium611/p/17220592.html