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,一经查实,立即删除!

相关文章

【PostgreSQL】从零开始:(十一)PostgreSQL-Dropdb命令删除数据库

dropdb命令删除数据库 命令 [postgrespostgre-sql bin]$ dropdb --help dropdb removes a PostgreSQL database.Usage:dropdb [OPTION]... DBNAMEOptions:-e, --echo show the commands being sent to the server-f, --force try to terminate …

mysql原理--InnoDB的表空间

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

C#基础知识 - 操作数与运算符篇2

C#基础知识 - 操作数与运算符篇 4.2 运算符4.2.1 按操作数个数分类4.2.2 按运算类型分类4.2.3 对运算符 、-- 的使用4.2.4 关系运算符&#xff1a;>、 < 、> 、<、 ! 、4.2.5 逻辑运算符&#xff1a;&& || ! ^ & |4.2.6 位运算符&#xff1a;~ 、^、 &…

neuq-acm预备队训练week 10周报

neuq-acm预备队训练week 10 P1525 [NOIP2010 提高组] 关押罪犯-CSDN博客 neuq-acm预备队训练week 10 P3386 【模板】二分图最大匹配-CSDN博客 neuq-acm预备队训练week 10 P1129 [ZJOI2007] 矩阵游戏-CSDN博客

2020-XNUCA babyv8

做的第一道存在指针压缩机制的V8题&#xff0c;通过小越界写修改length构造大越界读写&#xff0c;然后利用arraybuffer的backing store构造任意地址写&#xff0c;利用wasm rwx段地址的特点以及堆空间的分布&#xff0c;搜索到rwx段的具体地址&#xff0c;然后利用任意地址写将…

掌握分片上传:优化大文件传输的关键策略 【C++】【WinHttp】【curl】

目录 引言 第一部分&#xff1a;分片上传的基本概念 1. 分片上传以及它的工作原理 2. 为什么选择分片上传 第二部分&#xff1a;实现分片上传的关键步骤 1. 文件分片的方法&#xff0c;如何选择合适的分片大小 文件分片的基本步骤&#xff1a; 如何选择合适的分片大小&a…

Leetcode 2966. Divide Array Into Arrays With Max Difference

Leetcode 2966. Divide Array Into Arrays With Max Difference 1. 解题思路2. 代码实现 题目链接&#xff1a;2966. Divide Array Into Arrays With Max Difference 1. 解题思路 这一题思路上来说其实很简单&#xff0c;想清楚这个问题必然是有序排列之后三个三个组成一组即…

当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…

通过GIT将本地项目上传到gitee

1.git init 2.复制仓库地址&#xff08;默认的HTTPS就可以&#xff09; 3. 本地仓库与远程仓库建立连接 4. git remote add origin 远程仓库地址 5. 将远程仓库的文件拉到本地仓库中 git pull origin master6.将本地文件上传到本地仓库&#xff08;全部&#xff09; git add …

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

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

极简的wrk安装和使用教程

什么是wrk?它有什么优劣势&#xff1f; wrk 是一款针对 Http 协议的基准测试工具&#xff0c;它能够在单机多核 CPU 的条件下&#xff0c;使用系统自带的高性能 I/O 机制&#xff0c;如 epoll&#xff0c;kqueue 等&#xff0c;通过多线程和事件模式&#xff0c;对目标机器产…

【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 基础概念 抗肿瘤药…