RT1064学习KEY——基于逐飞科技开源库

news/2024/7/10 22:01:17 标签: 学习, 科技, 开源

RT1064学习KEY——基于逐飞科技开源

前言

  • 逐飞科技主控板上有两个拨码开关及四个按键接口
  • 拨码开关1:使用引脚为D4
  • 拨码开关2:使用引脚为D27
  • 按键1:使用引脚为C31
  • 按键2:使用引脚为C27
  • 按键3:使用引脚为C26
  • 按键4:使用引脚为C4
  • 逐飞科技封装了按键的扫描、读取函数,使用了类似状态机的扫描方式,原理如下:
    扫描函数不断的轮询四个按键的状态,将按键状态分为:松手、消抖、短按、长按。
    当处于松手状态时: 判断当前电平是否不为默认电平,是则拿时间变量与设定的消抖时长对比,大于消抖时长则置为短按状态,反之为消抖状态;否的话无事发生;
    当为消抖状态时: 判断当前电平是否不为默认电平,是则拿时间变量与设定的消抖时长对比,大于消抖时长则置为短按状态;否的话重置为松手状态;
    当为短按状态时: 对比时间变量与最小长按时间,时间变量大于最小长按时间的话将状态置长按;同时判断当前电平是否为默认电平,是则重置为松手状态;
    当处于长按状态时: 判断当前电平是否为默认电平,是则重置为松手状态;
    扫描函数于主循环或是定时器中不断执行,需要的时候调用读取按键状态的函数即可。

API接口

void key_scanner (void);
功能:按键扫描,实现方法见前言

key_state_enum key_get_state (key_index_enum key_n);
功能:获取按键状态
参数1:按键号(KEY_1。。。)
返回值:按键状态

void key_init (uint32 period);
功能:按键初始化
参数1:按键扫面周期,及扫描几次算一次时间

gpio_level_enum switch_get_state(gpio_pin_enum pin);
功能:获取开关状态
参数1:开关引脚
返回值:开关状态(电平)

测试示例

拨码开关负责模式选择(0为模块选择,冲突情况为禁止)
模式1:
按键有效,按键1对应LED亮,按键2对应LED灭,按键3对应蜂鸣器响,按键4对应蜂鸣器停
模式2:
按键无效,LED与蜂鸣器以1S间隔闪烁(响停)在这里插入代码片

#include "zf_common_headfile.h"

#define BUZZER 	 B11
#define LED		 B9
 
int main(void)
{
    clock_init(SYSTEM_CLOCK_600M);  // 不可删除
    debug_init();                   // 调试端口初始化
	system_delay_ms(300);
    
    // 此处编写用户代码 例如外设初始化代码等
	gpio_init(B9,GPO,1,GPO_PUSH_PULL);	//设置PB9为100HZ推挽输出,默认电平为0
    gpio_init(B11,GPO,0,GPO_PUSH_PULL);	//设置PB11为100HZ推挽输出,默认电平为0
	key_init(1);
    while(1)
    {
		// 此处编写需要循环执行的代码
		key_scanner();
		if(switch_get_state(SWITCH1_PIN) == 0 && switch_get_state(SWITCH2_PIN) == 1)	//如果开关1为低电平,开关2为高电平
		{
			if(key_get_state(KEY_1) == KEY_SHORT_PRESS)			//如果按键1短按
			{
				gpio_set_level(LED,0);			//LED点亮
			}
			else if(key_get_state(KEY_2) == KEY_SHORT_PRESS)	//如果按键2短按
			{
				gpio_set_level(LED,1);			//LED熄灭
			}
			else if(key_get_state(KEY_3) == KEY_SHORT_PRESS)	//如果按键3短按
			{
				gpio_set_level(BUZZER,1);		//蜂鸣器响
			}
			else if(key_get_state(KEY_4) == KEY_SHORT_PRESS)	//如果按键4短按
			{
				gpio_set_level(BUZZER,0);		//蜂鸣器停
			}
		}
		else if(switch_get_state(SWITCH2_PIN) == 0 && switch_get_state(SWITCH1_PIN) == 1)	//如果开关1为高电平,开关2为低电平
		{
			gpio_toggle_level(B9);			//反转LED状态
			gpio_toggle_level(B11);			//反装蜂鸣器状态
			system_delay_ms(1000);			//延时一秒
		}
		else
		{
			gpio_set_level(LED,1);
			gpio_set_level(BUZZER,0);
		}
    }
}


http://www.niftyadmin.cn/n/282628.html

相关文章

[Cursor Tool] 面向编程的ChatGPT工具的入门使用指南

文章目录 0. 面向编程的ChatGPT工具的入门使用指南1. Cursor的下载和安装2. Cursor的基本功能的使用2.1 关于Cursor的Chat模式2.2 关于Cursor的Edit模式 3 关于Cursor的项目级应用4 使用Cursor帮助我们从项目的设计出发来为我们提供建议 0. 面向编程的ChatGPT工具的入门使用指南…

Tomcat如何优化?

Tomcat如何优化? 优化连接配置,我们以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客户端dns查询 参数解释: URIEncoding“UTF-8”:使得tomcat可以解析含有中文名的文件的url&…

【五一创作】【软考:软件设计师】 5 计算机组成与体系结构(三)认证技术 | 计算机可靠性

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于软考中级:软件设计师系列专栏,本专栏服务于软考中级的软件设计师考试,包括不限于知识点讲解与真题讲解两大部分,并且提供电子教材与电子版真题,关注私聊即可 …

js解答矩阵中的路径

矩阵中的路径 给定一个二维字符网格 board 和一个字符串单词 word 如果 word 存在于网格中,返回 true ;否则,返回 false 单词必须按照字母顺序,通过相邻的单元格内的字母构 成二维数组: board [[“A”,“B”,C",“E”],[“S”,“F”,“…

操作系统——死锁

一、为什么会产生死锁 (1)死锁概念: 死锁是指多个进程因为竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法推进。 (2)死锁产生的原因: 1.系统资源的竞争 2.进程推进顺序非法 二、产生…

运营商大数据是什么,是如何实现精准获客的

近年来,运营商大数据在市场之上发展迅速,各行各业的公司都在利用运营商大数据获取更加精准有效的企业信息和客户资源。例如,当企业在进行精准营销的过程之中,可以根据线索和条件快速获得更准确的客户名单,而不像传统的…

操作系统之死锁处理策略

概念 一、什么是死锁 哲学家进程问题中,都在等待另外的哲学家放弃另一只筷子,造成了都不能用餐的现象,互相等待对方的资源 二、死锁、饥饿、死循环区别 三、死锁产生的条件 1、互斥条件 只有对互斥使用的资源的争抢才能导致死锁&#xff0…

Maven项目的配置

Maven是什么?它的作用是什么? Maven是一种开源的构建工具,它可以自动化构建、测试、部署和管理Java项目。它提供了一个中心化的构建过程,包括依赖管理、项目结构管理、插件管理等,使得开发人员更方便地维护和协作应用…