按键输入实验

该文介绍了一个使用STM32F103微控制器通过按键控制两个LED灯的状态。程序中定义了3个按键,分别连接到PE4、PE3和PA0,通过内部设置上下拉电阻进行输入控制。按键0和1低电平有效,控制LED的亮灭,按键UP高电平有效,用于状态翻转。代码主要包含初始化LED和按键的函数,以及扫描按键状态的循环逻辑。

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

功能及说明

使用按键控制LED。
通过 ALIENTEK 精英 STM32F103 上载有的 3 个按钮 KEY_UP 、 KEY0和 KEY1 )),来控制板上的 2 个 LED (DS0 和 DS1 )。KEY0控制DS0, KEY1 控制 DS1 ,按一次亮,再按一次灭 KEY0 则同时控制 DS0 和 DS1按一次,他们的状态就翻转一次。

KEY0 连接在 PE4 上、 KEY1 连 接在 PE3 上 、 KEY_UP 连接在 PA0 上。
KEY0 和 KEY1 是低电平有效的,而 KEY_UP 是高电平有效的, 并且外部都没有上下拉电阻,所以,需要在 STM32F1内部设置上下拉。

main

#include"stm32f10x.h"
#include"sys.h"
#include"key.h"
int main(void){
	
u8 key;
u8 mode;
LED_Init();
KEY_Init();
while(1)
{
	mode=1;
	key=KEY_Scan(mode);
	if(key==1)//KEY0 按下,DS0亮
	{
		DS0=!DS0;
	}
	else if(key==2)//KEY1按下
	{
		DS1=!DS1;
	}
	else if(key==3)//反转
	{
		DS0=!DS0;
		DS1=!DS1;
	}
		
	
}
}

key.h

#ifndef __KEY_H
#define __KEY_H

#include"stm32f10x.h"
#include"sys.h"



#define KEY0 PEin(4) //读取按键 0
#define KEY1 PEin(3) //读取按键 1
#define WK_UP PAin(0) //读取按键 WK_UP)

#define KEY0_PRES 1 //KEY0 按下
#define KEY1_PRES 2 //KEY1 按下
#define WKUP_PRES 3 //WK_UP 按下

#define DS0 PBout(5)//写入
#define DS1 PEout(5)



void KEY_Init(void);
void LED_Init(void);
u8 KEY_Scan(u8);

#endif

key.c

#include"key.h"
#include"stm32f10x.h"

void KEY_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;// GPIO E 3 ~4
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
    GPIO_Init(GPIOE, &GPIO_InitStructure);// 初始化 GPIOE3,4
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化 WK_UP ---->GPIOA.0
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 设置成输入,下拉
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
}

void LED_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;//初始化参数指针结构体,这个结构体中的参数是GPIO寄存器的参数
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE); //使能 PB,PE	端口时钟
    
	//给GPIO寄存器参数赋值,设置PB5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0 ---->PB.5 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出最大速度
	
    GPIO_Init(GPIOB, &GPIO_InitStructure);//给GPIOB初始化,根据设定参数配置GPIO
    GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高,置1
	
	//设置PE5,其他参数不变,只改变引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 ---->PE.5 推挽输出
    GPIO_Init (GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高,置1
}

//按键处理函数
//返回按键值
//mode:0 不支持连续按 ; 1支持连续按
//0 ,没有任何按键按下
//1 KEY0 按下
//2 KEY1 按下
//3 KEY3 按下 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))//有按键按下
	{
	   int i=0;
       for(i=0;i<10;i++);// 去抖动
       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;// 无按键按下
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值