STM32F103RCT6开发板M3单片机教程04--按键检测


原画图讲解


本教程使用是(光明谷SUN_STM32mini开发板


首先了硬件连接原理,STM32F103RCT6开发板是mini最小系统板,板子在没并有按键。需要自行用面包板搭建。

硬件连接:  

PC10 -> KEY1 (MCU内部上拉) --> GND   (低电平有效)

PC11 -> KEY2(MCU内部上拉) --> GMD    (低电平有效)

程序设计

有两种方法:

方法1、不断检测引脚(PC10, PC11)电平, 当检测到引脚(PC10, PC11)为低电平时,则有按键按下;

方法2、中断检测,设置引脚(PC10, PC11)下降沿触中断,在中断函数里,判断是哪个引脚发生的中断。

现在我们用方法1,编写代码。下集我们用中断方法。

编写代码

  • 复制上节工程文件夹打开(这个方法比较方便)
  • 新建源文件key.c,添加key.c到BSP(Grounp),并编辑
    /*********************************************************************************** 文件名  :key.c* 描述    :按键扫描(系统滴答时钟SysTick实现扫描延时)* 实验平台:Sun_STM32Min系统板* 硬件连接:  PC10 -> KEY1  --> GND   *             PC11 -> KEY2 --> GMD      * 库版本  :ST_v3.5* Version    Date       Auther      Reversed History----------------------------------------------------------------------------V1.0.0    2021-11-07  Lojam Fan  Fisrt Created* (C) Sunshine Silicon Corporation
    *  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com
    *  E-Mail : fan@sunsili.com**********************************************************************************/#include "key.h"
    #include "SysTick.h"/*******************************************************************************
    * 函数名  : Key_GPIO_Config
    * 描述    : KEY IO配置
    * 输入    : 无
    * 输出    : 无
    * 返回    : 无
    * 说明    : KEY(1~2)的IO口分别是:PC10,PC11*******************************************************************************/void Key_GPIO_Config(void)
    {GPIO_InitTypeDef  GPIO_InitStructure;                                //定义一个GPIO_InitTypeDef类型的GPIO初始化结构体        RCC_APB2PeriphClockCmd(KEY_RCC, ENABLE);                        //使能GPIOA的外设时钟 GPIO_InitStructure.GPIO_Pin = KEY1 | KEY2;                        //选择要初始化的GPIOA引脚(PA15,PA14)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //设置引脚工作模式为上拉输入            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置引脚输出最大速率为50MHzGPIO_Init(KEY_PORT, &GPIO_InitStructure);                        //调用库函数中的GPIO初始化函数,初始化GPIOA中的PA15,PA14引脚
    }/*******************************************************************************
    * 函数名  : Key_Detection
    * 描述    : 按键按下检测
    * 输入    : GPIOx:按键对应的GPIO,GPIO_Pin:对应按键端口
    * 输出    : 无
    * 返回    : KEY_DOWN(0):对应按键按下,KEY_UP(1):对应按键没按下
    * 说明    : KEY(1~2)的IO口分别是:PC10,PC11*******************************************************************************/u8 Key_Down_Detection(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
    {                        if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_DOWN)        //检测是否有按键按下{Delay_nMs(10);        //延时消抖               if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_DOWN)        //检测是否有按键按下{while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_DOWN);        //等待按键释放 return KEY_DOWN;        }else{return KEY_UP;}}else{return KEY_UP;}
    }/*******************************************************************************
    * 函数名  : Key_Down_Scan
    * 描述    : 按键按下扫描
    * 输入    : 无
    * 输出    : 0:没有按键按下,1:按键按下
    * 返回    : 无
    * 说明    : KEY(1~2)的IO口分别是:PC10,PC11
    *******************************************************************************/u8 Key_Down_Scan(void)
    {u16 downflag=0;u8 value=0;downflag=GPIO_ReadInputData(KEY_PORT);if((downflag & 0x0c00) != 0x0c00)        //检测是否有按键按下{ Delay_nMs(10);        //延时消抖       downflag = GPIO_ReadInputData(KEY_PORT) & 0x0c00;        if(downflag != 0x0c00 )        //检测是否有按键按下 {if((downflag & 0x0400) == 0) value |= 0x01;if((downflag & 0x0800) == 0) value |= 0x02;    }}  return value;
    }/******************* (C) COPYRIGHT SUNSHINE SILICON  **********************************************        END OF FILE key.c        *******************/

  • 新建源文件key.h,并编辑
    /*********************************************************************************** 文件名  :led.c* 描述    :led 应用函数库         * 实验平台:Sun_STM32Min系统板* 硬件连接:  PA5 -> LED1    板子上没有 要用杜绑线外接*             PA6 -> LED2   板子上没有 要用杜绑线外接  *             PA7 -> LED3   板子上没有 要用杜绑线外接*             PA8 -> LED4   板子有直接观察* GPIO置低电平亮LED* 库版本  :ST_v3.5* Version    Date       Auther      Reversed History----------------------------------------------------------------------------V1.0.0    2021-11-07  Lojam Fan  Fisrt Created* (C) Sunshine Silicon Corporation*  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com*  E-Mail : fan@sunsili.com**********************************************************************************/#include "Led.h"/******************************************************************************** 函数名  : LED_GPIO_Config* 描述    : LED IO配置* 输入    : 无* 输出    : 无* 返回    : 无* 说明    : LED(1~4)的IO口分别是:PB5,PB6,PB7,PB8*******************************************************************************/void LED_GPIO_Config(void){GPIO_InitTypeDef  GPIO_InitStructure;                                //定义一个GPIO_InitTypeDef类型的GPIO初始化结构体RCC_APB2PeriphClockCmd(LED_RCC, ENABLE);                        //使能GPIOB的外设时钟        GPIO_InitStructure.GPIO_Pin = LED_ALL;                                //选择要初始化的GPIOB引脚(PB5,PB6,PB7,PB8)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //设置引脚工作模式为通用推挽输出                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置引脚输出最大速率为50MHzGPIO_Init(LED_PORT, &GPIO_InitStructure);                        //调用库函数中的GPIO初始化函数,初始化GPIOB中的PB5,PB6,PB7,PB8引脚LED_ALL_OFF();                                                                                //关闭ALL_LED                                          }/*点亮LED1.PA5*/void LED1_ON(void){GPIO_ResetBits(LED_PORT,LED1);}/*关闭LED1.PA5*/void LED1_OFF(void){GPIO_SetBits(LED_PORT,LED1);}/*点亮LED2.PA6*/void LED2_ON(void)  {GPIO_ResetBits(LED_PORT,LED2);}/*关闭LED2.PA6*/void LED2_OFF(void){GPIO_SetBits(LED_PORT,LED2);}/*点亮LED3.PA7*/void LED3_ON(void)   {GPIO_ResetBits(LED_PORT,LED3);}/*关闭LED3.PA7*/void LED3_OFF(void)  {GPIO_SetBits(LED_PORT,LED3);}/*点亮LED4.PA8*/void LED4_ON(void){GPIO_ResetBits(LED_PORT,LED4);}/*关闭LED4.PA8*/void LED4_OFF(void){GPIO_SetBits(LED_PORT,LED4);}/*点亮ALL_LED*/void LED_ALL_ON(void){GPIO_ResetBits(LED_PORT,LED_ALL);}/*关闭ALL_LED*/void LED_ALL_OFF(void)  {GPIO_SetBits(LED_PORT,LED_ALL);}/******************* (C) COPYRIGHT SUNSHINE SILICON  **********************************************        END OF FILE led.c        *******************/

  • 编辑main.c
    /*********************************************************************************** Sun STM32 mini Demo*   DescriptionUart Demo* Version    Date       Auther      Reversed History----------------------------------------------------------------------------V1.0.0    2021-11-07  Lojam Fan  Fisrt Created* (C) Sunshine Silicon Corporation*  Website: http://www.sunsili.com  http://sunsili.taobao.com http://bbs.sunsili.com*  E-Mail : fan@sunsili.com**********************************************************************************/#include "stm32f10x.h"#include "usart.h"#include "SysTick.h"#include "led.h"#include "key.h"#include <stdio.h>extern vu8 Usart1_R_Buff[USART1_REC_MAXLEN];        //串口1数据接收缓冲区extern vu8 Usart1_R_State;                                                //串口1接收状态extern vu16 Usart1_R_Count;                                                //当前接收数据的字节数         /******************************************************************************** 函数名  : main* 描述    : 主函数,用户程序从main函数开始运行* 输入    : 无* 输出    : 无* 返回值  : int:返回值为一个16位整形数* 说明    : 无*******************************************************************************/int main(void){u8 keyVal;SysTick_Init_Config();USART1_Init_Config(115200);//USART1初始化配置LED_GPIO_Config();Key_GPIO_Config();printf ("*===================================================*\n");printf ("*  *  Name: Sun STM32 mini Demo Code.    *************\n");printf ("*  * (C) Sunshine Silicon Corporation    *************\n");printf ("*  *  Website: http://www.sunsili.com    *************\n");printf ("*  *   E-Mail : fan@sunsili.com          *************\n");printf ("*===================================================*\n");printf ("* Sun STM32 mini Key Demo code .*\n");while (1){keyVal = Key_Down_Scan();if(Usart1_R_State == 1)//一帧数据接收完成{USART1_SendData((u8 *)Usart1_R_Buff, Usart1_R_Count);   //USART1发送数据缓冲区数据(发送刚接收完成的一帧数据)Usart1_R_State =0;Usart1_R_Count =0;}if(keyVal){printf("KeyVal:%d\r", keyVal);if(keyVal & 0x01) LED3_ON();            else if(keyVal & 0x02) LED4_ON();            }else LED_ALL_OFF();}}/******************* (C) COPYRIGHT SUNSHINE SILICON  **********************************************        END OF FILE main.c        *******************/

  • 编译调试

     方法不再重复,经过前两节练习,大家应该是会了.
     连接串口打印,输出按键值。按下按键对应灯会亮。

查看原文,可以下载工程源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql原理--InnoDB的表空间

1.概述 通过前边儿的内容大家知道&#xff0c; 表空间 是一个抽象的概念。 对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为 表名.ibd 的实际文件。可以把表空间想象成被切分为许许…

当OneNote不同步时,你需要做些什么让其恢复在线

OneNote笔记本无法同步的原因有很多。由于OneNote使用OneDrive将笔记本存储在云中,因此可能会出现互联网连接问题,与多人联机处理笔记本时会出现延迟,以及从不同设备处理同一笔记本时会发生延迟。以下是OneNote不同步时的操作。 注意:本文中的说明适用于OneNote for Windo…

急速上手搭建单节点 k8s集群实战

Minikube搭建 是一种轻量化的Kubernetes集群&#xff0c;是k8s社区为了帮助开发者和学习者能够更好学习和体验k8s功能而推出的&#xff0c;使用个人PC的虚拟化环境就快速构建启动单节点k8s机器准备&#xff1a;阿里云 CentOS 7.x &#xff0c;2核4g 安装 安装Docker # 1.先…

flask简单应用-1

目标&#xff1a; 做一个搜索网页&#xff0c;搜索当前路径下是否含有指定关键字的文件&#xff0c;如果有就列出来&#xff0c;没有返回消息 第一步&#xff1a;我们需要先显示一个搜索页面&#xff0c;页面上需要有一个可以输入的对话框&#xff0c;一个按钮执行搜索 建立ht…

nm命令使用详解,让你加快学习速度

nm 命令详解 符号是每个ELF文件的一个重要部分&#xff0c;因为它保存了程序实现或使用的所有(全局)变量和函数。符号表中保存了查找程序符号、为符号赋值、重定位符号所需要的全部信息。Linux中 nm用来列出目标文件的符号表;如果nm指令没有指出目标文件&#xff0c;则nm假定目…

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目&#xff0c;本来不管作者事儿的&#xff0c;但是后来听到说是室友去网上找人花了80块买了个劣质的&#xff0c;不仅是从CSDN上抄的&#xff0c;而且使用的板子还不符合室友的要求。可叹作者心软啊&#xff0c;顺便给室友做了。 在代码实现部分会给出设…

智能优化算法应用:基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.纵横交叉算法4.实验参数设定5.算法结果6.…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI&#xff0c;是一种由人制造出来的机器&#xff0c;该机器可以模仿人的思想和行为&#xff0c;从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括&#xff1a;芯片、大数据、算法系统、网络等多项基础…

【Gradle】创建第一个项目

文章目录 1. 前提2. 创建项目并初始化1&#xff09;创建项目2&#xff09;初始化项目 3. 介绍生成的文件结构4. 执行5. 包的作成 &#xff08;非必须&#xff09;6. 推送&#xff08;非必须&#xff09; 本节将继 Gradle 之初体验 安装之后&#xff0c;创建第一个 Hello World…

C++计算(a+b)*(c-b)的值 2023年9月c++一级 电子学会中小学生软件编程C++等级考试一级真题答案解析

目录 C计算(ab)*(c-b)的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C计算(ab)*(c-b)的值 2023年9月 C编程等级考试一级编程题 一、题目要求 1、编程实现 给定3个整数a、b、c&#xff0c;计算表达…

[Android] ubuntu虚拟机上搭建 Waydroid 环境

1.安装虚拟机 略 2.安装waydroid Ubuntu/Debian and derivatives For Droidian and Ubuntu Touch, skip directly to the last step Install pre-requisites sudo apt install curl ca-certificates -y Add the official repository curl https://repo.waydro.id | sudo…

晚期食管癌肿瘤治疗线程分类

文章目录 1、肿瘤治疗的线数1.1 基础概念1.2 线程定义1.3 如何计算治疗线数 2 食管癌治疗指南2.1 食管癌诊疗指南2.1 CSCO 本文前半部分主要来源于参考文件1&#xff0c;其余部分来源于官方指南。无原创内容&#xff0c;全部为摘要。 1、肿瘤治疗的线数 1.1 基础概念 抗肿瘤药…

3 - Electron BrowserWindow对象 关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

GZ015 机器人系统集成应用技术样题5-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题5 选手须知&#xff1a; 本任务书共 24页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表 剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表解法1&#xff1a;中序遍历 - 递归解法2&#xff1a;中序遍历 - 迭代 剑指 Offer&#xff08;第2版&am…

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

【CMU 15-445】Lecture 12: Query Execution I 学习笔记

Query Execution I Processing ModelsIterator ModelMaterialization ModelVectorization Model Access MethodsSequential ScanIndex Scan Modification QueriesHalloween Problem 本节课主要介绍SQL语句执行的相关机制。 Processing Models 首先是处理模型&#xff0c;它定义…

基于JAVA+SpringBoot+Vue的前后端分离的学校请假管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 系统分为四个角色&…

机器学习 | 决策树 Decision Tree

—— 分而治之&#xff0c;逐个击破 把特征空间划分区域 每个区域拟合简单模型 分级分类决策 1、核心思想和原理 举例&#xff1a; 特征选择、节点分类、阈值确定 2、信息嫡 熵本身代表不确定性&#xff0c;是不确定性的一种度量。 熵越大&#xff0c;不确定性越高&#xff0c;…

MIT6.S081-实验准备

实验全程在Vmware虚拟机 (镜像&#xff1a;Ubuntu-20.04-beta-desktop-amd64) 中进行 一、版本控制 1.1 将mit的实验代码克隆到本地 git clone git://g.csail.mit.edu/xv6-labs-2020 1.2 修改本地git配置文件 创建github仓库&#xff0c;记录仓库地址 我的仓库地址就是htt…