打印

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

[复制链接]
楼主: hunxiyi
手机看帖
扫描二维码
随时随地手机跟帖
21
pc1969| | 2012-12-13 10:59 | 只看该作者 回帖奖励 |倒序浏览
hunxiyi 发表于 2012-12-13 10:49
汇编不会;。。。。。比C难多了、、

用3楼的代码也行.先用P3扫描,再分别用P3.4,P3.5,P3.6,P3.7检测

使用特权

评论回复
22
hunxiyi|  楼主 | 2012-12-13 11:15 | 只看该作者
zhaoyu2005 发表于 2012-12-13 10:22
if(k != 88)                 //在此次for循环中 switch中如果匹配到
                                    ...

非常感谢你。。、、在你的指点下,我在最后一个case后加上default:k = 88;后,程序就完全没问题了
证明你说的是完全对的。。。
但是我也拿笔在纸上写了执行顺序,但还是不明白为什么在第一轮i=0的循环中,即使key值没被匹配,k值也变化了呢?
key值没被检测到,k值应该没被任何的东西“修改”啊。。。
我真的是刚入门。。这是我在这论坛发的第一个帖子,真的很菜。。。请你明示啊。。。实在是想不出来。。【可能你说了之后我才恍然大悟,但现在的我确实想不出来为什么】

使用特权

评论回复
23
hunxiyi|  楼主 | 2012-12-13 11:16 | 只看该作者
yirongfu 发表于 2012-12-13 01:47
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌

1. 像 P3  = (P3  ...

15楼的说法是对的。。。我在程序中加了红色的部分,就对了。。。具体原因,我还没想明白。。不过同样谢谢你啊!!!

使用特权

评论回复
24
xuyaqi| | 2012-12-13 11:57 | 只看该作者
“加上这句话,程序就完全没问题了                              
P3  = (P3 <<1) + 1;                 //P3口数据左移一位 再加1”

楼主还在纠结什么

使用特权

评论回复
25
hunxiyi|  楼主 | 2012-12-13 12:14 | 只看该作者
xuyaqi 发表于 2012-12-13 11:57
“加上这句话,程序就完全没问题了                              
P3  = (P3

你弄错了啊。。。我是说加上default:k = 88  程序就没问题了。。。这是15楼网友提示的

使用特权

评论回复
26
hongweizy| | 2012-12-13 12:35 | 只看该作者
我一直用汇编语言,C语言我还真不会。

使用特权

评论回复
27
zf_015820| | 2012-12-13 12:45 | 只看该作者
建议:不要直接用MCU的产,端口作操作数

使用特权

评论回复
28
ipook168| | 2012-12-13 14:52 | 只看该作者
四楼代码简单明了,效率很高,占用CPU时间很少,我产品中都是这样做,通用。

使用特权

评论回复
29
明月小厨| | 2012-12-13 15:02 | 只看该作者
这个程序看起来费劲啊;
你默认读端口的高位是0;有什么依据吗?

使用特权

评论回复
30
明月小厨| | 2012-12-13 15:05 | 只看该作者
硬件部分也不太正常;

使用特权

评论回复
31
明月小厨| | 2012-12-13 15:09 | 只看该作者
本帖最后由 明月小厨 于 2012-12-13 15:11 编辑

输出的4只脚(设为P3H),设为OC输出方式,
输入的4只脚设为输入(P3L),加上拉电阻;
然后输出P3H = 0;检测 P3L是否为0x?F;(高4位忽略);
否则有键按下,P3H一路一路拉低,看看是哪个键?延时10mS,再来检测一次,看看二次结果是否一样;再进一步确认是什么键值;
是有效键值吗?是则处理它;否则弃掉.

后面再加一等待按键释放的检测;
......

使用特权

评论回复
32
guobojj| | 2012-12-13 15:40 | 只看该作者
新人前来围观…

使用特权

评论回复
33
zh5202| | 2012-12-13 15:45 | 只看该作者
沙发

使用特权

评论回复
34
hunxiyi|  楼主 | 2012-12-13 16:50 | 只看该作者
明月小厨 发表于 2012-12-13 15:05
硬件部分也不太正常;

可经过15楼的指点,程序已经完全正常了啊。。。

使用特权

评论回复
35
hunxiyi|  楼主 | 2012-12-13 16:51 | 只看该作者
明月小厨 发表于 2012-12-13 15:02
这个程序看起来费劲啊;
你默认读端口的高位是0;有什么依据吗?

  key = P3  & 0x0f;
高位被屏蔽了啊。。所以全是0

使用特权

评论回复
36
hunxiyi|  楼主 | 2012-12-13 16:51 | 只看该作者
ipook168 发表于 2012-12-13 14:52
四楼代码简单明了,效率很高,占用CPU时间很少,我产品中都是这样做,通用。 ...

四楼太简洁了。。。压缩的都是精华。。。我还没看懂。。

使用特权

评论回复
37
ayb_ice| | 2012-12-13 17:00 | 只看该作者
hunxiyi 发表于 2012-12-13 16:51
四楼太简洁了。。。压缩的都是精华。。。我还没看懂。。


这是典型的双向扫描法
一次读低4位,一次读高4位,然后组合
如果没有任何按键按下,最终结果是0xff
任意一个键按下,其中两个位输出0,
然后通过程序测试一下,按下各个按键分别输出什么值,记录下来即可,如果读到同样值,即表示指定按键按下了

程序连续3次有键按下即认为OK,输出一次值,必须松开所有按键才能输出下一次按键值
。。。

程序可以轻松扩展,输出长按键,连续按键值。。。

使用特权

评论回复
38
hunxiyi|  楼主 | 2012-12-13 18:49 | 只看该作者
ayb_ice 发表于 2012-12-13 17:00
这是典型的双向扫描法
一次读低4位,一次读高4位,然后组合
如果没有任何按键按下,最终结果是0xff

你说的前面我都看懂了。。。但后面几句看不懂什么意思
比如按键都没按下的时候k == oxff,则key_delay = 0;
那么就是说只要有按键按下,则进入到if((key_delay < 100) && (++key_delay == 3))这句的判断
这句我看不懂什么意思,为什么key_delay < 100的同时 ++key_delay == 3
才有 key_number = k;
。。。请大侠再费点时间码点字,我真刚入门的。。。。:L

使用特权

评论回复
39
明月小厨| | 2012-12-13 19:03 | 只看该作者
先在自己的大脑里把整个过程放慢镜头似的过一遍;用自然语言(母语)描述每一个细节;
这个过程在设计环节是最重要的地方之一:
项目需求,概要设计;你是学生,应该把这二个文档整理整理.想偷懒是不行的;
有了这个,再开始详细设计,用代码描述;

尽可能把代码块缩小,精减成一个一个的功能模块;每个小模块只完成一件事;
都搞好了就开始测试,如果复杂或自己没把握就分模块进行测试验证;

使用特权

评论回复
40
明月小厨| | 2012-12-13 19:07 | 只看该作者
很多事实际情况远比我们想象的复杂;要有思想准备;出错误处理程序;
太多人的在编程的时候都忽略了这一点;
错误?
有什么错误?

使用特权

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

本版积分规则