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

news2024/9/9 0:34:29

本文最后修改时间: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秒以上(即使不松开)也会被识别为长按。

因此,实验成功。

 

 

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

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

相关文章

【数据结构】 List与顺序表及接口的实现

文章目录 什么是List常见接口介绍线性表顺序表顺序表接口的实现add在末尾新增元素在 pos 位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元素设为 value删除第一次出现的关键字key获取顺序表的长度清空顺序表 顺序表的优缺点优点&am…

网络通信原理UDP协议(第五十课)

UDP协议:用户数据包协议,无连接、不可靠,效率高 字段长度描述Source Port2字节标识哪个应用程序发送(发送进程)。Destination Port2字节标识哪个应用程序接收(接收进程)。Length2字节UDP首部加上UDP数据的字节数,最小为8。Checksum2字节覆盖UDP首部和UDP数据,是可…

网络通信原理TCP的四次断开连接(第四十九课)

FIN:发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 序列号为X ACK :确认号 。 …

【操作系统】24王道考研笔记——第二章 进程与线程

第二章 进程与线程 一、进程与线程 1.进程的概念 程序:是静态的,就是个存放在磁盘里的可执行文件,如:QQ.exe。 进程:是动态的,是程序的一次执行过程,如:可同时启动多次QQ程序 引…

stable diffusion基础

整合包下载:秋叶大佬 【AI绘画8月最新】Stable Diffusion整合包v4.2发布! 参照:基础04】目前全网最贴心的Lora基础知识教程! VAE 作用:滤镜微调 VAE下载地址:C站(https://civitai.com/models…

目录扫描工具—dirsearch使用指南

一:工具简介 dirsearch是一个基于Python3的命令行工具,旨在对web服务器中的目录和文件进行暴力破解,既暴力扫描页面结构,包括网页中的目录和文件。 下载地址: 1: https://github.com/maurosoria/dirsear…

2023河南萌新联赛第(六)场:河南理工大学-L 阴晴不定的大橘学长

2023河南萌新联赛第(六)场:河南理工大学-L 阴晴不定的大橘学长 https://ac.nowcoder.com/acm/contest/63602/L?&headNavacm 文章目录 2023河南萌新联赛第(六)场:河南理工大学-L 阴晴不定的大橘学长题…

【RP2040】香瓜树莓派RP2040之仿真调试

本文最后修改时间:2022年08月23日 01:57 一、本节简介 本节以树莓派pico开发板为例,介绍如何使用一个pico作为仿真器,给另一个pico仿真调试代码。 二、实验平台 1、硬件平台 1)树莓派pico开发板 ①树莓派pico开发板*2 ②micr…

网络通信原理传输层TCP三次建立连接(第四十八课)

ACK :确认号 。 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。确认号X+1SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的…

使用 Ansible Galaxy 安装角色

使用 Ansible Galaxy 安装角色 使用 Ansible Galaxy 和要求文件 /home/curtis/ansible/roles/requirements.yml 。从以下 URL 下载角色并安装到 /home/curtis/ansible/roles : http://rhgls.area12.example.com/materials/haproxy.tar 此角色的名称应当为 balancer …

layui下拉框select 弹出层在最外层

出现问题如图所示 想要的效果是如下 这样的效果只需一行代码就能解决 .layui-layer-page .layui-layer-content{overflow: visible!important;}

生信豆芽菜-差异基因富集分析

网址:http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析,注意这个的关键基因集可以是差异基因,WGCNA的module基因,也可以是表型相关的基因集 1、数据准备 准备一个基因…

关于统一事件管理,一定有你想知道的(二)

本文部分内容来源于布博士----擎创科技资深产品专家 哈喽~又见面啦~ 上期内容我们说到了事件以及事件管理,戳这里一键恢复上期精彩内容:关于统一事件管理,一定有你想知道的(一) 这期主要带大家看看事件管理是怎么运用…

spring官方文档浅翻译(1)

文章目录 IOC容器IOC容器和beans的介绍实例化 BeanBeanFactory:ApplicationContext 容器概述配置元数据实例化容器组合基于xml的配置元数据使用容器 bean的概述命名bean别名的使用 实例化bean构造函数实例化静态工厂实例化实例工厂方法bean 在运行时的实际类型 依赖…

学习笔记|基于Delay实现的LED闪烁|模块化编程|SOS求救灯光|STC32G单片机视频开发教程(冲哥)|第八集:实现LED闪烁(下)

文章目录 2 函数的使用1.函数定义(需要带类型)2.函数声明(需要带类型)3.函数调用 3 新建文件,使用模块化编程新建xxx.c和xxx.h文件xxx.h格式:调用头文件验证代码调用:完整的文件结构如下&#x…

使用 RHEL 系统角色

使用 RHEL 系统角色 安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook /home/curtis/ansible/selinux.yml : 在所有受管节点上运行 使用 selinux 角色 将角色配置为以强制执行状态使用SELinux yum install rhel-system-roles.noarch su - curti…

七夕送礼指南:这几款礼物不仅颜值高而且非常实用

七夕又被称为“乞巧节”,相传这一天是牛郎织女一年一度的相会日,所以在这个浪漫的节日里,很有多的恋人也会不远万里来相见,在这个浪漫的日子里,送礼物是表达心意和爱意的重要方式,那么,面对琳琅…

前端练手小项目--自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求,是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性,难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

element+vue 表格行拖拽功能

解决方案 使用 sortable.js 步骤一&#xff1a; 安装 npm install vuedraggable步骤二&#xff1a;引入 import Sortable from sortablejs;步骤三&#xff1a; el-table 添加row-key属性&#xff0c;外层包一层 sortableDiv <div class"sortableDiv"> 拖…

IDEA【java.sql.SQLSyntaxErrorException: ORA-00904: “P“.“PRJ_NO“: 标识符无效】

IDEA报错如下&#xff1a; 2023-08-17 11:26:15.535 ERROR [egrant-biz,b48324d82fe23753,b48324d82fe23753,true] 24108 --- [ XNIO-1 task-1] c.i.c.l.c.RestExceptionController : 服务器异常org.springframework.jdbc.BadSqlGrammarException: ### Error queryin…