按键编程 pal库和标准库

news2024/12/23 8:53:21

按钮的电路设计

在这里插入图片描述
电路的搭建
在这里插入图片描述
原理与编程
在这里插入图片描述
创建了两个变量 用来捕捉按键的状态 先让两个变量都为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 引脚为PIN13
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟
	
	GPIOInitstruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA,&GPIOInitstruct); //对GPIOA PIN0初始化为输入上拉模式 不需要输出速度因为是输入模式 引脚为PIN0
	
	
	while(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 // 按钮松开
				{
					// ODR
					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);
					}
				}
			}
		}
	}
}

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);
	
	
	// PA0
	hButton1.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.coloradmin.cn/o/1199888.html

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

相关文章

U-Boot 图形化配置及其原理

目录 U-Boot 图形化配置体验menuconfig 图形化配置原理make menuconfig 过程分析Kconfig 语法简介 添加自定义菜单 在前两章中我们知道uboot 可以通过mx6ull_alientek_emmc_defconfig 来配置,或者通过文件mx6ull_alientek_emmc.h 来配置uboot。还有另外一种配置uboo…

理解快速排序

理解快速排序 首先了解以下快速排序 快速排序(QuickSort)是一种常用的排序算法,属于比较排序算法的一种。它是由英国计算机科学家Tony Hoare于1960年提出的,是一种分而治之(divide and conquer)的算法。 …

systemd-timesyncd

介绍 systemd-timesyncd 是一个用于跨网络同步系统时钟的守护服务。它实现了一个 SNTP 客户端。与NTP的复杂实现相比,这个服务简单的多,它只专注于从远程服务器查询然后同步到本地时钟。除非你打算为客户端提供 NTP 服务器或者连接本地硬件时钟&#xff…

Keras实现图注意力模型GAT

简介:本文实现了一个GAT图注意力机制的网络层,可以在Keras中像调用Dense网络层、Input网络层一样直接搭积木进行网络组合。 一,基本展示 如下图所示,我们输入邻接矩阵和节点特征矩阵之后,可以直接调用myGraphAttention…

第90步 深度学习图像分割:U-Net建模

基于WIN10的64位系统演示 一、写在前面 从这一期开始,我们杀个回马枪,继续学习深度学习图像分割系列,以为4090上岗了。 图像分割是计算机视觉的一个重要任务,目的是将数字图像分割成多个部分或区域,这些部分通常对应…

大话IEC104 规约

2. iec104 协议的帧结构 iec104 基于TCP/IP 传输,是一个应用层协议, 其帧结构被称为 APDU,APDU 一般由 APCI 和 ASDU组成。 2.1 APDU (Application Protocol Data Unit) APDU 被称为应用协议数据单元,也就是一个iec104 的协议帧…

详解—搜索二叉树

一.二叉搜索树 1.1概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的…

Android修行手册 - 可变参数中星号什么作用(冷知识)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

No183.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【MySQL系列】 第一章 · MySQL概述

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

Visual Studio 2019 写 Unity 脚本时,烦人又离谱的自动补全!

Visual Studio 2019 写 Unity 脚本时,逆天又离谱的自动补全! 血压高升的原因 写脚本的时候,智能提示有哪些函数可以使用,是非常棒的一件事情,有助于游戏开发者编写和检查自己的脚本代码。 但是! 我想输入…

Leetcode—2469.温度转换【简单】

2023每日刷题(二十六) Leetcode—2469.温度转换 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ double* convertTemperature(double celsius, int* returnSize) {double* ans (double *)malloc(sizeof(do…

Leetcode—107.二叉树的层序遍历II【中等】

2023每日刷题(二十七) Leetcode—107.二叉树的层序遍历II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

Radius是什么意思? 安当加密

Radius是什么意思? RADIUS(Remote Authentication Dial In User Service)是一种远程用户拨号认证系统,它由RFC 2865和RFC 2866定义,是应用最广泛的AAA(Authentication、Authorization、Accounting&#xf…

【编程语言发展史】Python的起源和发展历史

目录 Python的起源 Python的发展历史 Python的生态系统和应用领域 Python的社区和发展模式 Python的未来趋势和挑战 Python是一门广受欢迎的高级编程语言,其起源和发展历史自20世纪末至今,经历了多个版本的迭代和社区的广泛参与。以下是关于Python的…

C 语言函数

C 语言函数 在本教程中,将向您介绍C语言编程中的函数(用户定义函数和标准库函数)。此外,您还将学习为什么在编程中使用函数。 函数是执行特定任务的代码块。 假设您需要创建程序来创建一个圆并为其着色。您可以创建两个函数来解…

goroutine调度模型 调度策略

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

459. 重复的子字符串

459. 重复的子字符串 原题链接:完成情况:解题思路:参考代码:__459重复的子字符串_枚举__459重复的子字符串_字符串匹配__459重复的子字符串_KMP算法__459重复的子字符串_优化的KMP算法 错误经验吸取 原题链接: 459. …

C 用户定义函数

C 用户定义函数 在本教程中,您将借助示例学习在C语言编程中创建用户定义的函数。 函数是执行特定任务的代码块。 C允许您根据需要定义函数。这些函数称为用户定义函数。例如: 假设您需要创建一个圆并根据半径和颜色为其着色。您可以创建两个函数来解…

No182.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…