0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机智云Gokit3.0源代码分析之按键处理机制

9GxC_IoTMaker 来源:未知 作者:李倩 2018-07-13 14:57 次阅读

按键的实现逻辑(包括长按、短按、双击等),在交互之中的用户体验尤为重要,机智云GoKit_STM32按键的实现逻辑,在我见过的按键模块中算不错的一个了!

上期我们分享了机智云串口的环形buff,相信大家在看了思维导图之后对整个协议的结构有了很好的理解,今天我们重点分析下机智云的按键处理机制。

在主程序main.c中,我们看到有2个定义

keyTypedef_tsingleKey[2];

keysTypedef_tkeys;

这个就是按键结构体的相关定义了,我们先来看下singleKey[2],这是一个数组,类型为keyTypedef_t,我们看看具体定义:

__packed typedefstruct

{

uint8_tkeyNum;

uint32_tkeyRccPeriph;

GPIO_TypeDef *keyPort;

uint32_tkeyGpio;

gokitKeyFunction shortPress;

gokitKeyFunction longPress;

}keyTypedef_t;

结构体包括第几个按键、所属按键时钟、Port、Gpio、短按回调函数与长按回调函数,gokitKeyFunction是一个函数指针类型的定义,使用回调的好处就是一次性定义好,之后按下去所做的事情直接在回调函数中写就可以了,结构比较明了。

接下来再看看keysTypedef_t的定义

__packed typedefstruct

{

uint8_tkeyNum;

keyTypedef_t*singleKey;

}keysTypedef_t;

这个比较简单,定义了一个按键数量与 keyTypedef_t *类型的一个指针。然后我们看两者怎么联系的。

首先通过keyInitOne将按键0的相关信息定义到singleKey[0] 中,然后keys.keyNum++,之后将相关信息也定义到singleKey[1]中,之后将singleKey数组的指针赋值给 keys.singleKey ,之后通过keys就可以轻松调用2个按键的各项功能了。

在下面的keyParaInit中,实际初始化了按键IO的各项参数,最后有一个定时器的初始化函数。timer2Init();主要初始化了定时器2,从预分频与自动重装初值我们判断出定时器1ms中断一次,那么每1ms中断一次做什么呢?我们追踪到定时器2的中断函数,

我们看到,中断中只做了一件事,按键句柄,我们具体看

keyHandle((keysTypedef_t*)&keys),

首先是读取按键值,这个比较重点,也是精髓,我们进去看看,里面会对keyCountTime进行累加10次,用来消抖,确定之后去得到按键真正的值

PRESS_KEY1与PRESS_KEY2定义如下

#define PRESS_KEY1 0x01

#define PRESS_KEY2 0x02

之后返回的readKey便是按键的值,函数返回值赋给keyPress,接下来便是一个状态机。

具体的过程为:

开始keyState为0,第一个10ms进来,如果检测到keyPress!=0,证明有按键按下,将keyState状态更新为1,keyPrev = keyPress;并将keyPress赋值给上一次的按键值。下一个10ms的时候我们进去状态1的地方执行,分为2步,

1、如果当前获取到的状态与上次一样,认为按键确实按下了,将状态更新为2,同时将哪个按键以及按键按下的值赋给keyReturn,通过这个就可以明确哪个按键按下了。

2、如果当前获取到的状态与上次不一样,认为是按键抖动,不进行响应。

第三个10ms来之后,进去状态2(假如不是抖动),也是分2步

1、如果按键不等于上次的状态(按下),则认为按键松开,认为一次按下完成,状态清零,返回按键值。

2、如果状态与上次还是一样,则认为一直在按着按键,就可以做长按功能了。返回按键值。

如果进去长按了,则将状态更新为3。

第四个10ms到来之后,进去状态3,用于判断长按之后的松手状态。就不多说了。

之后,通过keyReturn & KEY_UP判断短按,keyReturn & KEY_LONG判断长按,之后通过回掉函数进去相应的函数执行,这里的一个好处就是通过指针keys就可以调用所有的回调函数指针。

好,就先分析到这里,相信大家对按键部分的代码都有一个比较详细的了解了,但还是要一个一个分析,达到为我所用的地步,方可真正学会其中的精髓。觉得好的话可以下面点赞哦,你们的点赞是我最大的动力!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3860

    浏览量

    61297
  • 源代码
    +关注

    关注

    94

    文章

    2923

    浏览量

    66048
  • 机智云
    +关注

    关注

    2

    文章

    542

    浏览量

    26216

原文标题:Gokit3.0 STM32源代码分析之四

