OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7204|回复: 5

矩阵键盘组合键

[复制链接]

10

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1502
金钱
1502
注册时间
2013-8-28
在线时间
28 小时
发表于 2013-9-3 10:57:57 | 显示全部楼层 |阅读模式
STM32软硬件相关项目外包开发 QQ:83029775
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
发表于 2013-9-3 12:58:44 | 显示全部楼层
你猜你猜你再猜
回复 支持 反对

使用道具 举报

10

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1502
金钱
1502
注册时间
2013-8-28
在线时间
28 小时
 楼主| 发表于 2013-9-3 17:02:57 | 显示全部楼层
回复【2楼】895855913:
---------------------------------
4*4矩阵键盘 连接8个io口 扫描io口 现在能识别出一个按键按下 怎么才能识别出两个按键同时被按下
STM32软硬件相关项目外包开发 QQ:83029775
回复 支持 反对

使用道具 举报

7

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-3-3
在线时间
12 小时
发表于 2013-9-3 23:57:27 | 显示全部楼层
简单实现一下这个程序,只是一个框架,没按照严格代码来写,提供一个思路,看是否可行

#define  KEY_COUNT   8
#define  KEY_SCAN_PERIOD   1   //ms
#define  KEY_SHORT_SHOOT_LIMIT  5     //ms
#define  KEY_LONG_SHOOT_LIMIT   1000    //ms

#define  KEY1 0x1
#define  KEY2 0x2
#define  KEY3 0x4
#define  KEY4 0x8
#define  KEY5 0x10
....

typedef enum {

KEY_DOWN = 0,
KEY_UP,
KEY_SHORT,
KEY_LONG
}eKEY_STATE;

INT32U  ucKeyCount[KEY_COUNT];

//init your key
void  keyInit (void)
{
INT32U ulLoop;
// add your init code
for (ulLoop = 0;ulLoop < KEY_COUNT;ulLoop ++) {
ucKeyCount[ulLoop] = 0;
}
}

static eKEY_STATE keyCurStateGet (INT8U  ucKeyNum)
{

// add your key check manner as you need
if ("my check" = ucKeyNum) {
return KEY_DOWN;
return KEY_UP;
}


// add this code to the periodic INT FUN whoes period is KEY_SCAN_PERIOD ms

void  keyScanPeriodic (void)
{
INT8U  ucLoop;
for (ucLoop = 0;ucLoop < ;ucLoop ++) {
if (keyStateGet(ucLoop) = KEY_DOWN) {
ucKeyCount[ucLoop] ++;
} else {
ucKeyCount[ucLoop] = 0;
}
}
}

eKEY_STATE keyGet(INT32U ucKeyID)
{
INT8U  ucLoop;
if (ucKeyID == 0) {
return KEY_UP;
}
for (ucLoop = 0;ucLoop < KEY_COUNT;ucLoop ++) {
if ((ucKeyID & 0x1) != 0) {
if (ucKeyCount[ucLoop] < (KEY_SHORT_SHOOT_LIMIT/KEY_SCAN_PERIOD)) {
return KEY_UP;
}
}
ucKeyID >>= 1;
if (ucKeyID = 0) {
return KEY_DOWN;
}
}

}

example:

keyGet(KEY1|KEY3);

回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-9-4
在线时间
0 小时
发表于 2013-9-4 14:36:08 | 显示全部楼层
回复【4楼】爱上cmu:
---------------------------------
楼上的朋友 我现在在写一个4*4的键盘矩阵程序 用的方法跟这位的一样(见http://www.openedv.com/posts/list/8092.htm),可是我这个程序还需要识别出 单击 双击  想了一天 没什么思路 请问你能不能给点建议呀  谢了哈
回复 支持 反对

使用道具 举报

7

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-3-3
在线时间
12 小时
发表于 2013-9-4 19:19:16 | 显示全部楼层
回复【5楼】voncaesar:
---------------------------------
你看懂上面的方法自然就懂了,上面方法上进行简单修改就能实现双击或更多  并且组合键可以判断出先后顺序 最重要的是这个不用空跑CPU等待  基于生产者消费者模型  好好看看吧,别指望别人给你提供源码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 15:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表