mbed 按键长短按 实现
2016-01-12 19:10
337 查看
1、定时器中断方式
2、按键中断和定时器中断结合方式
#define LONG_PRESS 100 // 20ms*100=2s, #define SHORT_PRESS 5 // 20ms*5=100ms, InterruptIn btn(USER_BUTTON); int btn_now = 0; int btn_last = 0; bool btn_long = false; bool btn_short = false; bool btn_sta; int count = 0; float interval = 0.02; void key_scan() { btn_last = btn_now; btn_now = btn.read(); if (btn_last==1 && btn_now ==0 ) //°´Ï btn_sta = true; if (btn_last==0 && btn_now ==1 ) //µ¯Æð btn_sta = false; //printf("btn_sta= %d\r\n",btn_sta); if (btn_now == btn_last && btn_sta) { count++; //printf("count= %d \r\n",count); if (count > LONG_PRESS) { printf("button is a long press \r\n"); btn_sta = false; count = 0; i2c.write(0xA0, NULL, sizeof(struct stm32f411xx_baseboard_id) + 2); wait(0.02); SoftReset(); } } else { if (count > SHORT_PRESS) { printf("button is a short press \r\n"); btn_sta = false; count = 0; } else { count = 0; } } //printf("button is %d \r\n",btn.read()); } timer_key.attach(&key_scan,interval);
2、按键中断和定时器中断结合方式
#include "mbed.h" Serial pc(USBTX, USBRX); InterruptIn mybutton(USER_BUTTON); DigitalOut myled(LED1); Timeout timer1; Timeout timer2; bool flag; float delay = 1.0; // 1 sec void long_press() { if (!mybutton.read()) //myled = !myled; pc.printf("long pressed \r\n"); else pc.printf("short pressed \r\n"); } void short_press() { if (mybutton.read()) //myled = !myled; pc.printf("short pressed \r\n"); } void pressed() { timer1.attach(&long_press,0.2*10); timer2.attach(&short_press,0.2); } int main() { pc.baud(115200); mybutton.fall(&pressed); while (1) { wait(0.1); } }
相关文章推荐
- STM32 IO口双向问题
- 使用CMake来构建STM32工程
- 我的 ARM+Linux 学习路线
- 开发学习记录之看门狗驱动
- 时钟+温度+遥控设置,综合时钟例子
- Linux下运行openwebos- -(转)
- Linux下运行openwebos- -(转)
- BusyBox 简化嵌入式 Linux 系统
- EGL 学习
- 嵌入式开发设计方法变化的背景
- 嵌入式人才的发展方向
- 汇编调用c函数为什么要设置栈
- 三角函数的实现
- 嵌入式桌面操作系统使用与制作攻略
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
- 甲骨文收购Sleepycat 丰富嵌入式产品线
- 嵌入式Linux操作系统学习规划
- 基于嵌入式多芯片模组的微机保护平台
- 嵌入式系统中常用文件系统的制作总结
- 嵌入式C语言基础教程一