文章出处:【微信号:IoTMaker,微信公众号:机智云开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    机智GoKit开发套件固件

    机智GoKit开发套件固件主要包含以下两个:GAgent_MX3162_B4R012S0.binGoKit_00000001_2014-10-31_v1.bin
    发表于 04-23 18:22

    GoKit试用体验】+机智GoKit开发套件学习分享1开箱图

    本帖最后由 孤雨冰狐 于 2015-6-9 10:34 编辑 机智GoKit开发套件学习分享1开箱图今天我申请的机智
    发表于 06-08 17:13

    GoKit试用体验】+机智GoKit开发套件学习分享2开发板初认识

    GoKit试用体验】+机智GoKit开发套件学习分享2开发板初认识 好长时间没有更新,被催了,实在很抱歉,不是因为不想发帖,只是我本人
    发表于 07-25 11:49

    【科技亦能传承】转赠 Gokit2.0,免费换加强版Gokit3.0

    闲置开发板已落满灰尘?舍不得扔,又不适合送友人?为何不将它赠送给需要的人呢?只要你在此帖留言,并成功赠送出去,机智将免费赠送 10 块首批限量加强版 Gokit3.0 开发板,包邮哦~活动时间
    发表于 06-21 15:25

    【万元大奖】机智智能硬件创新大赛

    。//幸运观众奖的礼物设置:机智大礼包、Gokit3.0Gokit2.0 、T恤 、GoDay入场券、数据线(其他项目)2016.08.29~2016.08.30专家评审专家评审
    发表于 07-06 13:42

    Gokit 3试用体验】(8)微信控制Gokit体验机智宠物屋

    ,而实现微信控制Gokit的二维码只有在纸字版的说明书上有,如下图所示。于是悲剧了……  经过机智网官网论坛查询资料、机智网QQ群咨询问题,最后拿到了相应的控制二维码,在Gokit S
    发表于 10-02 12:19

    重磅| Gokit1.0用户真情回馈-Gokit3.0免费兑换

    表达机智由衷的谢意,特在金秋十月送上真诚回馈:Gokit1.0用户凭Gokit1.0开发板,免费兑换Gokit3.0
    发表于 10-16 19:16

    如何使用机智开发一款智能硬件产品

    Gokit3】序列2:Gokit3介绍第3篇:【原创】【魅力Gokit3】序列3:wifi控制走起第4篇:【原创】【魅力
    发表于 12-26 15:56

    机智在Amazon Alexa平台发布Smarthome和Custom Skill,实现亚马逊Echo直接控制Gokit

    控制机智开源套件Gokit(包括Gokit2.0和Gokit3.0)!这也将意味着:随着机智
    发表于 03-31 11:54

    919创新在这里-机智GODAY2017暨机智5.0发布会

    2016年9月19日北京-MIX酒吧机智GODAY发布机智4.0和Gokit3.0第一家开在夜场里的、56万人在线观看的IoT发布会通过
    发表于 09-13 11:33

    机智2016~2017优秀项目盘点

    】之无线工业粉尘监测仪【Gokit 3】仓鼠管家和OpenHamtaro开源项目【Gokit智慧宿舍【Gokit 3】
    发表于 09-22 13:03

    Cortex-M3的异常处理机制分析

    Cortex-M3的异常处理机制分析  详细阐述CortexM3异常的分类、优先级、进入和退出,以及在CortexM3异常处理机制中使用的新技术——迟到(late?arriving)和
    发表于 03-29 15:07 1808次阅读
    Cortex-M3的异常<b class='flag-5'>处理机制</b><b class='flag-5'>分析</b>

    机智Gokit3.0源代码分析之协议结构体的定义

    这里主要定义了一些gizwits协议的下发报文标志、缓冲区、数据长度、sn、系统时间、上次上报数据的时间、重发机制定义、控制事件、WiFi状态事件、上次上报的数据、云端下发的控制报文以及WiFi状态信息这些数据的定义,这里我们重点关注几个就行了。
    的头像 发表于 07-13 14:53 4333次阅读
    <b class='flag-5'>机智</b>云<b class='flag-5'>Gokit3.0</b><b class='flag-5'>源代码</b><b class='flag-5'>分析</b>之协议结构体的定义

    基于机智Gokit3.0的智能加湿器APP控制系统

    本文选用机智Gokit3.0开发板作为核心处理器,进行整个系统的控制和工作,GoKit采用可扩展式的硬件设计方案。核心硬件是包括:功能扩展板、ESP8266 WiFi模块。使用
    的头像 发表于 03-30 19:50 446次阅读

    基于机智Gokit3.0的智能加湿器APP控制系统

    本文选用机智Gokit3.0开发板作为核心处理器,进行整个系统的控制和工作,GoKit采用可扩展式的硬件设计方案。核心硬件是包括:功能扩展板、ESP8266WiFi模块。使用
    的头像 发表于 04-07 16:07 526次阅读
    基于<b class='flag-5'>机智</b>云<b class='flag-5'>Gokit3.0</b>的智能加湿器APP控制系统