STM32F103C8T6 按键扫描输入

系列文章目录

第一章 STM32F103C8T6 点亮LED灯


文章目录


前言

        上一章我们成功入门了STM32F103C8T6,今天我们来了解一下如何实现按键输入。


一、原理

 1.按键类型

        现在市场上大部分采用的都是这种按键按钮微动开关这个开关使用简单、价格便宜。

 2.按键消抖

        因为按键按下和弹起这段时间会产生抖动现象,该现象会导致按键扫描误判。按键按下的瞬间弹起的瞬间都会产生一个10ms的抖动时间,我们要在按键第一次判断为按下的时候,延时10ms再对它进行一下判断,如果判断结果还是为按下,我们这里认为按键此时被按下,松手检测直接用一个while循环等待既可,当松开按键,while的条件为假 退出循环。此时视为按键被松开。

3.IO口输入配置

IO口的输入模式有四种,分别为:

  1. GPIO_Mode_AIN = 0x0, // 模拟输入
  2. GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入

  3. GPIO_Mode_IPD = 0x28, // 下拉输入

  4. GPIO_Mode_IPU = 0x48, // 上拉输入

1)模拟输出

该模式,常作为单片机ADC电压采集。

2)浮空输入模式

 

 浮空顾名思义就是将IO口浮空,既不接VCC也不接GND。他的采集到的电平高/低 取决于 外接元器件的输入电平。

3)下拉输入模式(PULL DOWN)

                        

该模式常用于IO口一段接VCC的情况下(右图所示)。下方开关开启,将电压拉低到GND,同时电阻具有过流保护作用。

4)上拉输入模式(PULL UP)

                        

 该模式常用于IO口一段接GND的情况下(右图所示)。上方开关开启,将电压拉高至VCC,同时电阻具有过流保护作用。

二、代码部分

main.c

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"


void Device_Init(void)		//初始化 外设
{
	delay_init();				//初始化 延时
	
	LED_Config();				//初始化 LED
	
    key_Config();               //初始化 主控按键
	
	delay_ms(10);
}


int main(void)
{
	Device_Init();
	
	while(1)
	{
		key_function();
	}
}

key.c

#include "key.h"


void key_Config(void)			//配置 主控按键
{
	GPIO_InitTypeDef KEY_Pin;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	KEY_Pin.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//浮空 输入
	KEY_Pin.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
	KEY_Pin.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOA,&KEY_Pin);
}


/*
*@ Description: 按键 扫描
* @param 1 – mode:0(单击模式)/ 1(连按模式)
* @return – 返回值:按键 反馈数值
*/
u8 KEY_Scanf(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY_1==0||KEY_2==0||KEY_3==0))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY_1==0)return KEY1_PRES;
		else if(KEY_2==0)return KEY2_PRES;
		else if(KEY_3==0)return KEY3_PRES;
	}else if(KEY_1==1&&KEY_2==1&&KEY_3==1)key_up=1; 	    
 	return 0;// 无按键按下
}


void key_function(void)				//按键 功能
{
	static u8 key = 0;
	key = KEY_Scan(0);
	switch(key){
		case 1:            //LED2:亮
			LED_2 = 0;
			break;
		case 2:            //LED2:灭
			LED_2 = 1;
			break;        
		case 3:            //LED2:当前状态取反
			LED_2 = ~LED_2;
			break;
	}
}

key.h

#ifndef __key_h
#define __key_h


#include  "stm32f10x.h"
#include  "delay.h"
#include  "LED.h"


//按键 状态
#define  KEY_1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

#define  KEY_2  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)

#define  KEY_3  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)


//返回值 
#define KEY1_PRES 	1	//KEY0按下

#define KEY2_PRES	  2	//KEY1按下

#define KEY3_PRES   3	//KEY3按下


//函数 声明
void key_Config(void);			//配置 主控按键

u8 KEY_Scanf(u8 mode);			//按键 扫描

void key_function(void);		//按键 功能


#endif

注意:这里的三个主控按键是外接按键,因为我的开发板只有一个按键。 板子上的按键IO口是PA0;


总结

以上就是STM32F103C8T6 按键输入教程,今天的分享就到这里,如有不足还望大家见谅!!!

  • 17
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于STM32F103C8T6微控制器的按键扫描,您可以使用以下步骤进行操作: 1. 配置按键引脚:选择要用作按键的引脚,并将其配置为输入模式。您可以使用STM32的寄存器和库函数来完成此操作。 2. 初始化GPIO:根据您选择的引脚,使用相应的寄存器和库函数对GPIO进行初始化。确保将引脚配置为输入模式。 3. 扫描按键状态:在主循环中,通过读取引脚的状态来扫描按键。如果检测到按键按下或释放,您可以执行相应的操作。 以下是一个简单的示例代码,演示如何进行按键扫描: ```c #include "stm32f10x.h" #define BUTTON_PIN GPIO_Pin_0 #define BUTTON_PORT GPIOA void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = BUTTON_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUTTON_PORT, &GPIO_InitStructure); } int main(void) { GPIO_Configuration(); while (1) { if (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == Bit_RESET) { // 按钮按下 // 执行相应的操作 } else { // 按钮释放 // 执行相应的操作 } } } ``` 在上面的示例代码中,我们将PA0引脚配置为输入上拉模式。在主循环中,我们不断读取PA0引脚的状态。如果引脚为低电平(按键按下),则执行相应操作;否则,执行其他操作。 请注意,这只是一个简单的示例代码,您可能需要根据您的具体需求进行修改。希望对您有帮助!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值