【STM32】按键检测实验主要程序代码分析

本文介绍了一种基于STM32开发板实现按键控制LED的方法。通过编程设置GPIO口为输入模式,并使用内部上拉电阻,实现了对三个按键的状态检测。当按下不同按键时,可以切换对应的LED状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
//ALIENTEK Mini STM32 开发板范例代码 2
//按键输入实验
//技术支持: www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
	u8 t;
	delay_init(); 	//延时函数初始化
	LED_Init(); 	//初始化与 LED 连接的硬件接口
	KEY_Init(); 	//初始化与按键连接的硬件接口
	LED0 = 0; 		//点亮 LED
	while(1)
	{
		t = KEY_Scan(0); //得到键值
		switch(t)
		{
			case KEY0_PRES:	LED0 = !LED0; break;
			case KEY1_PRES:	LED1 = !LED1; break;
			case WKUP_PRES:	LED0 = !LED0; LED1 = !LED1; break;
			default:
				delay_ms(10);
		}
	}
}

key.c

#include "key.h"
#include "delay.h"
//按键初始化函数
//PA15 和 PC5 设置成输入
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);	//使能 PORTA,PORTC 时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);					//关闭 jtag,使能 SWD,可以用 SWD 模式调试
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;					//PA15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 				//设置成上拉输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//初始化 GPIOA15
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;					//PC5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 				//设置成上拉输入
	GPIO_Init(GPIOC, &GPIO_InitStructure);						//初始化 GPIOC5
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;					//PA0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 				//PA0 设置成输入,默认下拉
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//初始化 GPIOA.0
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES, KEY0 按下
//KEY1_PRES, KEY1 按下
//WKUP_PRES, WK_UP 按下
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{
	static u8 key_up=1;								//按键按松开标志
	if(mode)key_up=1; 								//支持连按
	if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
	{
		delay_ms(10);								//去抖动
		key_up=0;
		if(KEY0==0)       return KEY0_PRES;
		else if(KEY1==0)  return KEY1_PRES;
		else if(WK_UP==1) return WKUP_PRES;
	}else if(KEY0==1&&KEY1==1&&WK_UP==0) key_up=1;
	return 0;										// 无按键按下
}

key.h

#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)	//读取按键 0
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)	//读取按键 1
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)	//读取按键 2
#define KEY0_PRES 1 	//KEY0
#define KEY1_PRES 2 	//KEY1
#define WKUP_PRES 3 	//WK_UP
void KEY_Init(void);	//IO 初始化
u8 KEY_Scan(u8 mode); 	//按键扫描函数
#endif

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值