赞
踩
续上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4
LED0-LED2 --------> PA0-PA2引脚
KEY1 ---------> PA3引脚
在上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4 的基础上,在GPIO设置里增加一个按键的设置
生成Keil5工程文件后,先编译一下
打开stm32f1xx_it.h,找到void EXTI3_IRQHandler(void);这就是外部中断Line3的中断处理函数
我们右键Go To Denifition Of void EXTI3_IRQHandler,可以在stm32f1xx_it.c中看到如下代码
然后再右键HAL_GPIO_EXTI_IRQHandler;和前面一样GO To一下,就会到stm32f1xx_hal_gpio.c
然后我们需要调用的就是这个一行代码,在这个函数声明前有一个__weak声明
这个声明表示这个函数一旦被重新声明,那这里的函数就自动失效,其他函数调用的时候就会找到你新定义的同名函数
然后我们就在main.c中来调用这行代码
- /* USER CODE BEGIN 4 */
- // 中断触发后,进入此函数,此函数称为回调函数
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 回调函数
- {
- if(GPIO_Pin == KEY1_Pin)//确定是否是KEY1键按下
- {
- for(long i =1; i<72000;i++)//消抖
- {}
- n=!n;//逻辑非 0或者1
- }
- }
- /* USER CODE END 4 */
main.c
我们需要在开头给它定义一个全局变量
- /* USER CODE BEGIN PM */
- uint8_t n; //定义全局变量
- /* USER CODE END PM */
在while循环中写入这串代码,最终我们就可以实现按键中断控制流水灯了~
- while (1)
- {
- /* USER CODE END WHILE */
-
- /* USER CODE BEGIN 3 */
-
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 灯1亮
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 灯2灭
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 灯3灭
- // HAL_Delay(250); // 延时
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // 灯2灭
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 灯3灭
- // HAL_Delay(250); // 延时
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 灯2灭
- // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // 灯3灭
- // HAL_Delay(250); // 延时
-
- switch(n)
- {
- case 0:
- {
- //从左到右亮
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,1);//写高电平,点亮第1个LED
- HAL_Delay(1000);//延时1000毫秒
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,0);
-
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);
- HAL_Delay(1000);//延时1000毫秒
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);
-
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,1);
- HAL_Delay(1000);//延时1000毫秒
- HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,0);
- break;
- }
- case 1:
- {
- //从右到左亮
- HAL_GPIO_WritePin(GPIOA,LED2_Pin,1);//写高电平,点亮第1个LED
- HAL_Delay(1000);//延时1000毫秒
- HAL_GPIO_WritePin(GPIOA,LED2_Pin,0);
-
- HAL_GPIO_WritePin(GPIOA,LED1_Pin,1);
- HAL_Delay(1000);//延时1000毫秒
- HAL_GPIO_WritePin(GPIOA,LED1_Pin,0);
-
- HAL_GPIO_WritePin(GPIOA,LED0_Pin,1);
- HAL_Delay(1000);//延时1000毫秒
- HAL_GPIO_WritePin(GPIOA,LED0_Pin,0);
- break;
- }
- default:
- {
- break;
- }
- }
- }
- /* USER CODE END 3 */
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。