Stm32控制按键开和关
一、准备硬件设备
1、stm32fxx系列开发板(这里我用的是stm32f407系列)
2、按键模块(我这里用的是两引脚的)
3、杜邦线两根
4、LCD显示屏(我用的是12232LCD)
5、面包板
二、硬件连接原理图
按键硬件图
硬件连接原理图
这里我用的是GPIOD0口,按键两引脚分别接Vdd和PD0,我这里按下去就把按键上拉到高电平了,故程序示例中用的是高电平触发按键作用。
三、代码示例
因为每个小伙伴用的显示屏存在区别,所以这里我只放按键控制开和关的程序,其控制开和关的逻辑是相同的,示例如下:
key.h
#ifndef __KEY_H
#define __KEY_H
#define key_on GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) //按键按下时,单片机读按键输入信息
void GPIO_Configuration(void); //GPIO端口初始化
#endif
key.c
#include "stm32f4xx.h"
u32 key_nums; //按键计数
void GPIO_Configuration(void) //GPIO端口初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
//D口使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
//PD0按键控制
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOD,&GPIO_InitStruct);
}
main.c
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
delay_init(168); //初始化延时函数
GPIO_Configuration();
while(1)
{
if(key==1)
{
delay_ms(20);//按键消抖
/*因为按键一脚接的是正极,故按键按下时电平被拉高,为1*/
if(key==1)
{
key_nums++;//按键每按一次,次数加1
if(key_nums%2==1)//第一次按下时,开关应为开,故1÷2,余数为1,故1%2==1,即if里条件为真,执行以下开语句
{
//这里放屏幕开启时的显示内容,故在此省略。
}
if(key_nums%2==0)//再一次按下按键后,key_nums即按键次数应为第2次,故2%2==0,if里语句为真,执行以下关程序。
{
delay_ms(1000);//这里延迟1s,即长按1s后再关
GPIO_ResetBits(GPIOD,GPIO_Pin_0);//设置GPIOD0口低电平,即0,因为按键低电平后才启动关,不显示任何内容。
if(key_nums>=2)//这里非常重要,要知道,按键次数是不断叠加的,这样的话运算效率就会大大降低,因此这里当按键计数>=2时,key_nums置0,即重新计数。正好满足了按键一开一关两次技术操作,执行完一开一关计数后再重新开始计数,也就是计数永远是1,2,1,2...这样循环。
{
key_nums=0;
break;
}
}
while(key);//按键松开后完成计数
}
else
break;
}
}
}