系列文章目录
第一章 STM32F103C8T6 点亮LED灯
文章目录
- 系列文章目录
- 前言
- 一、原理
- 1.按键类型
- 2.按键消抖
- 3.IO口输入配置
- 1)模拟输出
- 2)浮空输入模式
- 3)下拉输入模式(PULL DOWN)
- 4)上拉输入模式(PULL UP)
- 二、代码部分
- main.c
- key.c
- key.h
- 总结
前言
上一章我们成功入门了STM32F103C8T6,今天我们来了解一下如何实现按键输入。
一、原理
1.按键类型
现在市场上大部分采用的都是这种按键按钮微动开关,这个开关使用简单、价格便宜。
2.按键消抖
因为按键按下和弹起这段时间会产生抖动现象,该现象会导致按键扫描误判。按键按下的瞬间和弹起的瞬间都会产生一个10ms的抖动时间,我们要在按键第一次判断为按下的时候,延时10ms再对它进行一下判断,如果判断结果还是为按下,我们这里认为按键此时被按下,松手检测直接用一个while循环等待既可,当松开按键,while的条件为假 退出循环。此时视为按键被松开。
3.IO口输入配置
IO口的输入模式有四种,分别为:
- GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
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;文章来源:https://www.toymoban.com/news/detail-422060.html
总结
以上就是STM32F103C8T6 按键输入教程,今天的分享就到这里,如有不足还望大家见谅!!!文章来源地址https://www.toymoban.com/news/detail-422060.html
到了这里,关于STM32F103C8T6 按键扫描输入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!