这只是提供一个思路给你参考如何做这样一个东西,具体不同型号的单片机初始化都是不一样的,但是基本原理都是差不多的,如果你对这个项目有兴趣可以评论、关注我,如果你也想做这样的一个项目可以私聊找我,我会给你提供帮助。
如果这篇博文对你有帮助赶紧关注、点赞、收藏吧,感谢你的支持!
一、原理讲解
首先我们先去看一下原理图
这是LED的管脚
用来输出
这是按键的管脚
接收输入的信号
这是原理图
当按键KEY2按下的时候,BACKUP就由1变为0
按照这个原理我们可以弄一个按键扫描来识别和保存按键的状态
二、代码实现
这是按键初始化和按键扫描的代码
key.c
#include "key.h"
/*
函数功能:KEY初始化
参数:void
返回值:void
说明:
1、使能GPIOC时钟
2、初始化GPIOC口
PC13:浮空输入模式
*/
void Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体变量
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//浮空输入模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;//PC13
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//50Mhz
GPIO_Init(GPIOC, &GPIO_InitStruct);//初始化GPIOC口
}
/*
函数功能:按键扫描
参数:void
返回值:u8
说明:
1、识别按键
2、消抖
3、记录按键状态
*/
u8 Key_Scan(void)
{
static u8 flag = 0;//没按键按下按键的状态为0
if(KEY1 == 0 && flag == 0)
{
Delay_ms(20);
if(KEY1 == 0)
{
flag = 1;//按键按下按键的状态为1
return 1;
}
}
else if(KEY1 == 1 && flag == 1)
{
flag = 0;//没按键按下按键的状态为0
}
return 0;
}
key.h
#ifndef _KEY_H
#define _KEY_H
#include "stm32f4xx.h"
#include "delay.h"
#include "io_bit.h"
#define KEY1 PCin(13)//位带操作宏定义
void Key_Config(void);
u8 Key_Scan(void);
#endif
main.c
我们先定义一个变量来接收按键的值,如果按键返回值是1就是按下了,就对LED取反这样按一次按键就可以开灯,再按一次就可以关灯;如果按键的值是0,就没有按键按下。
#include "main.h"
int main()
{
u8 Key_State;
Led_Config();
Key_Config();
while(1)
{
/*
点亮LED
*/
// GPIO_SetBits(GPIOB, GPIO_Pin_8);//关
// GPIO_SetBits(GPIOB, GPIO_Pin_9);
// GPIO_ResetBits(GPIOB, GPIO_Pin_8);//开
// GPIO_ResetBits(GPIOB, GPIO_Pin_9);
// LED1 = 1;
// LED2 = 1;
// LED1 = 0;
// LED2 = 0;
/*
按键点亮LED
*/
Key_State = Key_Scan();
if(Key_State == 1)
{
LED1 = ~LED1;
LED2 = ~LED2;
}
}
}
main.h
#ifndef _MAIN_H
#define _MAIN_H
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#endif