STM32入门—GPIO输入源代码压缩文件按资源:https://download.csdn.net/download/m0_74910976/88766128?spm=1001.2014.3001.5503
GPIO的输入一般通过按键来表示,当按下按键给系统输入一个高电平,相当于二进制的"1",当松开按键就回到了低电平"0"。
1.查找引脚
通过原理图查找按键的引脚
通过按键模块的原理图可以知道按键2、3对应的引脚分别是PA0和PC13。
2.配置引脚
输入使用的是数据输入寄存器IDR,下面以按键2为例
在工程文件中添加key.c文件,用于配置按键。
在key.c中带定义一个配置函数void KEY_GPIO_Config(void),首先定义一个GPIO_InitTypeDef类型的变量GPIO_InitStructure,然后打开GPIOA外设的系统时钟RCC,因为PA0是GPIOA下面的I/O口,接下来就是使用刚刚定义的变量GPIO_InitStructure来设置PA0的输入模式,最后通过GPIO_Init()函数来初始化PA0。
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
再在key.c中定义一个函数uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)用于判断按键按下和松开。原理就是,如果按下按键,输入高电平,松开就回到低电平,如果长按,就用一个while循环来定于按下的操作
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;
}
在这个函数里面,GPIO_ReadInputDataBit()这个函数用于读取I/O输入数据比特位,按下就是"1",松开就是"0"。在这个if...else中,如果按下就进入if,当你长按使就一直执行while循环,没有其他操作,循环结束返回KEY_ON, KEY_ON是宏定义的"1"。如果松开就执行else,返回"0"。
将这两个函数在key.h头文件中声明,这样在main.c中包含头文件就可以使用这两个函数。
3.设置按键事件
这里按键事件是按下灯灭,松开灯亮。
首先打开LED的RCC时钟,再调用LED的配置函数配置LED,同样调用按键配置函数配置按键,然后通过一个while循环取检测按键状态
int main(void)
{
LED_GPIO_RCC(); //打开两个LED的时钟RCC
LED_GPIO_Config(GPIO_Pin_0); //LED1
LED_GPIO_Config(GPIO_Pin_1); //LED2
KEY_GPIO_Config(); //KEY1
KEY_GPIO_Config1(); //KEY2
while(1)
{
if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON)
LED_G_TOGGLE;
if(Key_Scan(GPIOC, GPIO_Pin_13) == KEY_ON)
LED_G_TOGGLE1;
}
}
这里的LED_G_TOGGLE是定义再led.h中的宏定义
#define LED_G_TOGGLE {GPIOB->ODR ^= GPIO_Pin_0;}
#define LED_G_TOGGLE1 {GPIOB->ODR ^= GPIO_Pin_1;}
^是C语言二进制的运算符异或,作用就是与1异或改变,与0异或不变,这样就可以使LED亮灭交替。