【RP2040】香瓜树莓派RP2040之自定义的短按、双击、长按按键

本文最后修改时间:2022年09月15日 11:02

一、本节简介

本节介绍如何编写一个可以自己选择引脚的短按、双击、长按三种方式的按键驱动。

二、实验平台

1、硬件平台

1)树莓派pico开发板

①树莓派pico开发板*2

②micro usb数据线*2

2)电脑

2、软件平台

1)VS CODE

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)纠错/业务合作:897503845@qq.com

4)香瓜嵌入式之树莓派群:512598061

5)本文出处:原创连载资料《简单粗暴学树莓派》

6)完整开源资料下载地址(电脑端打开):

opengua.taobao.com

四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学树莓派》的“第一章至第二章”章节

2、在进行本文步骤前,请先实现以下章节:

1)《简单粗暴学树莓派》的《香瓜树莓派pico之新建工程》章节。

五、硬件原理图

 

也就是:。

引脚号

功能

状态变化

17

按键

按键按下之前是高电平,按下之后是低电平

六、实验步骤

1、在VS CODE工程的GUA_CODE文件夹下,添加驱动GUA_Key.c

//**********************************************************************

//name:         GUA_Key.c

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

#include "pico/stdlib.h"

#include "GUA_Key.h"

/*********************macro definition************************/

//trigger level

#define GUA_KEY_TRIGGER                         0                                

//removing jitter

#define GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT   (40000)     //10ms     

#define GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT    (40000*250) //2.5s     

#define GUA_KEY_SHORT_INTERVAL                  (10000000)  //1s

#define GUA_KEY_GET_VALUE                       gpio_get(GUA_KEY_PIN)

/*********************Internal variables************************/ 

static uint32_t sGUA_Key_DisappearsShakes_TriggerCount = 0;              //count value

//**********************************************************************

//name:         GUA_Key_Scan

//parameter:    none

//return:       GUA_KEY_STATUS_IDLE or

//              GUA_KEY_STATUS_TRIGGER_SHORT or

//              GUA_KEY_STATUS_TRIGGER_LONG or

//              GUA_KEY_STATUS_NO_LOOSEN

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

uint8_t GUA_Key_Scan(void)     

{      

  uint32_t nGUA_TimeOut = 0;   

  

  //TRIGGER

  if(GUA_KEY_GET_VALUE == GUA_KEY_TRIGGER)  

  { 

    //If the last key was a long key end, the release must be detected before the next count can begin

    if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)

    {

      return GUA_KEY_STATUS_NO_LOOSEN;

    }

    //count

    sGUA_Key_DisappearsShakes_TriggerCount++;   

   

    //Determine if the count is sufficient

    while(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT) 

    { 

      //When a release or timeout is detected, it is processed

      if((GUA_KEY_GET_VALUE != GUA_KEY_TRIGGER) || (sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)) 

      { 

        //long press 2.5S

        if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT) 

        {           

          return GUA_KEY_STATUS_TRIGGER_LONG;                          

        }                

        //short press

        else 

        {      

          //The timeout count is cleared to zero

          nGUA_TimeOut = 0;

           

          //Check whether there is a connection

          while((GUA_KEY_GET_VALUE != GUA_KEY_TRIGGER))

          {       

            //If the button is not pressed and times out, it indicates that there is only one button

            if(nGUA_TimeOut++ > GUA_KEY_SHORT_INTERVAL)

            {

              //The count is cleared to zero

              sGUA_Key_DisappearsShakes_TriggerCount = 0;

             

              return GUA_KEY_STATUS_TRIGGER_SHORT;

            }                    

          }

         

          //Determine if the count is sufficient

          while(GUA_KEY_GET_VALUE == GUA_KEY_TRIGGER)

          {

            //Start counting

            sGUA_Key_DisappearsShakes_TriggerCount++;

            //When a release or timeout is detected, it is processed

            if((GUA_KEY_GET_VALUE != GUA_KEY_TRIGGER) || (sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)) 

            {             

              //when long press 2.5S

              if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT) 

              {           

                //Clear up counter

                sGUA_Key_DisappearsShakes_TriggerCount = 0;

                return GUA_KEY_STATUS_TRIGGER_LONG;                          

              }                

              //when short press

              else 

              {   

                //Clear up counter

                sGUA_Key_DisappearsShakes_TriggerCount = 0;

               

                return GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT;                 

              } 

            }                         

          }

         

          //Clear up counter

          sGUA_Key_DisappearsShakes_TriggerCount = 0;

               

          return GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT;         

        } 

      } 

     

      //Continue counting to determine the length of the button

      sGUA_Key_DisappearsShakes_TriggerCount++;         

    }    

  } 

  //no press

  else 

  { 

    sGUA_Key_DisappearsShakes_TriggerCount = 0;  

  } 

   

  return GUA_KEY_STATUS_IDLE;   

}  

//**********************************************************************

