📄 final.asm
字号:
$MOD51 ; This includes 8051 definitions for the metalink assembler
FOTO1 EQU P0.0
FOTO2 EQU P0.1
FOTO3 EQU P0.2
FOTO4 EQU P0.3
PULSO EQU P3.0
PULSO1 EQU P3.1
DATOS EQU P0
RS EQU P3.4
E EQU P3.5
RW EQU P3.6
CONT1 EQU 18H
CONT2 EQU 19H
ORG 0
JMP MAIN
ORG 03H
JMP SERVO1
ORG 0BH
JMP PWM
ORG 13H
JMP SERVO2
MAIN: MOV SP, #70H
MOV IE, #10000111B
MOV TMOD, #00010001B
SETB IT0
SETB IT1
MOV TH0, #0FFH
MOV TL0, #9CH
SETB E
MOV TH1, #0C5h ;Constante para 15ms
MOV TL1, #68h
CLR RW ;RW = 0
CLR RS ;RS = 0
SETB TR1
JNB TF1, $ ;Esperar 15ms
CLR TR1
SETB E
MOV P1, #00111000b ;Palabra de control 1
CLR E
NOP
NOP ;esperar mas de 4.7u
NOP
SETB E
MOV P1, #00110000b ;Palabra de control 2
CLR E
SETB TR1
JNB TF1, $ ;esperar 15ms
CLR TR1
SETB E
MOV P1, #00110000b ;Palabra de control 3
CLR E
NOP
NOP
SETB E
MOV P1, #00111000B ;palabra con N y F
CLR E
NOP
NOP
SETB E
MOV P1, #00001100B ;Enciende LCD
CLR E
NOP
NOP
SETB E
MOV P1, #00000001 ;Limpiar Pantalla
CLR E
NOP
NOP
SETB E
MOV P1, #00000110b ;Modo de Entrada
CLR E
TRABAJA: SETB RS ;RS = 1
SETB E
MOV P1,#'O'
CALL ESC
SETB RS
MOV P1,#'P'
CALL ESC
SETB RS
MOV P1,#'E'
CALL ESC
SETB RS
MOV P1,#'R'
CALL ESC
SETB RS
MOV P1,#'A'
CALL ESC
SETB RS
MOV P1,#'T'
CALL ESC
SETB RS
MOV P1,#'I'
CALL ESC
SETB RS
MOV P1,#'O'
CALL ESC
SETB RS
MOV P1,#'N'
CALL ESC
SETB RS
MOV P1,#' '
CALL ESC
SETB RS
MOV P1,#'M'
CALL ESC
SETB RS
MOV P1,#'O'
CALL ESC
SETB RS
MOV P1,#'D'
CALL ESC
SETB RS
MOV P1,#'E'
CALL ESC
SETB RS
MOV P1,#'?'
CALL ESC
NOP
NOP
JMP ACA
ESC: CLR E
NOP
NOP
SETB E
MOV R3,#30
DJNZ R3,$
RET
ACA: MOV R4, #50
MOV R6, #23
MOV 21H, #23
MOV 25H, #23
CLR 20H.6
CLR 20H.0
SETB TR0
SETB PULSO
JNB 20H.0, $
SETB PULSO1
MOV R6, #23
MOV 23H, #23
SETB TR0
SETB 20H.6
JB 20H.6, $
JMP AUTO
OTRA432: CLR RS
MOV P1, #00000001 ;Limpiar Pantalla
CALL ESC
SETB RS
SETB RS ;RS = 1
SETB E
MOV P1,#'A'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'U'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'T'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'O'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'M'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'A'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'T'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'I'
CALL ESC
SETB RS ;RS = 1
MOV P1,#'C'
CALL ESC
OTRA: CALL TECLADO
CJNE R7, #12, ACA1
JMP MANUAL
ACA1: SETB 20H.1
CLR 20H.6
MOV A, DATOS
ANL A, #0FH
MOV 22H, A
CJNE A, #15, VAS
JMP OTRA
VAS: ANL A, #03H
CJNE A, #3, MOVH
REV: MOV A, 22H
ANL A, #0CH
MOV 25H, A
CJNE A, #12, MOVV
JMP OTRA
MOVH: SETB IE0
CLR 20H.1
JNB 20H.1 , $
JMP REV
MOVV: SETB IE1
SETB 20H.6
JB 20H.6 , $
JMP OTRA
AUTO: CLR P0.4
CALL TECLADO
CJNE R7, #11, MANUAL
JMP OTRA432
MANUAL: CJNE R7, #12, AUTO
VERTI23: CALL MANUAL23
VERTI: CALL TECLADO
CJNE R7, #11, VASACA
YEAH: JMP OTRA432
VASACA: CJNE R7, #13, HORIZON; PREGUNTAMO SI NOS MOVEMOS VERTICALMENTE PRIMERO
DIGV1: CALL MANUAL23
CALL VERTIN
DIGV: CALL TECLADO
CJNE R7, #11, VASACA1
JMP OTRA432
VASACA1: CJNE R7, #14, VASACA2
JMP DIGH1
VASACA2: MOV A, R7
CLR C
SUBB A, #0AH
JNC DIGV
MOV 16H, R7
CALL NU
DAS: CALL TECLADO
CJNE R7, #11, VASACA3
JMP OTRA432
VASACA3: CJNE R7, #14, VASACA4
JMP DIGH1
VASACA4: CJNE R7, #13, VASACA23
JMP DIGV1
VASACA23: CJNE R7, #15, SADA
CALL ENTER
JMP CORRECTOV
SADA: JMP DAS
ALLA: JMP VERTI23
HORIZON: CJNE R7, #11, VASACA5
JMP YEAH
VASACA5: CJNE R7, #14, VERTI; PREGUNTAMOS SI NOS MOVEMOS HORIZONTALMETE PRIMERO
DIGH1: CALL MANUAL23
CALL HORIN
DIGH: CALL TECLADO
CJNE R7, #11, VASACA6
JMP YEAH
VASACA6: CJNE R7, #13, VASACA7
JMP DIGV1
VASACA7: MOV A, R7
CLR C
SUBB A, #0AH
JNC DIGH
CALL NU
MOV 17H, R7
VAS34: CALL TECLADO
CJNE R7, #11, VASACA8
JMP YEAH
VASACA8: CJNE R7, #13, VASACA9
JMP DIGV1
VASACA9: CJNE R7, #14, VASACA11
JMP DIGH1
VASACA11: CJNE R7, #15, VASACA10
CALL ENTER
JMP CORRECTOH
VASACA10: JMP VAS34
CORRECTOV: CLR C
MOV A, #23
SUBB A, 16H
MOV R6, A
MOV 25H, R6
SETB TR0
SETB 20H.6
JB 20H.6 , $
JMP ALLA
CORRECTOH: MOV B, #2
MOV A, 17H
MUL AB
ADD A, #3
MOV R6, A
MOV 25H, R6
SETB TR0
CLR 20H.1
JNB 20H.1 , $
JMP ALLA
Teclado: Mov R5,#4 ;contador de filas
Mov R2,#0fEh ;Codigo de barrido de filas
Mov R7,#03 ;Valor mayor de la 1ra fila
otra1: Mov P2,R2 ; sacar codigo
Mov A,P2 ; Leer columnas
ORL A,#0fh
CJNE A, #0ffh,ver_tecla ;Si hubo tecla oprimida
Mov A, R2 ;No hubo tecla oprimida
RL A ;rotar codigo para siguiente fila
Mov R2,A
Mov A, R7
ADD A,#4 ; valor mayor de la fila siguiente
Mov R7,A
DJNZ R5, otra1 ; repetir para fila siguiente
Mov R7, #0ffh ; Devuelve FFh si no hay tecla oprimida
RET
ver_tecla:Call RETARDO10 ;eliminar rebote
Mov A, P2
ORL A,#0Fh
CJNE A, #0ffh, sigue ;la tecla sigue oprimida
Mov R7,#0ffh ; no hay tecla oprimida
RET
sigue: RLC A ;Encontrar valor de la tecla oprimida
JNC soltar
DEC R7
JMP sigue
soltar: Mov A, P2 ; Esperar que se suelte la tecla
ORL A,#0fh
CJNE A,#0ffh, soltar
Call RETARDO10
RET
RETARDO10: MOV CONT1, #25;retardo 10ms
CIC1: MOV CONT2, #200
CIC2: DJNZ CONT2, CIC2
DJNZ CONT1, CIC1
RET
PWM: MOV TH0, #0FFH
MOV TL0, #9CH
CJNE R6, #0, BAJO
JMP BAJO1
BAJO: DJNZ R6, SALIR
JNB 20H.6, CIS
CPL PULSO1
JMP SER
CIS: CPL PULSO
SER: CLR C
MOV A, #200
SUBB A, 25H
MOV R1, A
BAJO1: DJNZ R1, SALIR
MOV R6, 25H
JNB 20H.6, CIS1
CPL PULSO1
JMP SER1
CIS1: CPL PULSO
SER1: DJNZ R4, SALIR
MOV R4, #50
CLR TR0
JB 20H.6, DE
SETB 20H.0
SETB 20H.1
JMP SALIR
DE: CLR 20H.6
SALIR: RETI
SERVO1: MOV A, 21H
CJNE A, #23, COM
MOV R6, #13
MOV 25H, #13
SETB TR0
JMP SALIR2
COM: CJNE A, #13, COM2
JNB FOTO2, COM1
MOV R6, #3
MOV 25H, #3
SETB TR0
JMP SALIR2
COM1: MOV R6, #13
MOV 25H, #13
SETB TR0
JMP SALIR2
COM2: MOV R6, #13
MOV 25H, #13
SETB TR0
SALIR2: MOV 25H, 21H
RETI
SERVO2: MOV A, 23H
CJNE A, #23, COM3
JNB FOTO3, SALIR1
MOV R6, #18
MOV 25H, #18
SETB TR0
JMP SALIR
COM3: CJNE A, #18, COM5
JNB FOTO3, COM4
MOV R6, #13
MOV 25H, #13
SETB TR0
JMP SALIR
COM4: MOV R6, #23
MOV 25H, #23
SETB TR0
JMP SALIR
COM5: JNB FOTO4, SALIR
MOV R6, #18
MOV 25H, #18
SETB TR0
SALIR1: MOV 23H, 25H
RETI
VERTIN: SETB RS
SETB E
MOV P1,#' '
CALL ESC
SETB RS
MOV P1,#'V'
CALL ESC
SETB RS
MOV P1,#'E'
CALL ESC
SETB RS
MOV P1,#'R'
CALL ESC
SETB RS
MOV P1,#'T'
CALL ESC
SETB RS
MOV P1,#'I'
CALL ESC
SETB RS
MOV P1,#'C'
CALL ESC
SETB RS
MOV P1,#'A'
CALL ESC
SETB RS
MOV P1,#'L'
CALL ESC
SETB RS
MOV P1,#' '
CALL ESC
RET
MANUAL23: CLR RS
MOV P1, #00000001 ;Limpiar Pantalla
CALL ESC
SETB RS
SETB RS
SETB E
MOV P1,#'M'
CALL ESC
SETB RS
MOV P1,#'A'
CALL ESC
SETB RS
MOV P1,#'N'
CALL ESC
SETB RS
MOV P1,#'U'
CALL ESC
SETB RS
MOV P1,#'A'
CALL ESC
SETB RS
MOV P1,#'L'
CALL ESC
RET
NU: SETB RS
SETB E
MOV P1,#' '
CALL ESC
CJNE R7, #0, N1
SETB RS
MOV P1,#'0'
CALL ESC
JMP SALIRNU
N1: CJNE R7, #1, N2
SETB RS
MOV P1,#'1'
CALL ESC
JMP SALIRNU
N2: CJNE R7, #2, N3
SETB RS
MOV P1,#'2'
CALL ESC
JMP SALIRNU
N3: CJNE R7, #3, N4
SETB RS
MOV P1,#'3'
CALL ESC
JMP SALIRNU
N4: CJNE R7, #4, N5
SETB RS
MOV P1,#'4'
CALL ESC
JMP SALIRNU
N5: CJNE R7, #5, N6
SETB RS
MOV P1,#'5'
CALL ESC
JMP SALIRNU
N6: CJNE R7, #6, N7
SETB RS
MOV P1,#'6'
CALL ESC
JMP SALIRNU
N7: CJNE R7, #7, N8
SETB RS
MOV P1,#'7'
CALL ESC
JMP SALIRNU
N8: CJNE R7, #8, N9
SETB RS
MOV P1,#'8'
CALL ESC
JMP SALIRNU
N9: CJNE R7, #9, SALIRNU
SETB RS
MOV P1,#'9'
CALL ESC
SALIRNU: RET
ENTER: SETB RS
SETB E
MOV P1,#' '
CALL ESC
SETB RS
MOV P1,#'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -