矩阵键盘的扫描
下面是自己写的矩阵键盘的检测是程序哪里出来问题一直不知道,还是这中思路不行,求交流一下是程序的一部分,当检测到有按键时,亮一个灯#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay (uchar ms) ;
uchar ms;
void main()
{
uchar temp;
P3=0xfe;
temp=P3;
temp&=0xf0;
if(temp!=0xf0)
{ delay(50);
temp=P3;
temp&=0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
case 0xde:
case 0xbe:
case 0x7e:
P1=0xfe;
break;
}
}
} 回复【楼主位】wozhoujue
-----------------------------------------------------------------------
我是新手,最近自己用汇编编了个程序调试成功。没自信看你的,不会C51
;********************************************************************************
;本程序实现扫描按键显示功能. *
;分别按16个键盘显示分别显示数字0123456789ABCDEF *
;键盘口P1,数码管显示一位, 数码管段位p0口 *
;********************************************************************************
org 0000h
ajmp main
org 0080h
main:
mov 30h,#00h;键盘码缓存
mov p1,#0fh;输出扫描码
lcall delay2;仿抖处理
mov a,p1
mov r3,a
cjne a,#0fh,loop1;有输入,则输出下一个扫描码
ajmp main
loop1:
mov p1,#0f0h;输出扫描码
mov r0,p1
mov a,r0
cjne a,#0f0h,loop2
ajmp main
loop2:
mov a,r3
xrl a,r0
mov 30h,a;暂存键盘码
lcall chek;调用查询键盘码程序
lcall display;调用显示程序段
ajmp main;循环扫描
;#########查询键盘码
chek:
mov r1,#00h
mov dptr,#tab1 ;键盘码首地址
ck1:
mov a,r1
inc r1
movc a,@a+dptr;取键盘码
jz ck2;取到00h,则说明键盘误动作,退出
cjne a,30h,ck1
ck2:
dec r1
mov a,r1;取出相对地址
ret
;#########获取显示码并显示
display:
mov dptr,#tab2
movc a,@a+dptr;取显示码
mov p2,#0efh
mov p0,a
ret
;#########延时
delay2: ;延时去抖动子程序
MOV R5,#10
L7: MOV R6,#10
L8: DJNZ R6,L8
DJNZ R5,L7
RET
tab1:
db77h,0b7h,0d7h,0e7h,7bh,0bbh,0dbh,0ebh,7dh,0bdh,0ddh,0edh,7eh,0beh,0deh,0eeh,00h ;键盘码表
tab2:
db28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,30h,25h,0a9h,26h,0a1h,0b1h,0ffh ;数码管0123456789ABCDEF
end
页:
[1]