在正常0.5s内无按键操作为启始按键扫描条件下,扫描按键将产生以下3种按键事件:
1。长按事件:任何1次出现的长按操作都属于长按事件
2。单击事件:1次短按操作后,间隔2s内没有短按操作
3。双击事件:2次短按操作间隔时间<2s,则2次短按操作为1次双击事件,且2次短按都取消

对于应广单片机来说,首先就是定时器和IO口的配置

void IO_Init(void)
{//----------------------------PA       =  0b1111_1111;PAC     =  0b1111_1111;    //1:输出   0:输入PAPH   =  0b0000_0000;    //1:加上拉 0:不加上拉PAPL  =  0b0000_0000;    //1:加下拉 0:不加下拉PB        =  0b1111_1110;PBC     =  0b1111_1110;PBPH    =  0b0000_0001;PBPL    =  0b0000_0000;PADIER  =  0b0000_0000;    //CS脚及对应T_Key设置为模拟IO(设为0),用上位机时UART_IO设置为数字IO(设为1)PBDIER    =  0b0000_0001;
}

采用按键进行状态控制,首先就是需要把定义的引脚设置为对单片机的输入,此例我才用PB.0引脚作为输入端口

#define KeyOut_PIN PB.0//按键定义

小tip

  • PBPH设置为1,是因为加了上拉电阻
  • PBDIER设置为1,(具体我也不知道为什么,设置为1后,PB.0端口输入就正常了,可以实现控制)

定时器采用10ms的延时

word reload_T16;
void T16_Time(void){$ T16M SYSCLK,/4,bit12;     //T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);//时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, EOSC, ILRC, PA0_F;分频器可选择/1, /4, /16, /64//中断源可选择BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15reload_T16 = 4096 - 100; //每次进中断为1ms;//计算公式为 [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(4M/4)]*(2^12-(4096-1000))=1000us=1msstt16 reload_T16;          //设定计数器初始值reload_T16,当计数器累加超过设定中断源时产生中断;$ INTEN T16;             //中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。$ INTRQ T16;             //中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。//注:INTEN,INTRQ没有初始值,所以要使用中断前,一定要根据需要设定数据。即使INTEN为0,INTRQ还是会被中断发生源触发。$ INTEGS BIT_R;              //T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。//    设定INTEN、INTRQ的初始值INTEN.T16 = 1;                //开T16中断
//  INTEN.T16 = 0;             //关T16中断INTRQ.T16 = 0;             //清零INTRQ寄存器。ENGINT;                        //打开全局中断
}

按键函数的宏定义为

#define KeyOut_PIN PB.0//按键定义#define key_no 0  //按键抬起
#define key_click 1//按键按下1次
#define key_double 2//双击按键
#define key_long 3//长按键extern byte Key_detected;//按键抬起void key_board(void);

源码

