打印

51单片机4X4矩阵键盘检测。。。为啥不行啊。。求大神

[复制链接]
楼主: hunxiyi
手机看帖
扫描二维码
随时随地手机跟帖
41
明月小厨| | 2012-12-13 19:09 | 只看该作者 回帖奖励 |倒序浏览
就拿按键来说;
有人恶搞,上电前就按住键,而且不松手;你的程序准备怎么处理?
恶搞不算.
如果上次有人按键,按下后卡住了,一直没弹起来;现在开机上电了;还有恶搞吗?

使用特权

评论回复
42
明月小厨| | 2012-12-13 19:12 | 只看该作者
有人恶搞,一下按住好几个键;你准备怎么处理啊?这算不算犯规?
有的人手指头很粗,一指按下的时候,不小心真的多按了几个;

再退一步,键卡住了一个,你准备下一步怎么识别用户的按键啊~~~~?

使用特权

评论回复
43
明月小厨| | 2012-12-13 19:14 | 只看该作者
我不小心说多了,别把你头搞晕了;
你继续.我不说了.


使用特权

评论回复
44
hunxiyi|  楼主 | 2012-12-13 19:16 | 只看该作者
明月小厨 发表于 2012-12-13 19:14
我不小心说多了,别把你头搞晕了;
你继续.我不说了.

:funk:

使用特权

评论回复
45
hunxiyi|  楼主 | 2012-12-13 19:36 | 只看该作者
hongweizy 发表于 2012-12-13 12:35
我一直用汇编语言,C语言我还真不会。

汇编都是高手,不解释

使用特权

评论回复
46
hunxiyi|  楼主 | 2012-12-13 19:37 | 只看该作者
zf_015820 发表于 2012-12-13 12:45
建议:不要直接用MCU的产,端口作操作数

书上都这么用的。。。哎。。

使用特权

评论回复
47
hunxiyi|  楼主 | 2012-12-13 19:37 | 只看该作者
guobojj 发表于 2012-12-13 15:40
新人前来围观…

我也新人啊啊啊

使用特权

评论回复
48
hunxiyi|  楼主 | 2012-12-13 19:37 | 只看该作者
明月小厨 发表于 2012-12-13 19:09
就拿按键来说;
有人恶搞,上电前就按住键,而且不松手;你的程序准备怎么处理?
恶搞不算.

很有才 不错

使用特权

评论回复
49
ayb_ice| | 2012-12-14 08:13 | 只看该作者
hunxiyi 发表于 2012-12-13 18:49
你说的前面我都看懂了。。。但后面几句看不懂什么意思
比如按键都没按下的时候k == oxff,则key_delay =  ...

if((key_delay < 100) && (++key_delay == 3))

这是防止按键长期按下key_delay变量溢出,也就是加到100就不加了,key_delay == 3就是消抖时间控制,如果10MS间隔调用的话,就是30MS的消抖时间,可以灵活控制这个时间,而且这个消抖是连续按下才有效,否则立刻重新开始,即k == oxff,则key_delay = 0;

使用特权

评论回复
50
zf_015820| | 2012-12-14 09:43 | 只看该作者
如同楼上所说,只要在程序内加一些检测这些按键的组合逻辑值处理程序,就可以了,这就是一个逻辑分析处理呀

使用特权

评论回复
51
hunxiyi|  楼主 | 2012-12-14 10:19 | 只看该作者
ayb_ice 发表于 2012-12-14 08:13
if((key_delay < 100) && (++key_delay == 3))

这是防止按键长期按下key_delay变量溢出,也就是加到100 ...

还是不明白。。。
举个例子,假设现在按下的0号键,让p3 = 0x0f则x = 0x0e;让p3 = 0xf0则k = 0xe0;
k = 0x0e + 0xe0 =0xee;
因为k != 0xff 所以进入if((key_delay < 100) && (++key_delay == 3))语句,刚好延时30ms 的时候
执行key_number = k
则得到的key_number = 0xee;
可是我的按下的低四位中的最低位 与高四位中最低位 所对应的  0号键啊。。。:Q

