51 experimento con microcontrolador (sobre el contador del temporizador)
;****************** Diseño de temporizador electrónico******************;
; *MCU: AT892051;
; *MCU-cristal: 12M;
; *Versión:
; 2007- 6-14;
; *Autor: zhaojun;
; *Descripción:
; y T0 son segundos para contar;
; S2 es la tecla de función, S3 es la tecla de selección de modo
;
;P3.2~P3.5 son selecciones de bits, P1.7 es el sonido de la alarma y P3.7 es el relé controlado;
;****** ********** *************************************; p>
;****** ************
; Pseudo definición;
;******* ***********
SL EQU 30H; SL almacena los dígitos individuales de segundos
SH EQU 31H SH almacena los dígitos de las decenas de segundos
ML EQU 32H; ML almacena minutos con dígitos individuales
MH EQU 33H; MH almacena los dígitos de las decenas de minutos
HL EQU 34H almacena los dígitos individuales
HH EQU 35H; dígito de decenas cuando se almacena HH
L0 EQU 36H; L0~L3: muestra la memoria de datos
L1 EQU 37H
L2 EQU 38H
L3 EQU 39H
DSPLYP EQU 3AH; Mostrar puntero de datos (DISPLAY-POINT)
PLYTS EQU 3BH; Mostrar contador de tiempos (DISPLAY-TIMES)
LPLMOD BIT 39H; Modo de visualización bajo de dos dígitos (LOW-PLAY-MOD)
HPLMOD BIT 3AH; Modo de visualización alto de dos dígitos (HIGH-PLAY-MOD) p>
BROCA BRILLANTE 3BH
; DISPLAY parámetro de subrutina: bit indicador de encendido/apagado
TCOUNT EQU 3CH; contador de tiempo (TIME-COUNT)
ADDRES EQU 3DH Añade 1 parámetro de subrutina
MAX EQU 3EH; Agregar 1 parámetro de subrutina
IFDEC BIT 20H; parámetro de subrutina adicional BCD
R_MOD EQU 3FH; parámetro de modo de anillo
LED4 BIT 30H; bit
BELL BIT P1.7; Zumbador
INTERRUPTOR BIT P3.7; Relé
FKEY BIT P3.0; >
MKEY BIT P3.1; Tecla de modificación (S2)
WORKIN BIT 38H; bit de indicación del estado de funcionamiento
;***** ******* ******
; Interrumpir entrada;
;******************
ORG 0000H
INICIO: LJMP MAIN; 0000H conduce al programa principal
LJMP ERR 0003H
NOP
NOP
LJMP ERR; conduce al controlador de errores
LJMP PGT0; 000BH conduce al controlador de interrupciones PGT0
NOP
NOP
LJMP ERR; conduce al controlador de errores
LJMP ERR; 0013H INT1
NOP
NOP
LJMP ERR
ERROR LJMP; 001BH T1
NOP
NOP
ERR LJMP
ERR LJMP 0023H
NOP;
NOP
ERR LJMP
ERR LJMP 002BH
NOP
NOP
;************
;Programa principal;
;********** ****
PRINCIPAL: MOV IE, #00H; Desactivar interrupciones
MOV SP, #57H; Establecer puntero de pila
MOV PSW, #00H;
M
OV TMOD, #11H; Establezca el modo de trabajo de interrupción en T0 y T1
MOV A, 56H
CJNE A, #0AAH, CSTART; Indicador de reinicio de encendido, sin indicador de arranque en frío
MOV A, 57H
CJNE A, #55H, CSTART sin indicador de arranque en frío
AJMP; HSTART ; Convertir a inicio en caliente con indicador de reinicio de encendido
NOP
NOP
LJMP ERR Trampa de software, lo que genera un controlador de errores
CSTART: MOV P1, #0FFH; arranque en frío, inicialización completa
MOV P3, #0FFH
MOV TCON, #00H; TL0, #0B0H; Asignar valor inicial a la interrupción T0
MOV TH0, #3CH
MOV TCOUNT, #0AH; Asignar valor inicial al temporizador
MOV R5 , #00H ; R5 es una unidad vacía (en espera)
MOV R4, #00H; R4 es el registro de selección del modo de trabajo
MOV SL, #00H la unidad de sincronización está borrada; /p>
MOV SH, #00H; segundos
MOV ML, #00H;
MOV MH, #00H; minutos
MOV HL, #00H;
p>
MOV HH, #00H; Hora
MOV PLYTS, #64H Asigna el valor inicial de los tiempos de visualización a 100 veces
MOV DSPLYP, #L0; El puntero de visualización apunta a la unidad de memoria de visualización
MOV L0, #0AH; Enviar datos de visualización "-----"
MOV L1, #0AH
MOV L2, #0AH p>
MOV L3, #04H
SETB LED4 es el diodo emisor de luz entre los tubos digitales
SETB LPLMOD; establece el modo de visualización en flash
SETB HPLMOD;
SETB BRIGHT; permitir visualización
Borrar indicador de trabajo, en espera
CONFIGURACIÓN DE AJMP; Cambiar para comenzar a trabajar
NOP
NOP
Trampa de software LJMP
HSTART; : MOV SCON, #00H; Con indicador de encendido, arranque en caliente, borrar registro de control de puerto serie
MOV IP, #00H Borrar registro de control de prioridad de interrupción
SETB FK;
EY; botón de reinicio
SETB MKEY
SETB EA; activar interrupción
AJMP BEGIN;girar para continuar trabajando
NOP
p >NOP
LJMP ERR; trampa de software
CONFIGURACIÓN: SETB EA; activar interrupción
PRINCIPAL1: ACALL DISPLY; >
JB FKEY, JUDGE; Escaneo de teclas
ACALL KEYDLY; Eliminación de fluctuación de retardo
JB FKEY, JUDGE No se presiona ninguna tecla para girar y determinar si se alcanzó el punto
p>CLR ET0; cuando se presiona la tecla de función,
CLR TR0 pausar el tiempo
ACALL MENU; llamar al programa de configuración del menú
BEGIN; : SETB WORKIN; Establecer indicador de trabajo, comenzar a trabajar
SETB ET0; Activar interrupción
Iniciar tiempo
MOV A, R4; selección de modo
RL A; amplificación del puntero
MOV DPTR, #M_TAB
JMP @A DPTR Saltar al segmento de programa correspondiente según el modo de trabajo
M_TAB: AJMP WORK1
AJMP WORK2
AJMP WORK3
AJMP WORK4
NOP
NOP
LJMP ERR; Trampa de software
TRABAJO1: ;
TRABAJO2: CLR SWITCH Modo de trabajo 1 y 2: relé abierto
AJMP MAIN2
NOP
NOP
ERR LJMP; Trampa de software
TRABAJO3: ;
TRABAJO4 : INTERRUPTOR SETB; Modo de trabajo 3 y 4: No abrir el relé
MAIN2: CLR BELL El timbre emitirá un pitido breve para indicar el inicio del trabajo
ACALL DL05S
SETB BELL
JUEZ: JNB WORKIN, MAIN1; Determina si está en tiempo
MOV A, SL Determina si el segundo es cero
JNZ MAIN1
MOV A, SH; Determinar si el segundo es cero
JNZ MAIN1
MOV A, ML
; Determinar si la puntuación es cero
JNZ MAIN1
MOV A, MH Determinar si la puntuación es cero
JNZ MAIN1
MOV A, HL; Si es cero al juzgar
JNZ MAIN1
MOV A, HH; Si es cero al juzgar
JNZ MAIN1; las horas, los minutos y los segundos son todos cero. Entonces
CLR ET0; Detener el cronometraje
CLR TR0;
ACALL ACTION Llame a la subrutina de trabajo punto a punto;
AJMP PRINCIPAL; Devolver
NOP
NOP
Trampa de software LJMP
; >
;****** ************
Programa de cuenta atrás;
;********; **********
PGT0: CLR EA; desactivar interrupción
PUSH ACC;proteger la escena
PUSH PSW
PUSH DPL
PUSH DPH
MOV PSW, #08H; Seleccione el grupo de registros 1
CLR TR0; > MOV A, #0B7H; Corrección de sincronización de interrupción
AGREGAR A, TL0
MOV TL0, A
MOV A, #3CH
ADD A, TH0
MOV TH0, A
SETB TR0; reanudar el tiempo
DEC TCOUNT El temporizador T0 se desborda cada 50 000 milisegundos, luego
MOV A, TCOUNT; Desbordamiento 10 El tiempo es 0,5 segundos
JNZ OUTT0; Determine si es medio segundo
MOV TCOUNT, #0AH;
CPL LED4; si es medio segundo, el LED está invertido
JNB LED4, OUTT0; cada LED parpadea durante un segundo
MOV R0, #SH; dirección del segundo dígito
SETB IFDEC; parámetro de subrutina BCD, lo que hace que realice la resta
ACALL ADDBCD; llama a la subrutina BCD, resta 1 en segundos
CJNE R3, #99H, OUTT0; Determina si es necesario tomar prestado el segundo
MOV SH, #05H; Si quieres tomar prestado un poco,
MOV SL, #09H; Envía datos 59 (de lo contrario, mostrará 99)
> MOV R0, #MH; Mover a la dirección de los bits
ACALL ADDBCD; Restar 1 de los puntos
CJNE R3, #99H, OUTT0; ser prestado
MOV MH, #05H
MOV ML, #09H
MOV R0, #HH
ACALL ADDBCD
OUTT0: POP DPH; Sitio de recuperación
POP DPL
POP PSW
POP ACC
SETB EA
RETI; retorno de interrupción
NOP
NOP
LJMP ERR; trampa de software
; >;**** **********************
; subrutina BCD (suma 1 o resta 1);
;* *************************
ADDBCD: MOV A, @R0; del operando
DEC R0; Disminuye el puntero en uno
SWAP A
ORL A, @R0; p>
MOV B, #01H; el registro B envía el número inmediato #01H
MOV C, IFDEC; si el indicador de resta es 1, entonces
MOV B.3, C;
MOV B .4, C; El valor del registro B se cambia a #99H
MOV B.7, C
ADD A; , B; Agregar #99H a un código BCD comprimido es igual a Restarle uno
DA A;ajuste del código BCD
MOV R3, A Almacenar temporalmente el resultado
ANL A, #0FH; Toma el código bajo
p>
MOV @R0, A; almacena el número
MOV A, R3;
INC R0; agrega uno al puntero
SWAP A ; Exchange
ANL A, #0FH Obtiene el bit alto del número de resultado
MOV @R0, A; almacenar el número
RET
NOP
NOP
trampa de software LJMP<; /p>
; ****************
; Agregar 1 programa;
;********* *****
ADDONE: MOV R0, DIRECCIÓN; Mover en el sumando;
Dirección de la unidad
CLR IFDEC; Establecer subrutina BCD para la suma
ACALL ADDBCD; Llamar a la subrutina BCD
Determinar si el sumando es mayor que
p>MOV A, R3; valor máximo "MAX"
CJNE A, MAX, JGOVER
JGOVER: JC ENDADO
CLR A ; es mayor que "MAX", se borrará
MOV @R0, A
DEC R0
MOV @R0, A
ENDADO: RET
NOP
NOP
Trampa de software LJMP
;********* *** *******
; Ajuste de tiempo y programa de avance rápido;
;****************** *
QUICK: CLR LPLMOD; configura el modo de visualización para que no parpadee
CLR HPLMOD
ACALL ADDONE; > MOV L0, R4; Mueve el número de selección del modo de trabajo a la memoria de visualización
INC L0; agrega 1 y conviértelo en el valor de visualización
ACALL KEYDLY
ACALL DL100
JNB MKEY, QUICK; determina si la tecla está liberada
SETB LPLMOD; si se suelta, se restaurará el modo de visualización intermitente
CJNE R6, #02H, ENDQUK
SETB HPLMOD
CLR LPLMOD
ENDQUK: RET
NOP
NOP
LJMP ERR; trampa de software
;******************
; Programa de menú de funciones;
;***** *************
MENÚ: MOV R6, #00H; Inicialización R6 cuenta el número de pulsaciones de teclas de función;
MOV ADDRES, #05H; La dirección de R5 se envía para cambiar el valor de R4
MOV MAX, #04H Define el valor máximo del registro de selección del modo de trabajo R4;
MOV DSPLYP, #L0; Define el puntero de visualización Apunta a la memoria de video
SETB LPLMOD Establece los dos dígitos inferiores para que parpadeen
CLR HPLMOD
p>MOV L0, R4; Enviar datos de visualización "F-0X"
p>INC L0
MOV L1, #00H
MOV L2 , #0BH
MOV
L3, #00H
SETB LED4
WAITFK: ACALL DISPLY; esperar a que se suelte la tecla F
JNB FKEY, WAITFK
MENU1: ACALL DISPLY
JB MKEY, JGFKEY; escaneo de tecla M
ACALL KEYDLY; eliminación de retardo de fluctuación
JB MKEY, JGFKEY Si no se presiona, cambie a la tecla F; escaneando
CJNE R6, #00H, NEXT1
MOV SL, #00H Si el modo de sincronización se cambia a mitad de camino, los datos de sincronización originales se borrarán
> MOV SH, # 00H
MOV ML, #00H
MOV MH, #00H
MOV HL, #00H
MOV HH, #00H
NEXT1: MOV R2, #00H; R2 se usa para juzgar si el tiempo de pulsación de la tecla excede 0,5 segundos
NEXT2: ACALL ADDONE;
MOV L0, R4; Pasar al número de selección del modo de trabajo
INC L0
WAITMK: ACALL DISPLY; la tecla M que se liberará
INC R2; R2 aumenta en uno
CLR C
CJNE R2, #0C8H, JGQUIC si R2 es mayor que o; igual a 200, llame a la subrutina de avance rápido
JGQUIC: JC WATMK1
ACALL QUICK
WATMK1: JNB MKEY, WAITMK; espere a que se suelte la tecla M
JGFKEY: JB FKEY, MENU1; tecla de función (F) Scan
ACALL KEYDLY Eliminación de fluctuación de retardo
JB FKEY; , MENU1; si no se presiona la tecla, cambie al escaneo de la tecla de modificación (M)
INC R6; agregue 1 al número de pulsaciones de teclas
MOV A, R6; Moverse en el número de pulsaciones de teclas
RL A; ampliar el puntero
MOV DPTR, #FUNTAB
JMP @A DPTR; según el número de pulsaciones de teclas
FUNTAB: AJMP WAITFK
AJMP SETLOW
AJMP SETHI
AJMP ENDMEN
NOP
NOP
AJMP ENDMEN
; STWKMD: Configuración del modo de trabajo, no es necesario cambiar el menú por separado
SETLOW : MOV MAX, #60H;
Establezca el bit bajo (segundos o minutos)
MOV A, R4; pase al número de selección del modo de trabajo
Ampliación del puntero RL A
MOV DPTR, #FTAB1
JMP @A DPTR Salta al segmento de programa correspondiente según el número de selección del modo de trabajo
FTAB1: AJMP SETSS
AJMP SETM60
AJMP SETSS
AJMP SETM60
NOP
NOP
AJMP WAITFK
SETSS: MOV DSPLYP, # SL; Establezca el área de visualización en MM: SS
MOV ADDRES, #SH
AJMP WAITFK
SETM60: MOV DSPLYP, #ML; el área de visualización Para HH: MM
MOV ADDRES, #MH
AJMP WAITFK
SETHI: CLR LPLMOD Establezca el bit alto (minutos o bits de tiempo)
SETB HPLMOD; Los dos tubos digitales superiores parpadean
MOV MAX, #31H; El número máximo es 30
MOV A, R4; número de selección de modo
RL A ; amplificación del puntero
MOV DPTR, #FTAB2; Ir a la primera dirección de la tabla
JMP @A DPTR; el segmento de programa correspondiente según el número de selección del modo de trabajo
FTAB2: AJMP SETM30
AJMP SETHH
AJMP SETM30
AJMP SETHH
NOP
NOP
AJMP WAITFK; volver a esperar la liberación de la clave
SETM30: MOV DIRECCIÓN, #MH;
AJMP WAITFK; Gire para esperar la liberación de la clave
SETHH: MOV ADDRES, #HH; Mover en la dirección del bit de tiempo
AJMP WAITFK; para esperar a que se suelte la tecla
ENDMEN: CLR HPLMOD Reanudar sin parpadear Modo de visualización
RET
NOP
NOP
LJMP ERR; Trampa de software
;**** ************
; Procedimientos de trabajo de llegada;
;****************
ACCIÓN: MOV L0, R4; pasar al número de selección del modo de trabajo
INC L0; el número de pantalla "F-0X"
MOV L1
, #00H
MOV L2, #0BH
MOV L3, #00H
SETB LED4
MOV DSPLYP, #L0; Apunte a la memoria de video
SETB LPLMOD; configure el modo de visualización sin parpadear
SETB HPLMOD
MOV A, R4 Vaya al número de selección del modo de trabajo <; /p>
RL A;
MOV DPTR, #A_TAB
JMP @A DPTR; Saltar según el número de selección del modo de trabajo
A_TAB: AJMP ACTF1; Modo de trabajo uno
AJMP ACTF1; Modo de trabajo dos
AJMP ACTF3; Modo de trabajo tres
AJMP ACTF3; p> NOP
NOP
LJMP ERR; Trampa de software
ACTF1: SETB SWITCH; Modo de funcionamiento uno (o dos): Relé de apagado
MOV R_MOD, # 82H; parámetro de modo de timbre #82H
MOV R2, #96H; parámetro de tiempos de timbre #96H
ACTF11: ACALL RING; >
JNB MKEY, ENDACT; Espera a que se presione la tecla
JNB FKEY, ENDACT; Finaliza el timbre cuando se presiona la tecla
DJNZ R2, ACTF11; suena si no se alcanza el número de veces
p>MOV R_MOD, #0FFH; el parámetro #0FF desactiva el timbre
AJMP ACTF11 Regreso sin presionar tecla
> NOP
NOP
ERR LJMP; trampa de software
ACTF3: INTERRUPTOR CLR; modo de trabajo tres (o cuatro): relé abierto
> CLR BELL; el zumbador suena una vez
ACALL DL1S
SETB BELL
MOV R_MOD, #0FFH Parámetro de modo de timbre #0FFH
MOV R2, #96H; parámetro de tiempo de timbre #96H
ACTF31: ACALL RING; llamada a subrutina de timbre
JNB MKEY, ENDACT; JNB FKEY, ENDACT; Finalizar si se presiona la tecla
DJNZ R2, ACTF31; Continuar si el número de veces no está completo
MOV R2, #96H
CL
R BELL; Un pitido corto (Explicación: El parámetro de modo de timbre #0FFH habilita
ACALL DL100; El programa de timbre no es válido y solo funciona como un retraso,
SETB BELL; Cada retraso A pitido corto durante un período de tiempo para
AJMP ACTF31 recordar al usuario que el relé aún está funcionando)
NOP
NOP
LJMP ERR; trampa de software
ENDACT: SETB SWITCH; apagar el relé
AWAITF: ACALL DISPLY; pantalla de llamada
JNB FKEY, AWAITF; soltar
AWAITM: ACALL DISPLY; visualización de llamada
JNB MKEY, AWAITM; esperar a que se suelte la tecla
RET
NOP
NOP
ERR LJMP; Trampa de software
;*****************; *
; programa Ring Bell;
;***************
RING: MOV R5, #18H; R5 es la variable de control del bucle
RING1: JNB MKEY, R_EXIT; escaneo de teclas
JNB FKEY, R_EXIT; salir cuando se presiona la tecla
MOV A, R_MOD ; pasar a los parámetros del modo de timbre
MOV C, ACC.7; cambiar la campana de acuerdo con los parámetros del modo de campana
MOV BELL, C
RL A
MOV R_MOD, A
ACALL DL100; Retraso
DJNZ R5, RING1; control del número de ciclos
R_EXIT: SETB BELL Apagar; el anillo
RET
NOP
NOP
Trampa de software LJMP
;**** ****************
; Programa de visualización;
;***************
DISPLY: PUSH ACC; protección de envío de datos
p>
PUSH PSW
MOV PSW, #10H Seleccione el grupo de registro 2
MOV R0, DSPLYP; Mover puntero de visualización
MOV R2, # 0FDH; R2 almacena el número de luz estroboscópica del tubo digital
MOV A, PLYTS >
JNZ PLAY; si no es 0, pasa a PLAY
MOV PLYTS, #64H; de lo contrario, reasigne el valor
CPL BRIGHT; Invierte los bits indicadores de brillo y apagado
PLAY: DEC PLYTS muestra la cantidad de control del bucle menos 1
JNB LPLMOD, PLAYL; si los dos tubos digitales inferiores no parpadean, significa "PLAYL"
JB BRIGHT, PLAYL; si la indicación de encendido y apagado es 1, significa "PLAYL"
ACALL NOPLAY; de lo contrario, desactiva el retardo
AJMP PLAY1; cambia para mostrar el tubo digital de alto orden
NOP
NOP.
LJMP ERR; Trampa de software
; Se utiliza para mostrar bits bajos
PLAYL: ORL P1, #7FH; Borrar los datos de visualización originales
ORL P3, #3CH; Borrar los datos estroboscópicos
MOV A, R2; Muévase al tubo digital para seleccionar el número
RL A;
ANL P3, A; seleccione el tubo digital de dígitos bajos
MOV R2, A; número de selección de bits de almacenamiento temporal
MOV A, @R0;
MOV DPTR, #TABLE1; Mover en la primera dirección de la tabla
MOVC A, @A DPTR; Buscar tabla
ANL P1, A; Enviar datos de visualización
ACALL DL1MS; Retraso
INC R0; Señale los diez dígitos inferiores
JB P3.3, PLAYL; /p>
PLAY1: JNB HPLMOD, PLAYH; Si los dos dígitos superiores no parpadean, significa "PLAYH"
JB BRIGHT, PLAYH; también "PLAYH"
ACALL NOPLAY; de lo contrario, las luces se apagarán después de un retraso
AJMP OUTPLY Fin de la transferencia
NOP
;NOP
LJMP ERR; trampa de software
usado para mostrar bits altos
PLAYH: ORL P1, #7FH; /p>
ORL P3, #3CH; Borra los datos estroboscópicos originales
ANL P3, #0EFH; Estroboscópico del tubo digital de un solo dígito alto
MOV A, @R0 ; Mover el valor mostrado
MOV DPTR, #TABLE1; Mover la primera dirección de la tabla
MOVC A, @A DPTR Buscar la tabla
<; p>ANL P1 ,A; Enviar datos de visualización
ACALL DL1MS; Retraso
INC R0; Señalar el dígito de las decenas de orden superior <; /p >
ORL P1, #7FH; Borrar datos de visualización
ORL P3, #3CH; Borrar datos estroboscópicos
ANL P3, #0DFH; de luz estroboscópica
MOV A, @R0; mover para mostrar el valor
MOV C, LED4; aumento del puntero + estado de luz pequeña
RLC A
MOV DPTR, #TABLE2; Ir a la primera dirección de la tabla
MOVC A, @A DPTR; Buscar la tabla
ANL P1, A; datos
ACALL DL1MS; Retraso
SALIDA: POP PSW Recuperar datos
POP ACC
RET
NOP
NOP
ERR LJMP; trampa de software
TABLA1: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H , 0BFH, 8EH, 0FFH
p>"0", "1", "2", "3", "4", "5", "6", "7", "8 ", "9", "-", "F", " "
TABLA2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
; " ", " : ", "1", "1:", "2", "2:", "3", "3:", "-", "-:"
;****** ***************
; Programa sin visualización (luces apagadas);
; ************ *************
NOPLAY: ORL P1, #7FH borrar datos de visualización
ORL P3, #3CH; borrar datos estroboscópicos
INC R0 incrementos del puntero en 2
INC R0
ACALL DL1MS
RET
NOP
NOP
LJMP ERR; Trampa de software
;
;**** ****************** *
; Programa de retraso;
;************ ******
DL1MS: MOV R3, #0F9H
; Delay 1250US solo llamado por DISPLY
DL1MS1: NOP
NOP
NOP
DJNZ R3, DL1MS1
RET
NOP
NOP
ERR LJMP; Trampa de software
TECLA: CLR BELL; Programa de retardo dedicado para la eliminación de la inquietud de las teclas,
ACALL DISPLY Emite un tono de aviso de tecla mientras elimina la inquietud
SETB BELL
RET
NOP
NOP
ERR LJMP; trampa de software
DL50MS: MOV R7, #0AH; programa de retraso de 50 milisegundos
DL50M1: ACALL DISPLY; muestra el programa 5MS cada vez que se llama
DJNZ R7, DL50M1 llamado 10 veces
RET
NOP
NOP<; /p>
ERR LJMP; Trampa de software
DL100: ACALL DL50MS; Retraso 100 milisegundos
ACALL DL50MS
RET
NOP
NOP
ERR LJMP; Trampa de software
DL05S: ACALL DL100; Retraso 0,5 segundos
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
NOP
NOP
LJMP ERR; Trampa de software
;
DL1S: ACALL DL05S; Retardo 1 segundo
ACALL DL05S
RET
p>NOP
NOP
ERR LJMP; Trampa de software
;
;*** ***** **********************
; programa ERR (manejo de errores);
;** ***** ***********************
ERR: CLR EA; desactivar interrupción
MOV DPTR, #ERR1; Preparar dirección de devolución
PUSH DPL; Empujar pila
PUSH DPH;
RETI; Interrumpir devolución
ERR1: MOV 56H , #0AAH; Establecer indicador de encendido (indicador de error)
MOV 57H, #55H
MOV A, #00H; Preparar dirección de devolución
PUSH ACC; Empujar pila
PUSH ACC
Interrumpir devolución
p>p>
NOP
NOP
LJMP ERR; trampa de software
ORG 07FAH
NOP p>
NOP
NOP
LJMP ERR; Trampa de software
FIN del programa