//name:         GUA_Key_Init

//parameter:    none

//return:       none

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

void GUA_Key_Init(void)

{

  gpio_init(GUA_KEY_PIN);

  gpio_set_dir(GUA_KEY_PIN, GPIO_IN);

  gpio_pull_up(GUA_KEY_PIN);

}

2、在VS CODE工程的GUA_CODE文件夹下,添加驱动头文件GUA_Key.h

//**********************************************************************

//name:         GUA_Key.h

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

#ifndef _GUA_KEY_H_

#define _GUA_KEY_H_

/*********************macro definition************************/

#define GUA_KEY_PIN                             17      //key pin

//trigger transitions 

#define GUA_KEY_STATUS_IDLE                     0       //no press

#define GUA_KEY_STATUS_TRIGGER_SHORT            1       //short press

#define GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT     2       //double press

#define GUA_KEY_STATUS_TRIGGER_LONG             3       //long press 2.5S

#define GUA_KEY_STATUS_NO_LOOSEN                4       //no loosen

/*********************external function************************/

uint8_t GUA_Key_Scan(void); 

void GUA_Key_Init(void);

#endif

3、将新写的驱动文件新添加到可执行

4、修改main.c

//**********************************************************************

//name:         main.c

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

#include "pico/stdlib.h"

#include "GUA_Led.h"

#include "GUA_Key.h"

/*********************Internal variables************************/

/*********************Internal function************************/

static void GUA_Init(void);

//**********************************************************************

//name:         GUA_Init

//parameter:    none

//return:       none

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

static void GUA_Init(void)

{

    //LED

    GUA_Led_Init();

    GUA_Led_Set(GUA_LED_SET_LOW);

    //KEY

    GUA_Key_Init();

}

//**********************************************************************

//name:         main

//parameter:    none

//return:       none

//author:       opengua   

//changetime:   2022.09.06

//**********************************************************************

void main(void)

{

      uint8_t nGUA_Ret;

    GUA_Init();

    while(1)

    {

           //key scan

           nGUA_Ret = GUA_Key_Scan();

                           

           //If a button is pressed, deal with it

           if(nGUA_Ret == GUA_KEY_STATUS_TRIGGER_SHORT)

           {   

                 GUA_Led_Set(GUA_LED_SET_HIGH);       

                 sleep_ms(100);

                 GUA_Led_Set(GUA_LED_SET_LOW);

                 sleep_ms(100);                        

           }

           else if(nGUA_Ret == GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT)

           {   

                 GUA_Led_Set(GUA_LED_SET_HIGH);       

                 sleep_ms(100);

                 GUA_Led_Set(GUA_LED_SET_LOW);

                 sleep_ms(100);  

                 GUA_Led_Set(GUA_LED_SET_HIGH);       

                 sleep_ms(100);

                 GUA_Led_Set(GUA_LED_SET_LOW);

                 sleep_ms(100);                                               

           }

           else if(nGUA_Ret == GUA_KEY_STATUS_TRIGGER_LONG)

           {   

                 GUA_Led_Set(GUA_LED_SET_HIGH);       

                 sleep_ms(100);

                 GUA_Led_Set(GUA_LED_SET_LOW);

                 sleep_ms(100);  

                 GUA_Led_Set(GUA_LED_SET_HIGH);       

                 sleep_ms(100);

                 GUA_Led_Set(GUA_LED_SET_LOW);

                 sleep_ms(100);       

                 GUA_Led_Set(GUA_LED_SET_HIGH);       

                 sleep_ms(100);

                 GUA_Led_Set(GUA_LED_SET_LOW);

                 sleep_ms(100);                                         

           }                                

    }

}

七、实验结果

编译并仿真,设置断点分别在按键的三种情况(短按、双击、长按),

1、当短按0~3秒内1次,会被识别为短按。

2、当短按后在1秒内再次短按,则会被识别为双击。

3、当长按3秒以上(即使不松开)也会被识别为长按。

因此,实验成功。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【运维】linkis安装dss保姆级教程与踩坑实践

文章目录 一. 安装准备二. 创建用户三. 准备安装包四. 修改配置1. 修改config.sh2. 修改db.sh 五、安装和使用1. 执行安装脚本2. 启动服务3. 查看验证是否成功 六. 报错处理报错一:The user is not logged in报错二:dss接口报错报错三:执行没…

IDEA常用工具配置

IDEA常用工具&配置 如果发现插件市场用不了,可以设置Http Proxy,在该界面上点击”Check connection“并输入的地址:https://plugins.jetbrains.com/ 。 一、常用插件 1、MybatisX Mybaits Plus插件,支持java与xml互转 2、F…

TCP/IP协议组

TCP/IP通信协议是目前最完整、使用最广泛的通信协议。它的魅力在于可使不同硬件结构、不同操作系统的计算机相互通信。TCP/IP协议既可用于广域网,也可用于局域网,它是Internet/Intranet的基石。TCP/IP通信协议事实上是一组协议。 TCP/IP协议可分为5层也可…

