这里介绍一下STM32的按键电路,直接切入正题。
一、双按键控制LED灯全代码配置详细流程
1.按键具体配置流程(Key.c)
因为要用到按键以及LED灯,可以知道需要配置按键的GPIO输入模式和LED灯的GPIO输出模式,首先进行按键的配置,具体的配置代码如下,按键初始化是还用一个GPIO口必须要进行的编写,按键配置就是上拉输入并开启PB1,如果需要开启其他GPIO口则需要在GPIO_Pin中或上想要开启的GPIO口,例如想再加一个PB2则在GPIO_Pin_1后加上“|GPIO_Pin_2”即可。
初始化完成后接下来配置按键输入该执行的操作这里编写一个uint8_t Key_GetNum(void)函数,首先定义一个变量并赋初始值为0,后面我们需要调用GPIO_ReadInputDataBit来获取输入寄存器的输入值,该函数有两个参数第一个选择需要开启的GPIO口,第二个选择需要开启的具体的引脚,通俗的理解就是调用这个函数可以知道该GPIO引脚输入的电平状态,这里我们用if来进行操作,具体查看代码,判定输入低电平则进入if。
该处有一个延时20ms的操作放在函数两侧,因为按键按下以及松开时可能会由于接触放开不彻底导致输入的信号会有干扰波动,所以使用延时函数延时来进行消抖处理。
当确认输入为低电平则keynum赋值给1。
按键配置好后,当按下对应GPIO口的按键时,则keynum赋值为1,这个变量可以传递到主函数中,但要注意,void Key_Init(void)中的keynum是返回到本身,意思就是主函数中还需要定义一个变量,将void Key_Init(void)的值赋值给主函数中的变量,这一部分在主函数中再介绍。keynum=2相同的操作,注意初始化GPIO口进行读取,这里用的PB11读取按键2
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)//按键初始化
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入默认给高电平,CPU输入设置为上拉模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;//开启PB1作为输入IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t Key_GetNum(void)
{
uint8_t keynum=0;//初始值赋0
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//按键按下,低电平有效
{
Delay_ms(20);//按键消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//条件成立,执行里面的keynum=1操作
Delay_ms(20);
keynum=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//用来读取输入数据寄存器的输入值
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
Delay_ms(20);
keynum=2;
}
return keynum;//返回keynum的值
}
2.LED配置流程(LED.h)
此处的函数主要配置LED亮灭的程序,即编写函数,调用这个里面的函数给定信号执行亮灭操作。这里的GPIO口就需要配置成输出模式了,一般将其配置成推挽输出模式就行。然后指定对应的GPIO口作为输出源,用来接上LED灯,这里我们设置低电平点亮的方式,下面封装函数使用GPIO_ResetBits和GPIO_SetBits来进行输出,前者是给对应配置IO口置低电平,后者相反。一个用来置低(点亮),一个用来置高(熄灭)。
#include "stm32f10x.h" // Device header
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_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);//默认高电平
}
void LED1_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
3.主函数配置(main.c)
在使用我们上面封装的函数之前需要注意,在前面声明函数文件。
定义一个变量用来接收来自按键的信号,main内初始化函数, LED_Init();Key_Init();两个,这样就可以使用了,接着在wilhe循环里编写,用来刷新按键,按键输入是用Key_GetNum读取输入的,这样在按键按下时Key_GetNum记录对应的按键并将值传给keynum然后进入if,如果按下的是PB1处的按键,就会进入第一个if里面执行LED1_ON的操作,给对应的输出IO口置低电平,这样就能点亮了,同理另外的按键输入就是熄灭LED。
#include "stm32f10x.h" // Device header
#include "Delay.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_ON();
}
if(keynum==2)
{
LED1_OFF();
}
}
return 0;
}
二、单个按键控制LED点亮熄灭的程序配置
上面是两个按键控制一个LED灯的亮灭,接下来我们用一个按键来进行控制。
其实单个按键控制LED点亮熄灭与双按键的区别主要在于LED里有所不同,这里我们需要用到GPIO_ReadOutputDataBit这个函数了,读取输出寄存器的值,调用这个函数可以实现电平翻转的功能,具体配置如下,其他的和上面的类似进行配置,主函数if直接调用LED3_Turn()就行了。
#include "stm32f10x.h" // Device header
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_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);//默认高电平
}
void LED3_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)==0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_3);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
}