蓝桥杯嵌入式——KEY模块

配置

这个是引脚配置

 

 

 然后是时钟配置(分频和arr)

 

 别忘了这个

 

编程(初始化)

 这个真的很容易忘记(stm32g4xx_hal_tim.c)

1     HAL_TIM_Base_Start_IT(&htim3);

编程(中断)

.h文件中需要记忆结构体的声明(回调函数stm32g4xx_hal_tim.c)
 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 
14 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
15 
16 #endif

.c文件中编写中断回调函数(至少需要记忆函数名称)

 1 #include "interrupt.h"
 2 
 3 struct keys key[4]={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                     }
24                 }
25                 break;
26                 case 1:
27                 {
28                     if(key[i].key_now==0)
29                     {
30                         key[i].key_flag = 2;
31                         key[i].key_single = 1;
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)
42                     {
43                         key[i].key_flag = 0;
44                     }
45                 }
46                 break;
47             }
48         }
49     }
50 }

应用

变量声明

1 extern struct keys key[4];
2 bool led_sta = 1;
3 void led_prc(void);

变量中的函数书写(LED_Disp的书写可以看led部分),led_prc()这个函数可以让灯进行切换点亮

尤其要注意每次都要将key_single置零

 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 }

 

posted @ 2023-03-14 23:13  Euphonium611  阅读(59)  评论(0编辑  收藏  举报