list p=16f877
include p16f877.inc
__CONFIG _CP_OFF&_WDT_OFF&_DEBUG_OFF&_CPD_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_XT_OSC
;__config 0x3F18
cblock 0x20
TECLA ;valor de tecla pulsada
SN ;valor de tecla si/no
CONT ;para retardo
LCD_ApuntaCaracter ; posición del carácter a visualizar respecto del comienzo
LCD_ValorCaracter ; Código ASCII del carácter a visualizar
;Caract
LCD_Dato
LCD_GuardaDato
LCD_GuardaTRISD
LCD_Auxiliar1
LCD_Auxiliar2
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
endc
LCD_CPorLinea EQU .16
#DEFINE LCD_PinRS PORTE,0
#DEFINE LCD_PinRW PORTE,1
#DEFINE LCD_PinEnable PORTE,2
#DEFINE LCD_BusDatos PORTD
;::::::::::::::::::::::::::::::::::::::::::::::::::::
org 0x00
MOVLW b'00000000'
MOVWF INTCON ; deshabilitamos GIE y T0IE
BCF STATUS,RP0
INI
bsf STATUS,RP0 ; Cambio a banco 1
;PUERTO C, CONTROL DE TECLADO MATRICIAL
movlw 0x38 ; RC3, RC4 y RC5 como entradas: columnas
movwf TRISC ; y RC2, RC1 y RC0 como salidas: filas
;PUERTOS A Y B PARA TTL TESTER, SE CONFIGURARÁN DEPENDIENDO DE LO QUE SE REQUIERA
;PUERTO D PARA BUS DE DATOS DE LCD
clrf TRISD ; Puerto D como salida
;PUERTO E PARA CONTROL DE LCD
;E0 RS
;E1 R/W
;E2 EN
bsf STATUS,RP0 ; Cambio a banco 1
clrf TRISE ; Puerto E como salida
;
BCF STATUS, RP1 ; Bank0
;CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
BSF STATUS, RP0 ; Selecciona Banco 1
MOVLW 0x06 ; Configura los pines de PTOA y PTOE
MOVWF ADCON1 ; como i/o digital
MOVLW 0x00 ;
MOVWF TRISE; PUERTO E COMO SALIDA DIGITAL
;INICIALIZAR LCD CON BUS DE 8 BITS
INI_LCD
call LCD_Inicializa
;ESCRIBIR EL LA LCD: ELIJA COMPUERTA
Inicio
movlw Mensaje0 ; Carga la posición del mensaje inicial.
call LCD_Mensaje ; Visualiza el mensaje.
PRINCIPAL
call TTL ; Llamar a rutina de teclado
goto PRINCIPAL ; Ejecución cíclica del programa
;LEE TECLADO
TTL
clrf TECLA ; Limpiar variable TECLA
movlw b'00000110' ; Poner un cero en la primer
movwf PORTC ; fila del puerto C (RC0)
CHECA_COL
btfss PORTC,3 ; Si al 1er columna es "0"
goto ANTIRREBOTES ; salta a la rutina ANTIRREBOTES
incf TECLA,f ; Si es "1" incrementa TECLA
btfss PORTC,4 ; Si la 2da columna es "0"
goto ANTIRREBOTES ; salta a la rutina ANTIRREBOTES
incf TECLA,f ; Si es "1" incrementa TECLA
;para que despues de revisar teclas, si ni ha habido alguna
;pulsación regrese a revisar la tecla 0 o recorra el 0 en las filas
movlw d'5'
subwf TECLA,w
btfsc STATUS,Z ; si ha revisado todas las teclas y nunguna ha sido pulsada
goto TTL ; reiniciará la revisión del teclado
bsf STATUS,C ; si no ha terminado con la revisión del teclado
rlf PORTC,f ; rotará el 0 a la siguiente fila
goto CHECA_COL ; revisará las columnas
ANTIRREBOTES
C1 btfss PORTC,3
goto C1
C2 btfss PORTC,4
goto C2
movf TECLA,w
call COMPUERTA
; goto SI_NO
; return
; Mensaje: ¿Revisar otra?
movlw Mensaje13 ; Carga la posición del mensaje inicial.
call LCD_Borra ;
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
SI_NO
clrf SN ; Limpiar variable SN
movlw b'00000110' ; Poner un cero en la primer
movwf PORTC ; fila del puerto C (RC0)
CHECA_COLSI
btfss PORTC,5 ; Si la columna es "0" (TECLA SI: PRESIONADA)
goto TTL ; regresa a leer el teclado
incf SN,F
movlw d'2'
subwf SN,w
btfsc STATUS,Z
goto TTL
bsf STATUS,C
rlf PORTC,f
btfss PORTC,5 ; Si la columna es "0" (TECLA NO: PRESIONADA)
goto final ; sale del programa
goto CHECA_COLSI ; ningún botón ha sido pulsado, regresa a revisar teclado
COMPUERTA
addwf PCL,F ; Salta a la configuración adecuada.
;Tabla
goto AND
goto NOT
goto NOR
goto OR
goto NAND
goto XOR
AND
movlw 0x0D
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISA ; configurar las entradas y salidas de la compuerta AND
bcf STATUS,RP0 ; Cambio a banco 0
movlw 0x9B ;
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISB ;
bcf STATUS,RP0 ; Cambio a banco 0
;Escribe AND en la LCD
movlw Mensaje1 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
;------------------------------
;REVISA COMPUERTA AND1 DEL INTEGRADO
bcf PORTA,3
bcf PORTA,2
btfsc PORTA,1
call E1
bcf PORTA,3
bsf PORTA,2
btfsc PORTA,1
call E1
bsf PORTA,3
bsf PORTA,2
btfss PORTA,1
call E1
;-----------------
;REVISA COMPUERTA AND2 DEL INTEGRADO
bcf PORTA,0
bcf PORTB,7
btfsc PORTB,6
call E2
bcf PORTA,0
bsf PORTB,7
btfsc PORTB,6
call E2
bsf PORTA,0
bsf PORTB,7
btfss PORTB,6
call E2
;----------------------
;REVISA COMPUERTA AND3 DEL INTEGRADO
bcf PORTB,0
bcf PORTB,1
btfsc PORTB,2
call E3
bcf PORTB,0
bsf PORTB,1
btfsc PORTB,2
call E3
bsf PORTB,0
bsf PORTB,1
btfss PORTB,2
call E3
;------------------------
;REVISA COMPUERTA AND4 DEL INTEGRADO
bcf PORTB,3
bcf PORTB,4
btfsc PORTB,5
call E4
bcf PORTB,3
bsf PORTB,4
btfsc PORTB,5
call E4
bsf PORTB,3
bsf PORTB,4
btfss PORTB,5
call E4
goto fin_comp
OR
movlw 0x0D
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISA ; configurar las entradas y salidas de la compuerta OR
movlw 0x9B ;
movwf TRISB ;
bcf STATUS,RP0 ; Cambio a banco 1
movlw Mensaje2 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
;-----------------------------------
;REVISA COMPUERTA OR1 DEL INTEGRADO
bcf PORTA,3
bcf PORTA,2
btfsc PORTA,1
call E1
bcf PORTA,3
bcf PORTA,2
btfss PORTA,1
call E1
bsf PORTA,3
bsf PORTA,2
btfss PORTA,1
call E1
;-----------------------------------
;REVISA COMPUERTA OR2 DEL INTEGRADO
bcf PORTA,0
bcf PORTB,7
btfsc PORTB,6
call E2
bcf PORTA,0
bcf PORTB,7
btfss PORTB,6
call E2
bsf PORTA,0
bsf PORTB,7
btfss PORTB,6
call E2
;-----------------------------------
;REVISA COMPUERTA OR3 DEL INTEGRADO
bcf PORTB,0
bcf PORTB,1
btfsc PORTB,2
call E3
bcf PORTB,0
bcf PORTB,1
btfss PORTB,2
call E3
bsf PORTB,0
bsf PORTB,1
btfss PORTB,2
call E3
;-----------------------------------
;REVISA COMPUERTA OR4 DEL INTEGRADO
bcf PORTB,3
bcf PORTB,4
btfsc PORTB,5
call E4
bcf PORTB,3
bcf PORTB,4
btfss PORTB,5
call E4
bsf PORTB,3
bsf PORTB,4
btfss PORTB,5
call E4
goto fin_comp
NOT
movlw 0x0A
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISA ; configurar las entradas y salidas de la compuerta NOT
movlw 0x95 ;
movwf TRISB ;
bcf STATUS,RP0 ; Cambio a banco 1
movlw Mensaje3 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
bcf PORTA,3
btfss PORTA,2
call E1
;-----------------------------------
;REVISA COMPUERTA NOT1 DEL INTEGRADO
bcf PORTA,1
btfss PORTA,0
call E1
;-----------------------------------
;REVISA COMPUERTA NOT2 DEL INTEGRADO
bcf PORTB,7
btfss PORTB,6
call E2
;-----------------------------------
;REVISA COMPUERTA NOT3 DEL INTEGRADO
bcf PORTB,0
btfss PORTB,1
call E3
;-----------------------------------
;REVISA COMPUERTA NOT4 DEL INTEGRADO
bcf PORTB,2
btfss PORTB,3
call E4
;-----------------------------------
;REVISA COMPUERTA NOT5 DEL INTEGRADO
bcf PORTB,4
btfss PORTB,5
call E5
;-----------------------------------
;REVISA COMPUERTA NOT6 DEL INTEGRADO
bcf PORTB,6
btfss PORTB,7
call E6
goto fin_comp
NAND
movlw 0x0D
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISA ; configurar las entradas y salidas de la compuerta OR
movlw 0x9B ;
movwf TRISB ;
bcf STATUS,RP0 ; Cambio a banco 1
movlw Mensaje4 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
;-----------------------------------
;REVISA COMPUERTA NAND1 DEL INTEGRADO
bcf PORTA,3
bcf PORTA,2
btfss PORTA,1
call E1
bcf PORTA,3
bsf PORTA,2
btfss PORTA,1
call E1
bsf PORTA,3
bsf PORTA,2
btfsc PORTA,1
call E1
;-----------------------------------
;REVISA COMPUERTA NAND2 DEL INTEGRADO
bcf PORTA,0
bcf PORTB,7
btfss PORTB,6
call E2
bcf PORTA,0
bsf PORTB,7
btfss PORTB,6
call E2
bsf PORTA,0
bsf PORTB,7
btfsc PORTB,6
call E2
;-----------------------------------
;REVISA COMPUERTA NAND3 DEL INTEGRADO
bcf PORTB,0
bcf PORTB,1
btfss PORTB,2
call E3
bcf PORTB,0
bsf PORTB,1
btfss PORTB,2
call E3
bsf PORTB,0
bsf PORTB,1
btfsc PORTB,2
call E3
;-----------------------------------
;REVISA COMPUERTA NAND4 DEL INTEGRADO
bcf PORTB,3
bcf PORTB,4
btfss PORTB,5
call E4
bcf PORTB,3
bsf PORTB,4
btfss PORTB,5
call E4
bsf PORTB,3
bsf PORTB,4
btfsc PORTB,5
call E4
goto fin_comp
NOR
movlw 0x06
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISA ; configurar las entradas y salidas de la compuerta OR
movlw 0xF6 ;
movwf TRISB ;
bcf STATUS,RP0 ; Cambio a banco 0
movlw Mensaje5 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
;-----------------------------------
;REVISA COMPUERTA NOR1 DEL INTEGRADO
bcf PORTA,3
bcf PORTA,2
btfss PORTA,1
call E1
bcf PORTA,3
bsf PORTA,2
btfsc PORTA,1
call E1
bsf PORTA,3
bsf PORTA,2
btfsc PORTA,1
call E1
;-----------------------------------
;REVISA COMPUERTA NOR2 DEL INTEGRADO
bcf PORTA,0
bcf PORTB,7
btfss PORTB,6
call E2
bcf PORTA,0
bsf PORTB,7
btfsc PORTB,6
call E2
bsf PORTA,0
bsf PORTB,7
btfsc PORTB,6
call E2
;-----------------------------------
;REVISA COMPUERTA NOR3 DEL INTEGRADO
bcf PORTB,0
bcf PORTB,1
btfss PORTB,2
call E3
bcf PORTB,0
bsf PORTB,1
btfsc PORTB,2
call E3
bsf PORTB,0
bsf PORTB,1
btfsc PORTB,2
call E3
;-----------------------------------
;REVISA COMPUERTA NOR4 DEL INTEGRADO
bcf PORTB,3
bcf PORTB,4
btfss PORTB,5
call E4
bcf PORTB,3
bsf PORTB,4
btfsc PORTB,5
call E4
bsf PORTB,3
bsf PORTB,4
btfsc PORTB,5
call E4
movlw Mensaje5 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
XOR
movlw 0x0D
bsf STATUS,RP0 ; Cambio a banco 1
movwf TRISA ; configurar las entradas y salidas de la compuerta OR
movlw 0x9B ;
movwf TRISB ;
bcf STATUS,RP0 ; Cambio a banco 1
movlw Mensaje6 ; Carga la posición del mensaje.
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
;-----------------------------------
;REVISA COMPUERTA XOR1 DEL INTEGRADO
bcf PORTA,3
bcf PORTA,2
btfss PORTA,1
call E1
bsf PORTA,3
bcf PORTA,2
btfsc PORTA,1
call E1
bsf PORTA,3
bsf PORTA,2
btfss PORTA,1
call E1
;-----------------------------------
;REVISA COMPUERTA XOR2 DEL INTEGRADO
bcf PORTA,0
bcf PORTB,7
btfss PORTB,6
call E2
bsf PORTA,0
bcf PORTB,7
btfsc PORTB,6
call E2
bsf PORTA,0
bsf PORTB,7
btfss PORTB,6
call E2
;-----------------------------------
;REVISA COMPUERTA XOR3 DEL INTEGRADO
bcf PORTB,0
bcf PORTB,1
btfss PORTB,2
call E3
bsf PORTB,0
bcf PORTB,1
btfsc PORTB,2
call E3
bsf PORTB,0
bsf PORTB,1
btfss PORTB,2
call E3
;-----------------------------------
;REVISA COMPUERTA XOR4 DEL INTEGRADO
bcf PORTB,3
bcf PORTB,4
btfss PORTB,5
call E4
bsf PORTB,3
bcf PORTB,4
btfsc PORTB,5
call E4
bsf PORTB,3
bsf PORTB,4
btfss PORTB,5
call E4
goto fin_comp
fin_comp
return
;** FIN SUBRUTINA REVISIÓN DE TTLs **
;***Subrutina de Inicialización de LCD
LCD_Inicializa
bsf STATUS,RP0 ; Configura las líneas conectadas al pines RS,
bcf LCD_PinRS ; R/W y E.
bcf STATUS,RP0
bcf LCD_PinEnable
bsf STATUS,RP0
bcf LCD_PinRW
bcf STATUS,RP0
bsf STATUS,RP0
bcf LCD_PinRW ; En caso de que esté conectado le indica
; que se va a escribir en el LCD.
bcf STATUS,RP0
bcf LCD_PinEnable ; Impide funcionamiento del LCD poniendo E=0.
bcf LCD_PinRS ; Activa el Modo Comando poniendo RS=0.
call Retardo_200ms
movlw b'00111000'
call LCD_Envia ; Escribe el dato en el LCD.
call Retardo_5ms
movlw b'00110000'
call LCD_Envia
call Retardo_200micros
movlw b'00110000'
call LCD_Envia
call Retardo_200micros ; Este retardo es necesario para simular en PROTEUS.
movlw b'00110000' ; Interface de 8 bits.
call LCD_Envia
call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.
; Ahora configura el resto de los parámetros:
call LCD_2Lineas8Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos, bus de 8.
call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio
call LCD_CursorOFF ; de la línea 1. Cursor apagado.
call LCD_CursorIncr ; Cursor en modo incrementar.
return
;Subrutinas para inicializacion LCD
LCD_CursorOFF ; Pantalla encendida y cursor apagado.
movlw b'00001100'
goto LCD_EnviaComando
LCD_Borra ; Borra toda la pantalla, memoria DDRAM y pone el
movlw b'00000001' ; cursor a principio de la línea 1.
goto LCD_EnviaComando
LCD_CursorIncr ; Cursor en modo incrementar.
movlw b'00000110'
goto LCD_EnviaComando
LCD_2Lineas8Bits5x7 ; Define la pantalla de 2 líneas, con caracteres
movlw b'00111000' ; de 5x7 puntos y conexión al PIC mediante bus de
goto LCD_EnviaComando ; 8 bits.
LCD_EnviaComando
bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0.
goto LCD_Envia
Caract
bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1.
LCD_Envia
movwf LCD_GuardaDato ; Guarda el dato a enviar.
bsf STATUS,RP0 ; Acceso al Banco 1.
movf TRISD,W ; Guarda la configuración que tenía antes TRISD.
movwf LCD_GuardaTRISD
clrf TRISD ; Puerto D como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
;
movf LCD_GuardaDato,W ; Recupera el dato a enviar.
movwf LCD_BusDatos ; Envía el dato al módulo LCD.
bcf STATUS,RP0
bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño
nop
bcf STATUS,RP0
bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.
bsf STATUS,RP0 ; Acceso al Banco 1. Restaura el antiguo valor en
movf LCD_GuardaTRISD,W ; la configuración del Puerto B.
movwf TRISD
bcf STATUS,RP0 ; Acceso al Banco 0.
btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo
call Retardo_20ms ; 2 ms en modo comando y 50 µs en modo cáracter.
call Retardo_50micros
return
; ***SUBRUTINAS DE MENSAJES***
LCD_Mensaje
movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.
movlw Mensajes ; Halla la posición relativa del primer carácter
subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes".
decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".
LCD_VisualizaOtroCaracter
movf LCD_ApuntaCaracter,W
call Mensajes ; Obtiene el código ASCII del carácter apuntado.
movwf LCD_ValorCaracter ; Guarda el valor de carácter.
movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
btfsc STATUS,Z ; que sea "0x00", que es código indicador final
goto LCD_FinMensaje ; de mensaje, sale fuera.
LCD_NoUltimoCaracter
call Caract ; Visualiza el carácter ASCII leído.
incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter
goto LCD_VisualizaOtroCaracter ; dentro del mensaje.
LCD_FinMensaje
return
;Tabla de contenido de mensajes
Mensajes
addwf PCL,F
Mensaje0 ; Mensaje de inico
DT "ELIJA COMPUERTA", 0x0E ; Terminación de mensaje
Mensaje1 ; Mensaje compuerta AND
DT "AND", 0x08 ; Terminación de mensaje
Mensaje2 ; Mensaje compuerta OR
DT "OR", 0x08 ; Terminación de mensaje
Mensaje3 ; Mensaje compuerta NOT
DT "NOT", 0x08 ; Terminación de mensaje
Mensaje4 ; Mensaje compuerta NAND
DT "NAND", 0x08 ; Terminación de mensaje
Mensaje5 ; Mensaje compuerta NOR
DT "NOR", 0x08 ; Terminación de mensaje
Mensaje6 ; Mensaje compuerta XOR
DT "XOR", 0x08 ; Terminación de mensaje
Mensaje7 ; Mensaje compuerta E1
DT "Error Compuerta1", 0x0F ; Terminación de mensaje
Mensaje8 ; Mensaje compuerta E2
DT "Error Compuerta2", 0x0F ; Terminación de mensaje
Mensaje9 ; Mensaje compuerta E3
DT "Error Compuerta3", 0x0F ; Terminación de mensaje
Mensaje10 ; Mensaje compuerta E4
DT "Error Compuerta4", 0x0F ; Terminación de mensaje
Mensaje11 ; Mensaje compuerta E5
DT "Error Compuerta5", 0x0F ; Terminación de mensaje
Mensaje12 ; Mensaje compuerta E6
DT "Error Compuerta6", 0x0F ; Terminación de mensaje
Mensaje13 ; Mensaje compuerta E6
DT "¿Revisar otra?", 0x0E ; Terminación de mensaje
FinMensajes
;Errores
E1
movlw Mensaje7 ; Carga la posición del mensaje.
call LCD_Borra ;borra LCD
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
return
E2
movlw Mensaje8 ; Carga la posición del mensaje.
call LCD_Borra ;borra LCD
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
return
E3
movlw Mensaje9 ; Carga la posición del mensaje.
call LCD_Borra ;borra LCD
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
return
E4
movlw Mensaje10 ; Carga la posición del mensaje.
call LCD_Borra ;borra LCD
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
return
E5
movlw Mensaje11 ; Carga la posición del mensaje.
call LCD_Borra ;borra LCD
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
return
E6
movlw Mensaje12 ; Carga la posición del mensaje.
call LCD_Borra ;borra LCD
call LCD_Mensaje ; Visualiza el mensaje.
call Retardo_500ms
return
;***RETARDOS***
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'164' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_200micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'64' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_100micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'31' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'14' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_20micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "K".
RetardoMicros
movwf R_ContA ; Aporta 1 ciclo máquina.
Rmicros_Bucle
decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto Rmicros_Bucle ; Aporta (K-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_50ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_20ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_10ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_5ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_2ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'2' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M".
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "N".
Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
final
end