当前位置: 首页 > news >正文

按键实现短按、长按、双击、长按抬起

按键这是我早就想尽可能完善下各种不同的事件,以达到更少的按键实现更多的功能的目的。项目需要用到四个独立按键+LCD屏幕做各种界面的显示、切换、上下选择等操作。 

采用MCU内部的上拉输入,没有按键按下的时候全是1,按键按下变成0。

这个项目是使用32去做的,因此是基于32去开发的,移植到C51上也是一样适用的,逻辑都是一样的。

引脚的定义:

#define  KEY1_GPIO_PORT          GPIOA
#define  KEY1_GPIO_PIN           GPIO_PIN_0
#define  KEY1_GPIO_MODE          GPIO_Mode_IPU
#define  KEY1_READ               GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN)#define  KEY2_GPIO_PORT          GPIOA
#define  KEY2_GPIO_PIN           GPIO_PIN_1
#define  KEY2_GPIO_MODE          GPIO_Mode_IPU
#define  KEY2_READ               GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN)#define  KEY3_GPIO_PORT          GPIOA
#define  KEY3_GPIO_PIN           GPIO_PIN_2
#define  KEY3_GPIO_MODE          GPIO_Mode_IPU
#define  KEY3_READ               GPIO_ReadInputDataBit(KEY3_GPIO_PORT, KEY3_GPIO_PIN)#define  KEY4_GPIO_PORT          GPIOA
#define  KEY4_GPIO_PIN           GPIO_PIN_3
#define  KEY4_GPIO_MODE          GPIO_Mode_IPU
#define  KEY4_READ               GPIO_ReadInputDataBit(KEY4_GPIO_PORT, KEY4_GPIO_PIN)

GPIO的初始化


void Key_GPIOConfig(void){    
GPIO_InitType  Key_GPIOType;   
Key_GPIOType.Pin        = KEY1_GPIO_PIN;    
Key_GPIOType.GPIO_Mode  = KEY1_GPIO_MODE;    
GPIO_InitPeripheral(KEY1_GPIO_PORT, &Key_GPIOType);
Key_GPIOType.Pin        = KEY2_GPIO_PIN;   
Key_GPIOType.GPIO_Mode  = KEY2_GPIO_MODE;  
GPIO_InitPeripheral(KEY2_GPIO_PORT, &Key_GPIOType);  
Key_GPIOType.Pin        = KEY3_GPIO_PIN;    
Key_GPIOType.GPIO_Mode  = KEY3_GPIO_MODE; 
GPIO_InitPeripheral(KEY3_GPIO_PORT, &Key_GPIOType);
Key_GPIOType.Pin        = KEY4_GPIO_PIN; 
Key_GPIOType.GPIO_Mode  = KEY4_GPIO_MODE;  
GPIO_InitPeripheral(KEY4_GPIO_PORT, &Key_GPIOType);
log_i("Key gpio config complete.\r\n");
}

四个按键为了好区分分别是哪个按键被按下或者同时被按下,定义一个KeyVal保存键值做如下拼装:

 KeyVal = (KEY4_READ << 3) | (KEY3_READ << 2) | (KEY2_READ << 1) | KEY1_READ;

这样一来KeyVal的低四位每一位可以表示一个按键的状态,即便四个同时按下也能区分出来。也能更加简单的实现组合按键。

头文件

typedef enum {KEY_NONE = 0,    KEY1     = 1,    KEY2     = 2,    KEY3     = 3,    KEY4     = 4,
}
eKeyList;
typedef enum {KEY_TYPE_NULL = 0,         KEY_TYPE_DOUBLE_CLICK = 1, KEY_TYPE_DOWN = 2,  
http://www.dtcms.com/a/467235.html

相关文章:

  • 韩国男女直接做视频网站效果图工作室
  • 嵌入式企业面经实战合集(持续更新)
  • package.xml文件的作用
  • 萍乡网站建设哪家好哦小项目加盟
  • 爱妮微如何做网站链接的网址一起做网站下载数据包
  • C语言入门教程(第5讲):数组详解——一次性搞懂一维数组、二维数组与内存布局
  • c++ static_cast用法
  • 广东省建设工程总监扣分查询网站无极网络
  • 龙华建设网站公司wordpress 3.7
  • 淘宝客怎么做自己的网站学习做网站的网站
  • 手机百度网站证书过期外贸网站推广方法之一
  • 网站登录后不显示内容试玩网站设计建设
  • Visual Basic.NET 关键词
  • 数据结构--------树二叉树
  • 郑州网站开发培训班o2o网站系统建设
  • Lampiao渗透项目学习记录
  • 新功能来袭——支持导出MIDI文件,AI音乐从此进入新篇章
  • 网站推广活动方案权威网站排名
  • Google 智能体设计模式:工具使用(函数调用)
  • 网站开发的技术类型有哪些网络服务代码1001
  • Redis-string
  • 网站网页的收录数量赤峰建设厅官方网站
  • 做灯箱的网站wordpress nginx apache
  • (7)100天python从入门到拿捏《迭代器和生成器》
  • 花卉网站建设策划书核酸二维码
  • 00--VSCode配置
  • 光明区建设局网站抖音代运营成功案例
  • 宁波论坛建站模板珠海市建设工程信息网
  • 温州做网站价格外贸推广软件
  • 自己建的网站也要注册域名吗电子商务网站建设与维护试卷答案