日志系统——日志格式化模块设计

一,模块主要成员 该模块的主要作用是对日志消息进行格式化,将日志消息组织成制定格式的字符串。 该模块主要成员有两个:1.格式化字符串。 2.格式化子项数组 1.1 格式化字符串 格式化字符串的主要功能是保存日志输出的格式字符串。其格式化字…

机器学习赋能乳腺癌预测:如何使用贝叶斯分级进行精确诊断?

一、引言 乳腺癌是女性最常见的恶性肿瘤之一,也会发生在男性身上。每年全球有数百万人被诊断出乳腺癌,对患者的生活和健康造成了巨大的影响。早期的乳腺癌检测和准确的诊断对于提高治疗的成功率至关重要。然而,乳腺癌的早期诊断面临着许多挑战…

大语言模型与语义搜索;钉钉个人版启动内测,提供多项AI服务

🦉 AI新闻 🚀 钉钉个人版启动内测,提供多项AI服务 摘要:钉钉个人版正式开始内测,面向小团队、个人用户、高校大学生等人群。该版本具有AI为核心的功能,包括文生文AI、文生图AI和角色化对话等。用户可通过…

整理mongodb文档:find方法查询数据

个人博客 整理mongodb文档:find方法查询数据 求关注,求批评,求指出,如果哪儿不清晰,请指出来,谢谢 文章概叙 如题,本文讲的是如何用find查询数据,如何在数组、字段、对象中查询,以…

Git 常用操作

一、Git 常用操作 1、Git 切换分支 git checkout命令可以用于三种不同的实体:文件,commit,以及分支。checkout的意思就是对于一种实体的不同版本之间进行切换的操作。checkout一个分支,会更新当前的工作空间中的文件,…

Web菜鸟教程 - Springboot接入认证授权模块

网络安全的重要性不言而喻,如今早已不是以前随便弄个http请求就能爬到数据的时代,而作为一个架构师,网络安全必须在产品开发之初就考虑好。因为在产品开发的后期,一方面是客户增多,压力变大,可供利用的时间…

JupyterHub实战应用

一、JupyerHub jupyter notebook 是一个非常有用的工具,我们可以在浏览器中任意编辑调试我们的python代码,并且支持markdown 语法,可以说是科研利器。但是这种情况适合个人使用,也就是jupyter notebook以我们自己的主机作为服务器…

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性,从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…

容器和云原生(二):Docker容器化技术

目录 Docker容器的使用 Docker容器关键技术 Namespace Cgroups UnionFS Docker容器的使用 首先直观地了解docker如何安装使用,并快速启动mysql服务的,启动时候绑定主机上的3306端口,查找mysql容器的ip,使用mysql -h contain…

设计模式——建造者(Builder)模式

建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。建造者模式是一步一步创建一个复杂的对象,…

Python文件操作教程,Python文件操作笔记

文件的打开与关闭 想一想: 如果想用word编写一份简历,应该有哪些流程呢? 打开word软件,新建一个word文件写入个人简历信息保存文件关闭word软件 同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的…

使用 BERT 进行文本分类 (01/3)

摄影:Max Chen on Unsplash 一、说明 这是使用 BERT 语言模型的一系列文本分类演示的第一部分。以文本的分类作为例,演示它们的调用过程。 二、什么是伯特? BERT 代表 来自变压器的双向编码器表示。 首先,转换器是一种深度学习模…

【Linux命令详解 | gzip命令】 gzip命令用于压缩文件,可以显著减小文件大小

文章标题 简介一,参数列表二,使用介绍1. 基本压缩和解压2. 压缩目录3. 查看压缩文件内容4. 测试压缩文件的完整性5. 强制压缩6. 压缩级别7. 与其他命令结合使用8. 压缩多个文件9. 自动删除原文件 总结 简介 在Linux中,gzip命令是一款强大的文…

C语言笔试训练【第九天】

文章目录 👿1、下列程序的输出是( )💎2、二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为( &#xf…

交换实验一

题目 交换机上接口配置 SW1 interface GigabitEthernet0/0/1 port hybrid tagged vlan 2 port hybrid untagged vlan 3 to 6 interface Ethernet0/0/2 port hybrid pvid vlan 3 port hybrid untagged vlan 2 to 6 interface Ethernet0/0/3 port link-type access port d…

C++基础语法——继承

1.继承是什么? 继承是一种面向对象编程的概念,它允许一个类(称为子类或派生类)从另一个类(称为基类或父类)继承属性和方法。继承使得子类能够使用基类已有的代码,并且可以在此基础上进行扩展或修…

99页4万字XX大数据湖项目建设方案

导读:原文《99页4万字XX大数据湖项目建设方案》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 目 录 1.项目综述 1.1.项目背景 1.2.项目目标 1.3.项…