mình hiện dang làm tiểu luận bài giao tiếp bàn phím và hiển thi ,mà ko hiểu kỹ về cách nó quét phím ,và hoạt động của nó thế nào ,mình xin dược đưa chương trình để các bạn xem thử,rắt mong nhận được sự giúp đỡ của các bạn gần xa.Cảm ơn
$MOD51
ORG 00H
MAIN:
MOV P1,#00H
LCALL SCANKEYPAD
CJNE A,#0CH,NEXT1
LCALL CHOPTAT
NEXT1:
CJNE A,#08H,NEXT2
LCALL SANGDAN
NEXT2:
LJMP MAIN
SCANKEYPAD:
PUSH 03H
MOV R3,#50
BACK:
ACALL GETKEY
JNC NOPRESSED
DJNZ R3,BACK
NOPRESSED:
POP 03H
RET
GETKEY:
PUSH 05H
PUSH 06H
PUSH 07H
MOV A,#0EFH
MOV R6,#4
TEST:
MOV P0,A
MOV R7,A
MOV A,P0
ANL A,#0FH
CJNE A,#0FH,KEYPRESSED
MOV A,R7
RL A
DJNZ R6,TEST
CLR C
SJMP EXIT
KEYPRESSED:
MOV R7,A
MOV A,#4
CLR C
SUBB A,R6
MOV R6,A
MOV A,R7
MOV R5,#4
AGAIN:
RRC A
JNC DONE
INC R6
INC R6
INC R6
INC R6
DJNZ R5,AGAIN
DONE:
SETB C
MOV A,R6
EXIT:
POP 07H
POP 06H
POP 05H
RET
CHOPTAT:
MOV P1,#0FFH
LCALL DELAY500
MOV P1,#00H
LCALL DELAY500
MOV P1,#0FFH
LCALL DELAY500
MOV P1,#00H
LCALL DELAY500
MOV P1,#0FFH
LCALL DELAY500
MOV P1,#00H
LCALL DELAY500
MOV P1,#0FFH
RET
SANGDAN:
PUSH ACC
MOV A,#00H
SD1:
SETB C
MOV P1,A
LCALL DELAY500
RLC A
JNC SD1
SD2:
CLR C
MOV P1,A
LCALL DELAY500
RLC A
JC SD2
POP ACC
RET
DELAY500:
PUSH 00H
MOV R0,#1000
MOV TMOD,#01H
DEL1:
MOV TH0,#0ECH
MOV TL0,#78H
SETB TR0
JNB TF0,$
DJNZ R0,DEL1
POP 00H
RET
END
$MOD51
ORG 00H
MAIN:
MOV P1,#00H
LCALL SCANKEYPAD
CJNE A,#0CH,NEXT1
LCALL CHOPTAT
NEXT1:
CJNE A,#08H,NEXT2
LCALL SANGDAN
NEXT2:
LJMP MAIN
SCANKEYPAD:
PUSH 03H
MOV R3,#50
BACK:
ACALL GETKEY
JNC NOPRESSED
DJNZ R3,BACK
NOPRESSED:
POP 03H
RET
GETKEY:
PUSH 05H
PUSH 06H
PUSH 07H
MOV A,#0EFH
MOV R6,#4
TEST:
MOV P0,A
MOV R7,A
MOV A,P0
ANL A,#0FH
CJNE A,#0FH,KEYPRESSED
MOV A,R7
RL A
DJNZ R6,TEST
CLR C
SJMP EXIT
KEYPRESSED:
MOV R7,A
MOV A,#4
CLR C
SUBB A,R6
MOV R6,A
MOV A,R7
MOV R5,#4
AGAIN:
RRC A
JNC DONE
INC R6
INC R6
INC R6
INC R6
DJNZ R5,AGAIN
DONE:
SETB C
MOV A,R6
EXIT:
POP 07H
POP 06H
POP 05H
RET
CHOPTAT:
MOV P1,#0FFH
LCALL DELAY500
MOV P1,#00H
LCALL DELAY500
MOV P1,#0FFH
LCALL DELAY500
MOV P1,#00H
LCALL DELAY500
MOV P1,#0FFH
LCALL DELAY500
MOV P1,#00H
LCALL DELAY500
MOV P1,#0FFH
RET
SANGDAN:
PUSH ACC
MOV A,#00H
SD1:
SETB C
MOV P1,A
LCALL DELAY500
RLC A
JNC SD1
SD2:
CLR C
MOV P1,A
LCALL DELAY500
RLC A
JC SD2
POP ACC
RET
DELAY500:
PUSH 00H
MOV R0,#1000
MOV TMOD,#01H
DEL1:
MOV TH0,#0ECH
MOV TL0,#78H
SETB TR0
JNB TF0,$
DJNZ R0,DEL1
POP 00H
RET
END
Comment