使用特权

评论回复
52
ayb_ice| | 2012-12-14 11:07 | 只看该作者
本帖最后由 ayb_ice 于 2012-12-14 11:10 编辑
hunxiyi 发表于 2012-12-14 10:19
还是不明白。。。
举个例子,假设现在按下的0号键,让p3 = 0x0f则x = 0x0e;让p3 = 0xf0则k = 0xe0;
k = 0 ...


#define KEY_0  0xee

程序中这样使用

if(key_number == KEY_0){
...
}

使用特权

评论回复
53
hunxiyi|  楼主 | 2012-12-14 11:24 | 只看该作者
ayb_ice 发表于 2012-12-14 11:07
#define KEY_0  0xee

程序中这样使用

哦。。。你这么说 我貌似懂了啊
那你这程序岂不是还要写出16个
if(key_number == KEY_0)
{
...
}



if(key_number == KEY_15)
{
...
}
语句啊。。。。
我本来是想找个简洁的矩阵键盘程序的。。。

使用特权

评论回复
54
ayb_ice| | 2012-12-14 11:47 | 只看该作者
hunxiyi 发表于 2012-12-14 11:24
哦。。。你这么说 我貌似懂了啊
那你这程序岂不是还要写出16个
if(key_number == KEY_0)


想简洁还不简单吗,再转换一下即可

你所谓的简洁是什么呢

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
hunxiyi + 3 赞一个!
55
hunxiyi|  楼主 | 2012-12-14 12:33 | 只看该作者
ayb_ice 发表于 2012-12-14 11:47
想简洁还不简单吗,再转换一下即可

你所谓的简洁是什么呢

呃。。。我才学这个
所以我以为的简洁就是代码的行数尽量少点。。其它的还没考虑啊。。

使用特权

评论回复
56
zhaoyu2005| | 2012-12-14 14:01 | 只看该作者
hunxiyi 发表于 2012-12-13 11:15
非常感谢你。。、、在你的指点下,我在最后一个case后加上default:k = 88;后,程序就完全没问题了
证明你 ...

关于K的值变化,我也不好说,如果其他地方没用到这个变量,那有可能是keil软件显示错误(实际是对的)

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
hunxiyi + 3 赞一个!
57
hunxiyi|  楼主 | 2012-12-14 15:15 | 只看该作者
zhaoyu2005 发表于 2012-12-14 14:01
关于K的值变化,我也不好说,如果其他地方没用到这个变量,那有可能是keil软件显示错误(实际是对的) ...

以后的程序还是避免这种情况出现吧。。。实在百思不得其解。。感谢感谢!

使用特权

评论回复
58
hongweizy| | 2012-12-14 19:03 | 只看该作者
hunxiyi 发表于 2012-12-13 19:36
汇编都是高手,不解释

楼主误会了,我以前学的就是汇编,顺手了,对于其它语言想学没精力了.太惭愧了!

使用特权

评论回复
59
hunxiyi|  楼主 | 2012-12-14 20:21 | 只看该作者
hongweizy 发表于 2012-12-14 19:03
楼主误会了,我以前学的就是汇编,顺手了,对于其它语言想学没精力了.太惭愧了! ...

哎。。现在搞这方面的 基本上都是从C入手的。。毕竟C入门很简单的。。。

使用特权

评论回复
60
zhaoyu2005| | 2012-12-15 08:47 | 只看该作者
hunxiyi 发表于 2012-12-14 15:15
以后的程序还是避免这种情况出现吧。。。实在百思不得其解。。感谢感谢! ...

不用百思不其解,keil有的版本确实变量值的显示不正确,但是运行是正确的。有的变量如果不是全局变量,超出了有效域,也会被修改的,关于这点,keil里有说明

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则