一、按键检测原理
开发板上的按键1是接在了GPIOA->IDR寄存器上了,只要通过读取其寄存器状态即可。
二、 代码分析
-
首先构建
bsp_key.h
和bsp_key.c
两文件于/USER/KEY文件夹内; -
在
Keil MDK
工程里导入文件路径 -
bsp_key.h
文件主要写一些方便以后修改方便的、看起来简洁的宏定义,以及#incude
一些必要的头文件、写在.c
文件里的函数声明#ifndef __BSP_KEY_H__ #define __BSP_KEY_H__ #include "stm32f10x.h" #define KEY_ON 1 #define KEY_OFF 0 #define KEY1_GPIO_PIN GPIO_Pin_0 //对应的值 #define KEY1_GPIO_PORT GPIOA //外设GPIOA #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA //挂载时钟 uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); //函数声明 void KEY_GPIO_Config(void); #endif /* __BSP_KEY_H__ */
-
bsp_key.c
位于/USER/KEY
文件夹内。主要就是写一些关于初始化和功能的函数,供main主函数的使用。#include "bsp_key.h" void KEY_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE); GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空模式 GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct); } uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) { if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; }
附录1 C语言异或用法
-
符号:
^
-
名称:异或,C语言的一个二进制运算符
-
功能表:相同为零;不同为一。
0⊕0=0,0⊕1=1 1⊕0=1,1⊕1=0
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}
网友评论