zhangzhao2423 发表于 2021-10-15 08:11 P0.7就算不是悬空,其所接电路也必须在扫描按键时保持高电平。 |
wulin 发表于 2021-10-14 17:21 厉害,原程序就是使用了7个按键。并且P0.0接地,但是P0.7是不是空的我就不太清楚了。 |
从楼主给的现有条件来看,这个矩阵键盘用了6个端口组成3*3,只使用了7个按键。并且P0.0是被接地,P0.7空。否则不可能得到上述7个键码。 给你把按键代码顺序调整了一下,便于你理解键码是怎么产生的。这是验证程序:
|
zhangzhao2423 发表于 2021-10-14 16:06 这样的话,你两次对p0的设置,应该分别是 0x0e和0xf0,确保p0.0始终为低,而不是你代码里的0x0f和0xf1。因为1有不确定性,0有稳定性。 |
188610329 发表于 2021-10-14 15:42 假设0.0到0.3是行,0.4到0.7是列,那么按理说可以区分16个按键的值。因为P0^0一直拉低,所以也可以区分12个按键,任何一个按键按下去,应该会有三个位是0,因为P0^0始终是零。 |
zhangzhao2423 发表于 2021-10-14 15:31 所以,这个时候,就需要电路图了, 你设置的 P0 = 0x0f; 谁会知道你的 P0^0 会被拉低呢? 而且如果你的 P0^0 会被拉低, 那么 即使你没有按任何按键, 你的 Key_l=Keybus; //我的理解:此时Key_l=0x0f 这个推测是不会成立的, 这个时候也应该是: Key_l=0x0e |
188610329 发表于 2021-10-14 15:07 不能理解,在3x4的矩阵里,假设P0^0是0,我随便按下哪个按钮,也是其中的另外两个位为0,应该不会有0X07的情况吧 |
Jiang_YY 发表于 2021-10-14 15:15 看看我之前的回复。 所以,switch (R_Keyno) 里面的 Case, 随便找一个,转换成 二进制: 比如: 0xbc => 1011 1100 居然 三个0?? ![]() 这里,我是晕了, 你帮忙分析分析啥情况,为啥3个0??? ![]() |
估计楼主用直接设置IO输入输出方向的MCU比较多,用传统51比较少,对这种转换输入方式不太理解。或者是一下没反应过来?![]() ![]() |
zhangzhao2423 发表于 2021-10-14 14:52 没有键按下,就是0x0f, 有键按下就是 0x07,0x0b 之类的 |
上一句没回复完,按错发送了。 Key_l=Keybus; //我的理解:此时Key_l=0x0f 这一句,输出“1”的位就是输入了,如果有按键按下,读回来的就不是“1”了。 |
Key_l=Keybus; //我的理解:此时Key_l=0x0f |
188610329 发表于 2021-10-14 14:22 keybus 在任何时候都是P0,那么keybus=0x0f;然后给key_l 这个结果是0x0f,还是P0啊? 然后它按位或的时候?低四位结果不是全是1吗? |
基于, #define Keybus P0 , 所以,Keybus 就是 P0 的意思,是任何时候,而不是仅仅“此时” 所以: Key_h=Keybus; 就是把 P0 的 值 赋值给 Key_h 所以: Key_no=Key_h | Key_l; 只要有按键按下, 就不会等于 0xff 从你: Keybus=0x0f; Keybus=0xf1; 这两句看, 如果不是写错了。 那么,你的矩阵键盘就是 3x4 = 12 的矩阵。 所以,switch (R_Keyno) 里面的 Case, 随便找一个,转换成 二进制: 比如: 0xbc => 1011 1100 ![]() 看不懂了………… 你自己捉摸吧…… |
结合硬件接线图,就一目了然了。 |