一、引言
GPIO扫描按键是一种简单的按键检测方法,通过GPIO(通用输入输出)引脚连接按键,并定期(通常是在主循环中)对这些引脚进行扫描。在每次扫描中,检查按键引脚的电平状态,以确定按键是否被按下。如果检测到按键按下,则执行相应的处理逻辑。
二、代码
1.key.c
按键引脚为GPIOD的0,按键为上拉输入
先用KEY_Init()初始化按键,然后用uint8_t Key_GetNum(void)读取其状态,加个延时函数给按键消抖,若按下则KeyNum返回1,用于主函数检测,若扫描到按键按下,则执行LED1_Turn(),实现灯的状态切换
#include "stm32f10x.h"
static void delay(uint32_t time);
void KEY_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);//将引脚初始化为上拉输入
}
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0;
if (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) == 0)//读取输入寄存器的状态,为0则表示按下
{
delay(100);
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) == 0);//等待按键松手
delay(100);
KeyNum = 1;
}
return KeyNum;
}
//延时函数
static void delay(uint32_t time)
{
uint32_t i,j;
for(i=0;i<time;++i)
{
for(j=0;j<10000;++j)
{
//空循环
}
}
}
2.led.c
led引脚为GPIOA的8,led为推挽输出
先用LED_Init()初始化led,然后再读取其状态
LED1_ON()和LED1_OFF()实现灯的亮灭,LED1_Turn()实现灯的状态切换
#include "stm32f10x.h"
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//将引脚初始化为推挽输出
GPIO_SetBits(GPIOA,GPIO_Pin_8);//设置引脚为高电平,灯灭
}
//低电平灯亮,高电平灯灭
void LED1_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
void LED1_Turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8) == 0)//获取输出寄存器的状态,若为低电平
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);//转为高电平
}
else //否则
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//转为低电平
}
}
3.main.c
读取keynum,若为1则为按键按下,灯亮
#include "stm32f10x.h"
#include "LED.h"
#include "KEY.h"
uint8_t KeyNum;
int main(void)
{
LED_Init();
KEY_Init();
while (1)
{
KeyNum = Key_GetNum();
if (KeyNum == 1)
{
LED1_Turn();
}
}
}
三、实验结果
视频一直上传失败所以传了b站
作业二
四、总结
1.自己焊接了排针,焊接技术不过关,焊得非常难看,好在是焊上了,还买了面包板在上面安装了按键
2.找按键引脚找了一会儿才确定为GPIOD 的 0
3.这次作业让我更好地了解了GPIO扫描按键,锻炼了我的动手实践能力,拓展了专业知识,令我受益匪浅