/*按键函数以及红外触摸函数*/
#include"Keyboard.h"
word key_times=0;//按键时间初始化
byte Key_detected;//返回值,0:按键释放、1:按下按键、2:双击按键、3:长按按键
byte key_state=0;void key_board(void)
{switch (key_state){case 0:if(KeyOut_PIN==0){key_state=1;//按键按下,开始消抖}break;case 1:if(KeyOut_PIN==0){    key_times++;if(key_times>=5){key_times=0;//按键仍处于按下状态,消抖完成key_state=2;}}else{key_times=0;key_state=0;//按键在消抖时抬起,恢复初始状态}break;case 2:if(KeyOut_PIN==1)//按键抬起{key_times++; //消抖if(key_times>=5){key_times=0;key_state=3;}}else{key_times++;if(key_times>=500)//判断长按{key_times=0;key_detected=key_long;key_state=4;//返回到按键抬起}}break;case 3:key_times++;//判断双击if(key_times<200){if(KeyOut_PIN==0){key_detected=key_double;key_times=0;key_state=4;}}else{key_detected=key_click;key_times=0;key_state=4;}break;case 4:                   //按键抬起if(KeyOut_PIN==1){key_state=0;}break;}
}

本函数没有在开头和末尾把引用进行置零
是在循环调用的最后才进行置零的
如有需要
请在switch的上面进行key_detected=key_no;

因为函数需要进行实践判断是单击还是双击,所以会有双击判断的最低时间的延时,如有需要,可自行修改!

应广单片机-按键状态机(单击、双击、长按)相关推荐

  1. STM32独立按键实现单击双击长按功能

    目录 前言 一.按键功能定义 二.使用步骤 1.按键初始化 2.按键扫描函数(重点) 总结 前言 在使用STM32或其他单片机开发项目时,经常需要用到独立按键进行控制. 通常一个独立按键需要使用一个I ...

  2. 应广单片机PFS123按键中断控制数码管显示例程

    目录 应广单片机PFS123按键中断控制数码管显示视频 led数码管图片 应广单片机PFS123按键中断控制数码管显示代码 应广科技网址,开发工具,PMS123规格书:http://www.padau ...

  3. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按

    看了一个晚上,结合了马潮老师的书,才搞懂这个程序,确实经典!原文: 题目:多功能按键设计.利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按. (amobbs.com 阿莫电子论坛 ...

  4. 应广单片机休眠和按键唤醒

    对应电池供电的产品,在不使用的时候,单片机和外设都应该进入休眠状态,用于减少对电池电量消耗.在使用的时候又能够通过按键,或是其他信号唤醒系统,然后进入正常工作状态.在电压V3.3V的情况下,应广单片机 ...

  5. PMS150C应广单片机开发案例

    PMS150C应广单片机开发案例 应广单片机价格美丽,性价比高,mini-c好用,适用于消费电子开发.但是案例demo太少了,为了方便大家能够快速入门.这里贴出了一份经典PMS150C的点灯程序代码. ...

  6. 应广单片机003烧录器自定义封装使用技巧

    应广003烧录器可以烧录MTP芯片,相比002烧录器,功能更多,但是使用复杂.有时候摸上半天也烧录不了器件. 现在通过烧录器自带的用之定义封装的方法进行烧录.这样就可以节省很多时间. 自定义烧录说明: ...

  7. 应广单片机002烧录器万能烧录方法

    应广单片机有 单核13x 15x 17x这几个系列.但是烧录有时候要跳线啥的.后面发现,其实有一种方法,几乎通杀sop封装单片机,sop8 132除外.先使用writer把pdk文件写入烧录器. 1. ...

  8. 应广单片机万能烧录方法

    应广单片机有 单核13x 15x 17x这几个系列.但是烧录有时候要跳线啥的.后面发现,其实有一种方法,几乎通杀sop封装单片机,sop8 132除外.先使用writer把pdk文件写入烧录器. 1. ...

  9. 应广单片机芯片PMS132B -SOP8/SOP14/SOP16

    应广单片机芯片PMS132B -SOP8/SOP14/SOP16

最新文章

  1. 人工智能技术在移动互联网发展中的应用
  2. 枚举与Combox的SelectedIndex绑定出现怪异问题的解决方案
  3. 【鸿蒙 HarmonyOS】Ability 中使用纯代码绘制布局及 UI 组件
  4. 几何着色器与细分(镶嵌)着色器
  5. 新版gitbook导出pdf
  6. mysql union 出错_ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)...
  7. 算法分析与设计「二」递归算法
  8. ac86u原厂固件去广告_苹果发布最新固件IOS12.3.2,估计不修正你的手机
  9. vue v-if判断数组元素的值_我对Vue项目上线做的一些基本优化
  10. poj 1743 二分答案+后缀数组 求不重叠的最长重复子串
  11. 平板电脑(台电x80HD)安装Ubuntu18.04教程- Z3735系列CPU通用
  12. linux中的通配符指的是?
  13. 禅定是否一定要打坐,为什么?
  14. Python吴恩达深度学习作业15 -- YOLO原理及应用(自动驾驶——汽车检测)
  15. 一个博士在华为的22年!
  16. 中山大学软件工程c语言,2017年中山大学085212软件工程考研参考书目推荐
  17. 全球计算机科学排行榜,最新全球计算机科学排名:清华力压CMU,人工智能第一!北大排第四...
  18. 弥散磁共振成像技术:在脑内的应用
  19. matlab多径信道模型,多径时变信道模型的仿真与性能分析课程设计(样例3)
  20. php sequelize,Sequelize 中文文档 v4 - Querying - 查询

热门文章

  1. 电子秤使用和日常保养
  2. linux安装升级git
  3. css网页favicon_网站常用的favicon.ico文件详解
  4. 5G与8K联姻,时机真的到了吗?
  5. 为电子书迷测评几款epub阅读器
  6. 国标解读|从关键信息基础设施安全国标看软件供应链安全
  7. dma-pl330 12680000.pdma: Reset Channel-1 CS-20000f FTC-20000解决方案
  8. 搭建 yapi 接口管理平台
  9. yjk的波库在哪里_弹性时程分析——YJK盈建科软件操作.pdf
  10. 关于 两个 datetime 列的差别导致了运行时溢出