ORG 0000H
MAIN: MOV P1,#00000000B
MOV A,#00000001B //传一个数给A,用于循环移位
KEYBOARD EQU P0 //KEYBOARD相当于P0
MOV KEYBOARD,#0FFH //把数据送P0也就是KEYBOARD(按键)
LOP: ACALL Delay //延时一会儿
MOV R1,KEYBOARD //因为比较不等转移指令只能用一些规定语句,所以把这个操作数送R1
CJNE R1,#0FFH,LOP1 //比较R1中的数字是不是等于FFH,不等就转移,证明有键按下,相等就顺序执行
SJMP LOP //顺序执行到这里在返回去执行上一句继续判断,直到不相等转移才能退出这个循环
LOP1: ACALL Delay //延时一会儿
MOV KEYBOARD,#0FFH //把数据再次送到按键检查端口
MOV R1,KEYBOARD //送到A以便判断
CJNE R1,#0FFH,LOP2 //再次检查按键是不是被按下,原理同上
SJMP LOP
LOP2: ACALL Delay //延时一会儿
MOV KEYBOARD,#0FFH //把数据再次送到按键检查端口
MOV R1,KEYBOARD //送到A以便判断
CJNE R1,#0FFH,AOP1 //再次检查按键是不是被按下,原理同上
SJMP LOP
AOP1: CJNE R1,#0FEH,AOP2 //不等则判断下一个按键
ACALL Delay //延时一会儿
D0OP1: CJNE R1,#0FFH,DOP1
SJMP D0OP1
DOP1: ACALL key1
AOP2: CJNE R1,#0FDH,AOP3 //不等则判断下一个按键
D0OP2: CJNE R1,#0FFH,DOP2
SJMP D0OP2
DOP2: ACALL key2
AOP3: CJNE R1,#0FBH,AOP4 //不等则判断下一个按键
D0OP3: CJNE R1,#0FFH,DOP3
SJMP D0OP3
DOP3: ACALL key3
AOP4: CJNE R1,#0F7H,AOP5 //不等则判断下一个按键
D0OP4: CJNE R1,#0FFH,DOP4
SJMP D0OP4
DOP4: ACALL key4
AOP5: CJNE R1,#0EFH,AOP6 //不等则判断下一个按键
D0OP5: CJNE R1,#0FFH,DOP5
SJMP D0OP5
DOP5: ACALL key5
AOP6: CJNE R1,#0DFH,AOP7 //不等则判断下一个按键
D0OP6: CJNE R1,#0FFH,DOP6
SJMP D0OP6
DOP6: ACALL key6
AOP7: CJNE R1,#0BFH,AOP8 //不等则判断下一个按键
D0OP7: CJNE R1,#0FFH,DOP7
SJMP D0OP7
DOP7: ACALL key7
AOP8: CJNE R1,#07FH,LOP //不等再次扫描
D0OP8: CJNE R1,#0FFH,DOP8
SJMP D0OP8
DOP8: ACALL key8
AJMP LOP //如果相等,证明没有松手,重新扫描
/******************************按键子程序*******************************/
key1:
RR A
MOV P1,A
RET
key2: RR A
MOV P1,A
RET
key3: RR A
MOV P1,A
RET
key4: RR A
MOV P1,A
RET
key5: RR A
MOV P1,A
RET
key6: RR A
MOV P1,A
RET
key7: RR A
MOV P1,A
RET
key8: RR A
MOV P1,A
RET
/******************************延时子程序*******************************/
Delay: MOV R6,#0D7H
DL0:
MOV R5,#2DH
DJNZ R5,$
DJNZ R6,DL0
NOP
NOP
RET
END
这是一个8位独立按键程序,每按一次可以实现LED循环移位,P1是LED端口,高电平有效,P0是按键,按键直接接P0口然后接地。我想实现松手检测,我搜索了大量资料,关于汇编的寥寥无几,这里有人帮我理理思路,我好尽快写出汇编的松手检测程序 |