按键编程 pal库和标准库

按钮的电路设计

在这里插入图片描述
电路的搭建
在这里插入图片描述
原理与编程
在这里插入图片描述
创建了两个变量 用来捕捉按键的状态 先让两个变量都为1 previous和current都为1 (按键没按下) 然后让current去捕捉按键的状态通过读gpioA的pin0 如果为0就是按键按下 如果为1就是按键没按下 然后赋值给current 如果current和previous相等就是按键没按下 如果相等就是按键按下了 那要在按键按下的瞬间改变LED的亮灭状态 即按键松开瞬间(在之前按键已经按下)if语句嵌套 第二个if为按键松开瞬间改变LED的亮灭状态
按键按下就亮 按键松开就熄灭

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{GPIO_InitTypeDef GPIOInitstruct;uint8_t current = Bit_SET;uint8_t previous = Bit_SET;//创建两个变量来捕捉按键状态PAL_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC的时钟GPIOInitstruct.GPIO_Pin = GPIO_Pin_13;GPIOInitstruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIOInitstruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC,&GPIOInitstruct);//对GPIOC PIN13初始化为输出开漏模式 输出速度为2mhz 引脚为PIN13RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟GPIOInitstruct.GPIO_Pin = GPIO_Pin_0;GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIOInitstruct); //对GPIOA PIN0初始化为输入上拉模式 不需要输出速度因为是输入模式 引脚为PIN0while(1){if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==Bit_RESET){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}else{GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}}}
while(1)//按键按下就翻转一次led的电平{previous = current;current = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);if(current!=previous){if(current == previous)//按钮按下{}else//按钮松开{if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)==Bit_RESET){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}else{GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}}
while(1)//加入了消抖{previous = current; current = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);if(current != previous){PAL_Delay(10);current = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);if(current != previous){if(current == Bit_RESET) // 按钮按下{}else // 按钮松开{// ODRif(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET){GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);}else{GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);}}}}}
}

PAL库的按钮驱动

按键驱动介绍 引用头文件
在这里插入图片描述
声明句柄 句柄是啥?
在这里插入图片描述
句柄就是一种数据结构 编程就为数据结构+算法 数据结构就是数据 算法就是对数据结构里的数据进行操作 如茶壶 首先定义一个结构体用来存放茶壶的一些数据 (容量和水量)
第一个函数(对数据进行操作的方法)就是初始化一个茶壶 第二个函数就是完成倒入茶壶水 第三个函数就是从茶壶里倒出水

对按钮的编程也是数据结构+算法的方法 声明一个结构体 填表在这里插入图片描述
PAL库把初始化和按键按下封装
出现了回调函数
在这里插入图片描述

#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_button.h"PalButton_HandleTypeDef hButton1;//声明句柄static void OnButton1Released(void){if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == Bit_SET){GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);}else{GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);}//P13亮灭切换的代码}
int main(void)
{GPIO_InitTypeDef GPIOInitStruct;PAL_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIOInitStruct);// PA0hButton1.Init.GPIOx = GPIOA;hButton1.Init.GPIO_Pin = GPIO_Pin_0;hButton1.Init.Button_Mode = Button_Mode_IPU;hButton1.Init.ButtonReleasedCallback = OnButton1Released;PAL_Button_Init(&hButton1);while(1){PAL_Button_Proc(&hButton1);//检测按键是否按下 如果按下就执行回调函数}
}

升级版 点击左侧的按钮点亮 点击右边的按钮熄灭

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

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

相关文章

将 Ordinals 与比特币智能合约集成:第 4 部分

控制 BSV-20 代币的分配 在上一篇文章中,我们展示了智能合约可以在铸造后控制 BSV-20 代币的转移。 今天,我们演示如何控制此类代币的分发/发行。 无Tick模式 BSV-20 在 V2 中引入了无Tick模式,并采用了与 V1 不同的方法。 部署 (Deploy) …

ENVI IDL:如何将txt文本文件转化为GeoTIFF文件?

01 前言 此处的文本文件形式如下: 里面包含了众多点位信息(不是站点数据),我们需要依据上述点的经纬度信息放到对应位置的像素点位置,放置完后如下: 可以发现,还存在部分缺失值,我们…

【强化学习】18 —— SAC( Soft Actor-Critic)

文章目录 前言最大熵强化学习不同动作空间下的最大熵强化学习基于能量的模型软价值函数最大熵策略 Soft Q-learningSoft Q-IterationSoft Q-Learning近似采样与SVGD伪代码 Soft Actor-Critic伪代码代码实践连续动作空间离散动作空间 参考与推荐 前言 之前的章节提到过在线策略…

基于STC12C5A60S2系列1T 8051单片机串口通信信应用

基于STC12C5A60S2系列1T 8051单片机串口通信应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器列表基于STC12C5A60S2系列1T 8051单片…

冯·诺依曼结构

一、约翰冯诺依曼---计算机之父 约翰冯诺依曼(John von Neumann,1903年12月28日—1957年2月8日),出生于匈牙利布达佩斯,匈牙利裔美籍数学家、计算机科学家、物理学家和化学家,美国国家科学院院士&#xff…

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发004:游戏核心消息处理 - 玩家类的实现

文章目录 0 代码仓库1 需求2 AOI设计2.1 AOI算法简介2.2 AOI数据结构及实现2.2.1 玩家2.2.2 网格对象2.2.3 游戏世界矩形2.2.4 获取周围玩家的实现2.2.5 代码测试 2.3 GameRole结合AOI创建玩家2.3.1 创建游戏世界全局对象-GameRole继承AOIWorld的Player2.3.2 把玩家到游戏世界的…

C#中基于.NET6的动态编译技术

前几天要解决动态计算问题,尝试着使用了不同的方法。问题是给定一个包含计算的字符串,在程序运行中得到计算结果,当时考虑了动态编译,在网上查了一些资料完成了这项功能,可是基于不同的.NET平台使用的编程代码相差比较…

人工智能基础——图像认知与OpenCV

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

goroutine调度模型 调度策略

文章目录 背景 协程线程与协程的对比线程(Thread)协程(Coroutine) 运作线程模型 goroutine调度模型与演进过程G-M模型G-P-M模型抢占式调度器其他优化 调度策略队列轮转系统调用工作量窃取抢占式调度GOMAXPROCS 对性能的影响 Go在语…

MySQL:日志系统

目录 概述错误日志(error log)慢查询日志(slow query log)一般查询日志( general log )中继日志(relay log)Buffer Pool 缓存回滚日志(undo log)概述undo log 作用undo log 的存储机制Undo log …

开发者测试2023省赛--Square测试用例

测试结果 官方提交结果 EclEmma PITest 被测文件 [1/7] Square.java /*** This class implements the Square block cipher.** <P>* <b>References</b>** <P>* The Square algorithm was developed by <a href="mailto:Daemen.J@banksys.co…

Linux--vim

一、vim的基础介绍 vim是一个老式的文字处理工具&#xff0c;但是功能很齐全&#xff0c;不仅是文本处理工具&#xff0c;还是一个程序编辑工具&#xff0c;包含了很多额外的功能 为什么Linux使用vim&#xff1f; ①所有类Unix系统都内置vi&#xff0c;而vim相当于是vi的升级版…