当前位置: 首页 > news >正文

按键与库函数

按键与库函数编程

  • 上一节讲的是寄存器的编程,这一节回顾一下,并补充一个按键
  • 目录

    按键与库函数编程

    一、按键的寄存器编程

    二、库函数编程

    1、寄存器工程变为库工程

    2、库函数的原理

    3、库函数的使用


一、按键的寄存器编程

  • 先看原理图

alt text

-- 知道是输入,并且选择哪种输入模式都是一样的。为什么呢?

首先,输入模式总共有四种:
上拉输入:空闲状态下(没有信号输入),增加高电平的驱动能力;
下拉输入:空闲状态下,增加低电平的驱动能力;
浮空输入:空闲状态下,不具备高低电平驱动能力,直接输入的电压进行转换;
模拟输入:检测模拟电压,数据传给ADC做转换;

alt text


  • 根据以上理解,这里将按键设置为三种输入模式均可,我们以浮空输入为例。

-- 看原理图得知控制按键的引脚

alt text

  • 然后查找手册,找到对应寄存器

-- 初始化函数,时钟和配置模式

void key_init(void)
{RCC->APB2ENR |= (0x1<<2)|(0x1<<4);//RCC->APB2ENR |= (0x1<<4);GPIOA->CRH &= ~(0xf<<0);GPIOA->CRH |=  (0x4<<0);GPIOC->CRH &= ~(0xfff<<16);GPIOC->CRH |=  (0x444<<16);
}

-- 应用函数,读取按键状态

#define key1 (GPIOA->IDR & (0x1<<0))#define key2 (GPIOC->IDR & (0x1<<4))
#define key3 (GPIOC->IDR & (0x1<<5))
#define key4 (GPIOC->IDR & (0x1<<6))//uint8_t uint16_t uint32_t int8_t int16_t int32_tuint8_t get_key(void)
{if(key1){Delay_nms(15);//延时消抖if(key1){while(key1)//等待按键抬起{}return 1;}}if(!key2){Delay_nms(15);//延时消抖if(key2){while(key2)//等待按键抬起{}return 2;}}return 0;}

二、库函数编程

1、寄存器工程变为库工程

标准库源文件(.c和.h)
将..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下的2个文件夹拷贝到工程目录下,如下: 

alt text

 -- inc --存放.h文件
-- src --存放.c文件

将..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的stm32f10x_conf.h文件夹拷贝到user目录下,如下: 

alt text

添加.c文件 

alt text

包含头文件路径 

alt text

添加使用库函数的宏定义 

alt text

2、库函数的原理

  • 库函数就是把底层寄存器配置进行封装,用户只需要根据库函数传递参数,不用理会寄存器的位置。

3、库函数的使用

  • 首先,打开stm32固件库使用手册

alt text

  • 先找到时钟(RCC) 

    alt text

alt text

  • 想快速知道他的用法,直接看例子即可 

    alt text

  • 将例子直接复制到工程中,然后修改参数即可。

  • 同样的,再去找配置GPIO的函数 

    alt text

  • 同样直接看例子 

    alt text

  • 然后在工程中改参数,初始化函数就写好了

void key_init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure = {0};						//定义结构体变量,并且将结构体变量赋初值GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 						//引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//速度GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	//浮空模式GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; 						//引脚GPIO_Init(GPIOC, &GPIO_InitStructure);//如果要将模式也改了,就直接改,不用再定义结构体变量
}
  • 下面找存放输入进MCU数据的函数 

    alt text

  • 将例子直接更改

#define key1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define key2 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)
#define key3 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)
#define key4 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)
  • 然后判断宏定义的值,即可判断按键是否按下

  • 可以参考官方示例程序,里面有很多例子,可以参考 

    alt text


http://www.mrgr.cn/news/34012.html

相关文章:

  • Transact-SQL概述(SQL Server 2022)
  • Python在AI中的应用--使用决策树进行文本分类
  • 安装MySQL驱动程序笔记二
  • 大厂最全最详细的Android面试题及答案解析(379页)免费下载
  • 数据链路层功能、组帧、流量控制与可靠传输机制
  • 【Power Compiler手册】13.UPF多电压设计实现(5)
  • 离职员工客户如何管理?解锁2024企业微信新功能
  • 全国及分(31个)省全社会就业人数(1978-2022年)
  • springboot中小学数字化教学资源管理平台
  • 【自动驾驶】决策规划算法(二)参考线模块Ⅰ| 平滑算法与二次规划
  • 红外绝缘子数据集
  • 丢失照片/消息/文件,当发现没有备份 Android 手机数据时急救方法
  • DC-2靶机详解
  • python配置国内镜像源
  • 【算法——双指针】
  • 读构建可扩展分布式系统:方法与实践12分布式数据库案例
  • vue实现数据栏无缝滚动实现方式-demo
  • Springboot 日志使用
  • Python 生态与社区动态
  • spring boot中虚拟线程性能探讨