STM32F103C8T6 按键扫描输入

这篇具有很好参考价值的文章主要介绍了STM32F103C8T6 按键扫描输入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

第一章 STM32F103C8T6 点亮LED灯


文章目录

  • 系列文章目录
  • 前言
  • 一、原理
  •  1.按键类型
  •  2.按键消抖
  • 3.IO口输入配置
  • 1)模拟输出
  • 2)浮空输入模式
  • 3)下拉输入模式(PULL DOWN)
  • 4)上拉输入模式(PULL UP)
  • 二、代码部分
  • main.c
  • key.c
  • key.h
  • 总结

前言

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


一、原理

 1.按键类型

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

STM32F103C8T6 按键扫描输入

 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)模拟输出

STM32F103C8T6 按键扫描输入

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

2)浮空输入模式

 STM32F103C8T6 按键扫描输入

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

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

STM32F103C8T6 按键扫描输入                        STM32F103C8T6 按键扫描输入

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

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

STM32F103C8T6 按键扫描输入                        STM32F103C8T6 按键扫描输入

 该模式常用于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 按键输入教程,今天的分享就到这里,如有不足还望大家见谅!!!文章来源地址https://www.toymoban.com/news/detail-422060.html

到了这里,关于STM32F103C8T6 按键扫描输入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 舵机控制(STM32F103C8T6)

            本文是以 STM32F103C8T6 作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。 (一)概述         舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就

    2023年04月09日
    浏览(56)
  • 功耗测评 | STM32F103C8T6

    STM32F103C8T6 MCU越来越广泛的应用在生产生活的各个领域,外接丰富的传感器、功能模块、通信模块、显示存储等可以形成各种可样的产品项目应用。对于功耗要求比较高的产品,一般会选择STM32L系列的MCU,但是从功耗的评测角度,逻辑上是基本相似的。 在很多应用场合中都对

    2024年02月07日
    浏览(45)
  • STM32F103C8T6系统板

    1.电源部分 2.复位 3.晶振 4. 电源电路——防反接 有关二极管 漫谈二极管防电源反接电路 本次采用上图右下角的NMOS防反接电路。 电源电路——电源芯片 AMS1117是AMS公司的 ,LM1117是NS(美国国家半导体)的,LM1117要贵很多,所以一般的用AMS1117就可以了。 (以下分析参考STM32F10

    2024年02月02日
    浏览(72)
  • STM32F103C8T6串口通信

      首先来看一下需要操作的函数,以及配置的步骤: 图1                                                  图2   Code: usart.c #include \\\"usart.h\\\" void ustart_Init(void ) { GPIO_InitTypeDef GPIO_Init_Ustar ; // 定义输出端口TX的结构体对象 USART_InitTypeDef USTART_Init; // 定义串口初始化结构体对象

    2024年02月16日
    浏览(52)
  • STM32F103C8T6串口调试篇

    项目开发中,当出现bug时,由于不知道某个变量的值,所以很难定位问题,针对此问题,串口调试脱颖而出。通过串口printf()实时将需要显示的信息打印出来,这样就很方便的定位问题。 串口设置方法 1.购买调试器pwlink2。参考STM32F103C8T6程序烧录方法_stm32f103c8t6如何烧录_流

    2024年02月12日
    浏览(64)
  • stm32f103c8t6的外部中断

    在单片机中存在着中断系统,这个系统的逻辑和功能在51单片机中已经有所了解。 1.在32单片机中的内核有一个nvic 里面存放许多优先级的设定,外接许多中断源,比如“exti、tim、adc、usart等”接入之后,nvic再通过中断优先级进行排队,再内接入cpu中进行处理,这样子大大减少

    2024年02月09日
    浏览(54)
  • [STM32F103C8T6]ADC转换

    什么是ADC转换? ADC转换的全称是: Analog-to-Digital Converter ,指模拟 / 数字转换器 ADC的性能指标: ADC分辨率: SSA与VREF-一起接到地,DDA与VREF+接到3.3v,所以ADC转换的范围是0---3.3v 所以最后的ADC转换值应该是我们的测量值*分辨率    分辨率 = 3.3v/2^12 = (3.3/4096)   12位的转换器所

    2024年02月06日
    浏览(47)
  • STM32F103C8T6移植FreeRTOS

    根据自己开发板型号下载地址:STM32相关内容下载地址 SDK直接下载地址:STM32直接下载地址 下载参考博客 FreeROTS下载地址 选用V9.0.0 版本 个人创建目录如下,可做参考 keil目录 链接头文件 • 修改堆栈大小 • 修改中断函数名 去掉stm32f10x_it.c终端函数 增加FreeRTOS中断 特别解释

    2024年02月12日
    浏览(55)
  • 嵌入式硬件——stm32F103C8T6

    如下图:    处理器核心:STM32F103C8T6内置了ARM Cortex-M3处理器,这是一种高性能、低功耗的32位RISC处理器,适用于嵌入式系统。 时钟速度:它可以工作在不同的时钟速度,最高主频可达72 MHz。 存储器:包括64KB的Flash程序存储器用于存储程序代码,以及20KB的SRAM用于存储数据和

    2024年02月05日
    浏览(65)
  • 自制STM32F103C8T6最小系统板

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 记录自己绘制第一块STM32F103C8T6最小系统板,包括原理图的绘制,pcb图的绘制和布局,以及器材的选购。 提示:有任何问题和交流可以加q:2874160799, 我基本上不看评论和私信。 根据ST官方手册,查看引脚

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包