
楼主的疑问是正确的,程序需要修改:
main:
mov p1, #0f0h ;在P10~P13输出低电平
mov r7, #0ffh ;
key:djnz r7, key ;延时
mov a, p1 ;读P1,如有按键,高四位将有0
cpl a ;求反,有按键时,高四位将有1
anl a, #0f0h ;低四位置为0,高四位不变
jz ekey ;全0就是没有按键,退出
假设按下的是S1键进行如下检测(44键盘)
先在P3口输出
p3 00001111
低四位 行会有变化
cord_h =00001111&00001110 =00001110
if !=00001111
延时01us
cord_h=00001110&00001111=00001110
if !=00001111
P3再输出11111110
P3 =00001110|11110000=11111110
输出高四位
cord_l=P3&0xf0 //此时P3口就是输入值01111110 而不是上面的11111110
cord_l=01111110&11110000=01110000
cord_h+cord_l=00001110+01110000=01111110=0x7e //此编码即为S1的编码
P3口的值有变化,不知道你注意到没?我是这样理解的,即使执行了下面这句
P3=cord_h|0xf0; //输出当前列线值
那P3口接的键盘的按键没用变化吧,所以P3口的值还是0111 1110我不知道我这样理解对不。。。呵呵
新手?。。。那要看你是怎样的键盘了,是4X4矩阵键盘?还是8个按键直列某IO口的键盘?或者是其他的?扫描可以有软件循环等待扫描,就是一直等待用户按键;还有就是中断方式的键盘扫描,当有键按下后进入中断服务程序,然后再执行键盘扫描程序判断按键。就矩阵键盘的稍微复杂点,其他种类的键盘很简单,下面的是一个接在P2口的4X4矩阵键盘扫描程序,延时程序省略掉了,忘你能了解键盘扫描的过程: P2= 0xf0; if ((P2&0xf0)!=0xf0) // 若有键按下
{
delay(10); // 延时去抖动
if ((P2&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0)// 逐行扫描
{
P2 = scancode; // 输出行扫描码
if ((P2&0xf0)!=0xf0) // 判断本行是否有键按下
{
tmpcode = (P2&0xf0)|0x0f;
/ 返回特征字节码,为1的位即对应于行和列 /
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
以上就是关于单片机矩阵键盘扫描程序 没看懂求解释全部的内容,包括:单片机矩阵键盘扫描程序 没看懂求解释、您好,关于扫描矩阵键盘的程序里您提的一个追问,我也不明白,您能指点我一下么,谢谢、单片机中键盘扫描,主要是对CPU怎么扫描键按下没,何时扫描不懂等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)