 
;**********************************************************************************************

;********* PROGRAMA PARA EL CONTROL GENERAL DE LA MÁQUINA REVELADORA DE RADIOGRAFÍAS **********
                                                
;********************************************************************************************** 


;******************** ASIGNACIÓN DE LAS DIRECCIONES DE LA MEMORIA EXTERNA ********************* 

;DIRECCIÓN 00 = NVL_SEC 

;DIRECCIÓN 01 = RET_DIS

;DIRECCIÓN 02 = NVL_CON

;DIRECCIÓN 03 = NVL_BRL

;DIRECCIÓN 04 = NVL_REF_INF

;DIRECCIÓN 05 = NVL_REF_NOR

;DIRECCIÓN 06 = NVL_REF_SUP

;DIRECCIÓN 07 = VEL_PRO

;DIRECCIÓN 08 = EST_BUZ

;DIRECCIÓN 09 = PEL_PRO

;DIRECCIÓN 0A = FLG_INI_PRO

;DIRECCIÓN 0B = FLG_FIN_PRO

;DIRECCIÓN 0C = DIG_001

;DIRECCIÓN 0D = DIG_002

;DIRECCIÓN 0E = DIG_003

;DIRECCIÓN 0F = DIG_004

;**********************************************************************************************


;********************************** DIRECTIVAS DEL PROGRAMA ***********************************
                                              
LIST       P=16f877A           ;SE EMPLEA EL PIC16F77
     
#include <P16f877A.inc> 

;****************************** REGISTROS DE PROPÓSITO GENERAL ********************************


;*********************** REGISTROS A UTILIZAR PARA EL MANEJO DEL PUERTO I2C *******************

SEL_DIS_I2C  EQU  0x20        ;REGISTRO QUE SE VA A UTILIZAR PARA INDICAR EL DISPOSITIVO
                              ;SELECCIONADO POR EL PUERTO I2C 

DIR_DIS_I2C  EQU  0x21        ;REGISTRO QUE SE VA A UTILIZAR PARA INDICAR LA DIRECCÍON DEL   
                              ;DISPOSITIVO SELECCIONADO EN EL QUE SE VA A LEER Ó ESCRIBIR UN
                              ;DATO

DAT_DIS_I2C  EQU  0x22        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL DATO A ESCRIBIR EN EL   
                              ;DISPOSITIVO SELECCIONADO POR EL PUERTO I2C 

DAT_OBT_I2C  EQU  0x23        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL DATO LEÍDO DEL DISPOSITIVO  
                              ;SELECCIONADO POR EL PUERTO I2C    

DAT_ESC_I2C  EQU  0x24        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL DATO QUE CORRRESPONDA A LA    
                              ;SECUENCIA QUE SE EJECUTA POR EL PUERTO I2C 

CON_DAT_I2C  EQU  0x25        ;REGISTRO A UTILIZAR PARA CONTROLAR LOS DATOS QUE SE VAN A GRABAR        
                              ;Ó LEER EN EL DISPOSITIVO SELECCIONADO POR EL PUERTO I2C
   
FLG_ERR_I2C  EQU  0x26        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE PRODUJO UN 
                              ;ERROR DE ESCRITURA Ó LECTURA EN EL PUERTO I2C

DAT_001      EQU  0x27        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA PRIMERA
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA   

DAT_002      EQU  0x28        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA SEGUNDA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_003      EQU  0x29        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA TERCERA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_004      EQU  0x2A        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA CUARTA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_005      EQU  0x2B        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA QUINTA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_006      EQU  0x2C        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA SEXTA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_007      EQU  0x2D        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA SÉPTIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_008      EQU  0x2E        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA OCTAVA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_009      EQU  0x2F        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA NOVENA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_010      EQU  0x30        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA DÉCIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_011      EQU  0x31        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA UN DECIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_012      EQU  0x32        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA UN DECIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_013      EQU  0x33        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA NOVENA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_014      EQU  0x34        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA DÉCIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_015      EQU  0x35        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA UN DECIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

DAT_016      EQU  0x36        ;REGISTRO EN EL QUE DEPOSITARÁ EL DATO OBTENIDO DE LA UN DECIMA 
                              ;DIRECCIÓN LEÍDA DE LA MEMORIA  

;**********************************************************************************************

;******** REGISTROS A UTILIZAR PAPA EL MANEJO DE LOS CONVERSORES ANALÓGICOS/DIGITALES *********

DAT_OBT_CAD  EQU  0x37        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR OBTENIDO DE LA 
                              ;CONVERSIÓN ANALÓGICA DIGITAL

VAL_RES_CAD  EQU  0x38        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL VALOR DEL RESULTADO DE LAS
                              ;OPERACIONES MATEMÁTICAS DELL PROCESO DE CONVERSÍON A/D

;**********************************************************************************************


;*********** REGISTRO A UTILIZAR PARA EL MANEJO DE LOS PARAMETROS DE FUNCIONAMIENTO ***********

NVL_SEC      EQU  0x39        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL NIVEL DE SECADO               

RET_DIS      EQU  0x3A        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL RETARDO DE DISPARO
                              ;PARA CONTROLAR EL NIVEL DE SEACDO                

NVL_CON      EQU  0x3B        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL NIVEL DE CONTRASTE DE 
                              ;LA PANTALLA  

NVL_BRL      EQU  0x3C        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL NIVEL DE BRILLO DE LA
                              ;PANTALLA

NVL_REF_NOR  EQU  0x3D        ;REGISTRO QUE VA UTILIZAR EL PROCESO DE CONVERSIÓN A/D PARA CARGAR 
                              ;EL VALOR QUE CORRESPONDE AL NIVEL DE TEMPERATURA NORMAL DEL QUÍMICO
                              ;(35° 3.50V)                          

NVL_REF_INF  EQU  0x3E        ;REGISTRO QUE VA UTILIZAR EL PROCESO DE CONVERSIÓN A/D PARA CARGAR
                              ;EL VALOR QUE CORRESPONDE AL NIVEL DE TEMPERATURA INFERIOR DEL 
                              ;QUÍMICO (33° 3.30V)                          

NVL_REF_SUP  EQU  0x3F        ;REGISTRO QUE VA UTILIZAR EL PROCESO DE CONVERSIÓN A/D PARA CARGAR 
                              ;EL VALOR QUE CORRESPONDE AL NIVEL DE TEMPERATURA SUPERIOR DEL 
                              ;QUÍMICO (37° 3.70V)
  
VEL_PRO      EQU  0x40        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL VALOR DE LA VELOCIDAD DE 
                              ;PROCESO                

EST_BUZ      EQU  0x41        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL ESTADO DEL BUZZER, ACTIVADO Ó
                              ;DESACTIVADO          

PEL_PRO      EQU  0x42        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL VALOR DEL CONTADOR
                              ;DE LAS PELICULAS PROCESADAS
                         
CON_RET_SEC  EQU  0x43        ;REGISTRO QUE SE VA A UTILIZAR PARA CONTROLAR EL MODULADOR DE ANCHO
                              ;DE PULSOS

DIG_001      EQU  0x44        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL PRIMER DÍGITO DEL    
                              ;CÓDIGO DE SEGURIDAD

DIG_002      EQU  0x45        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL SEGUNDO DÍGITO DEL    
                              ;CÓDIGO DE SEGURIDAD

DIG_003      EQU  0x46        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL TERCER DÍGITO DEL    
                              ;CÓDIGO DE SEGURIDAD

DIG_004      EQU  0x47        ;REGISTRO EN EL QUE DEPOSITARÁ EL VALOR DEL CUARTO DÍGITO DEL    
                              ;CÓDIGO DE SEGURIDAD

;**********************************************************************************************


;**** REGISTRO A UTILIZAR PARA CONTROLAR LOS NIVELES DE LOS PARAMETROS DE FUNCIONAMIENTO ****** 

NVL_PAT      EQU  0x48        ;REGISTRO QUE SE UTILIZARÁ PARA MODIFICAR EL VALOR DEL  
                              ;PARÁMETRO SELECCIONADO

NVL_REF_MAX  EQU  0x49        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL VALOR DE REFERENCIA MÁXIMO
                              ;QUE SE CARGARÁ, EN EL PARÁMETRO SELECCIONADO

NVL_REF_MIN  EQU  0x4A        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL VALOR DE REFERENCIA MÍNIMO
                              ;QUE SE CARGARÁ EN EL PARÁMETRO SELECCIONADO

VAL_REF_VEL  EQU  0x4B        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL VALOR DE REFERENCIA DE 
                              ;COMPARACIÓN PARA EL CONTROL DE LA VELOCIDAD DE PROCESO  

;**********************************************************************************************


;****** REGISTROS A UTLILIZAR COMO INDICADORES DE ESTADOS DE FUNCIONAMIENTO EN GENERAL ********  

FLG_INI_PRO  EQU  0x4C        ;REGISTRO QUE SE VA A UTILIZAR PARA PARA DETERMINAR SI EL PROCESO 
                              ;DE REVELADO COMENZÓ CORRECTAMENTE  

FLG_FIN_PRO  EQU  0x4D        ;REGISTRO QUE SE VA A UTILIZAR PARA PARA DETERMINAR SI EL PROCESO 
                              ;DE REVELADO FINALIZÓ CORRECTAMENTE 

FLG_EST_SPF  EQU  0x4E        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR EL ESTADO DEL SENSOR
                              ;FINAL DE PELÍCULA    

FLG_TEM_050  EQU  0x4F        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI LA TEMPORIZACIÓN
                              ;GENERADA POR CON_004 LLEGÓ A 50 MILISEGUNDOS
  
FLG_TEM_100  EQU  0x50        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI LA TEMPORIZACIÓN
                              ;GENERADA POR CON_004 LLEGÓ A 100 MILISEGUNDOS         

FLG_NVL_SEC  EQU  0x51        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE MODIFICARON
                              ;LOS VALORES DEL NIVEL DE SECADO
  
FLG_NVL_CON  EQU  0x52        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE MODIFICARON
                              ;LOS VALORES DEL NIVEL DE CONTRASTE

FLG_NVL_BRL  EQU  0x53        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE MODIFICARON
                              ;LOS VALORES DEL NIVEL DE BRILLO

FLG_NVL_REV  EQU  0x54        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE MODIFICARON
                              ;LOS VALORES DEL NIVEL DE REFERENCIA       

FLG_VEL_PRO  EQU  0x55        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE MODIFICÓ
                              ;LA VELOCIDAD DE PROCESO
 
FLG_EST_BUZ  EQU  0x56        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE MODIFICÓ EL 
                              ;ESTADO DEL BUZZER

FLG_EST_BUF  EQU  0x57        ;REGISTRO QUE SE SE VA A UTILIZAR PARA DETERMINAR SI EL BUFFER DE 
                              ;RECEPCIÓN ESTA LLENO Ó NO

FLG_SAL_SEC  EQU  0x58        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI SE DEBE ACTIVAR  
                              ;Ó NO EL MODULADOR DE ANCHO DE ANCHO DE PULSO  

FLG_NVL_NOR  EQU  0x59        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI LA TEMPERATURA
                              ;DEL QUÍMICO LLEGÓ A SU NIVEL NORMAL 

FLG_NVL_INF  EQU  0x5A        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI LA TEMPERATURA
                              ;DEL QUÍMICO DISMINUYÓ POR DEBAJO DEL NIVEL MÍNIMO ADMITIDO

FLG_NVL_SUP  EQU  0x5B        ;REGISTRO QUE SE VA A UTILIZAR PARA DETERMINAR SI LA TEMPERATURA
                              ;DEL QUÍMICO AUMENTÓ POR ENCIMA DEL NIVEL MÍNIMO ADMITIDO

FLG_VAL_INF  EQU  0x5C        ;REGISTRO QUE SE VA A UTILIZAR PARA INDICAR SI EL VALOR OBTENIDO                    
                              ;DE LA CONVERSÍON ANALÓGICA DIGITAL, ES INFERIOR A NVL_REF_NOR
 
FLG_VAL_NOR  EQU  0x5D        ;REGISTRO QUE SE VA A UTILIZAR PARA INDICAR SI EL VALOR OBTENIDO                    
                              ;DE LA CONVERSÍON ANALÓGICA DIGITAL, ES IGUAL A NVL_REF_NOR
 
FLG_VAL_SUP  EQU  0x5E        ;REGISTRO QUE SE VA A UTILIZAR PARA INDICAR SI EL VALOR OBTENIDO                    
                              ;DE LA CONVERSÍON ANALÓGICA DIGITAL, ES SUPERIOR A NVL_REF_NOR

FLG_NVL_REF  EQU  0x5F        ;REGISTRO QUE SE UTILIZARÁ PARA DETERMINTAR SI EL PARÁMETRO
                              ;SELECCIONADO LLEGÓ A SU NIVEL MÁXIMO Ó MÍNIMO 

;**********************************************************************************************


;***** REGISTROS A UTILIZAR PARA EL ENVÍO DE LOS MENSAJES HACIA EL CONTROL DE LA PANTALLA ***** 

ERR_NUM_XX   EQU  0x60        ;REGISTRO EN EL QUE SE DEPOSITARÁ EL NÚMERO DE ERROR REGISTRADO 

;**********************************************************************************************


;******************* REGISTROS A UTILIZAR PARA EL MANEJO DE LOS CONTADORES ********************

CON_001      EQU  0x61        ;REGISTRO A UTILIZAR PARA CONTEO GENERAL
CON_002      EQU  0x62        ;REGISTRO A UTILIZAR PARA CONTEO GENERAL
CON_003      EQU  0x63        ;REGISTRO A UTILIZAR PARA CONTEO GENERAL
CON_004      EQU  0x64        ;REGISTRO A TILIZAR PARA LA TEMPORIZACÍON DE 100 MILISEGUNDOS

CON_005      EQU  0x65        ;REGISTRO A UTILIZAR PARA EL CONTROL DEL TEMPORIZADOR DE 1 MINUTO
CON_006      EQU  0x66        ;REGISTRO A UTILIZAR PARA EL CONTROL DEL TEMPORIZADOR DE 1 MINUTO

FLG_CON_002  EQU  0x67        ;REGISTRO QUE SE UTILIZARÁ PARA DETERMINAR EL ESTADO DE CON_002 
FLG_CON_003  EQU  0x68        ;REGISTRO QUE SE UTILIZARÁ PARA DETERMINAR EL ESTADO DE CON_003 
FLG_CON_006  EQU  0x69        ;REGISTRO QUE SE UTILIZARÁ PARA DETERMINAR EL ESTADO DE CON_006 

;**********************************************************************************************
     

;***** REGISTROS A UTILIZAR PARA EL CONTROL Y MANEJO DE LA TECLA MENU Y LA LLAVE ROTATIVA *****

VAL_OBT_LLP  EQU  0x6A        ;REGISTRO EN EL QUE SE VAN A CARGAR LOS VALORE OBTENIDOS DE LA          
                              ;EXPLORACIÓN DEL PUERTO C

VAL_COM_LLP  EQU  0x6B        ;REGISTRO A UTILIZAR PARA ANALIZAR EL ESTADO DE LA TECLA MENÚ
                              ; Y LA LLAVE ROTATIVA
  
VAL_RES_LLP  EQU  0x6C        ;REGISTRO EN EL QUE SE VA A CARGAR EL VALOR RESULTANTE DE LAS  
                              ;OPERACIONES MATEMÁTICAS, DEDICADAS A ANALIZAR EL ESTADO DE LA
                              ;TECLA MENÚ Y LA LLAVE ROTATIVA
 
FLG_TEC_MEN  EQU  0x6D        ;REGISTRO A UTILIZAR PARA INDICAR EL ESTADO DE LA TECLA MENÚ        

FLG_EST_LLP  EQU  0x6E        ;REGISTRO A UTILIZAR PARA INDICAR EL ESTADO DE LA LLAVE DE PULSOS  

;**********************************************************************************************


;* REGISTROS A UTILIZAR PARA EL CONTROL Y MANEJO DE LOS SENSORES DE NIVELES DE LOS DEPÓSITOS **

VAL_OBT_SEN  EQU  0x6F        ;REGISTRO EN EL QUE SE VAN A CARGAR LOS VALORE OBTENIDOS DE LA          
                              ;EXPLORACIÓN DEL PUERTO A

VAL_COM_SEN  EQU  0x70        ;REGISTRO A UTILIZAR PARA ANALIZAR EL ESTADO DE LOS SENSORES DE
                              ;LOS DEPÓSITOS
  
VAL_RES_SEN  EQU  0x71        ;REGISTRO EN EL QUE SE VA A CARGAR EL VALOR RESULTANTE DE LAS  
                              ;OPERACIONES MATEMÁTICAS, DEDICADAS A ANALIZAR EL ESTADO DE LOS
                              ;SENSORES DE LOS DEPÓSITOS
 
;**********************************************************************************************


;************ REGISTROS A UTILIZAR PARA EL CONTROL DE LAS RUTINAS DE RETARDO ******************

RET_100_uSE  EQU  0x72        ;REGISTRO QUE SE VA A UTILIZAR PARA CONTROLAR EL TEMPORIZADOR
                              ;PATRÓN DE 100 MICROSEGUNDOS

PRI_CON_RET  EQU  0x73        ;REGISTRO QUE SE UTILIZARÁ PARA MANEJAR LAS RUTINAS DE RETARDO 
                              ;DE LOS VALORES ALTOS 

SEG_CON_RET  EQU  0x74        ;REGISTRO QUE SE UTILIZARÁ PARA MANEJAR LAS RUTINAS DE RETARDO 
                              ;DE LOS VALORES ALTOS 

;**********************************************************************************************


;**************************** CONFIGURACIÓN DE PUERTOS Y REGISTROS ****************************           
 
           ORG    0x00        ; El programa comienza en la direcci¢n 0 y 
           goto   INICIO      ; salta a la direcci¢n 5 para sobrepasar el
           ORG    0x05        ; vector de interrupci¢n


INICIO     movlw  0x81        ;SE SELECCIONA RA0 COMO ENTRADA ANALÓGICA, RELOG 
           movwf  ADCON0      ;DERIVADO DE LA FRECUENCIA DEL OSCILADOR/32     
              

           bsf    STATUS,5    ;SE SELECCIONA DEL BANCO 1
                    
           movlw  0xFF        ;SE CONFIGURA EL PUERTO A COMO ENTRADA
           movwf  PORTA       

           movlw  0x00        ;SE CONFIGURA EL PUERTO B COMO SALIDA     
           movwf  PORTB

           movlw  0xBF        ;SE CONFIGURAN RC0, RC1, RC2, RC3, RC4, RC5 Y RC7 COMO 
           movwf  PORTC       ;ENTRADA, RC6 COMO SALIDA
  
           movlw  0x00        ;SE CONFIGURA EL PUERTO D COMO SALIDA
           movwf  PORTD       
    
           movlw  0x07        ;SE CONFIGURA EL PUERTO E COMO ENTRADA, PUERTO D COMO  
           movwf  PORTE       ;PUERTO DE PROPOSITO GENERAL  

           movlw  0x04        ;(PROBAR CON 0X03) SE CONFIGURAN RA0, RA1 Y RA3 COMO ENTRADAS   
           movwf  ADCON1      ;ANALÓGICAS  RA2, RA5, RE1, RE2 Y RE3 COMO ENTRADAS DIGITALES 
                  
           movlw  0x24        ;SE CONFIGURAN 8 BITS DE TRANSMISIÓN, TRANSMISIÓN HABILITADA  
           movwf  TXSTA       ;MODO DE COMUNICACIÓN ASÍNCRONO, ALTA VELOCIDAD PARA EL MODO
                              ;ASÍNCRONO
  
           movlw  0x0A        ;SE AJUSTA LA VELOCIDAD DE COMUNICACIÓN A 56.818 BIT/SEG        
           movwf  SPBRG  

           movlw  0x05        ;SE MUEVE EL VALOR 0x05 A SSPADD, DE ESTA FORMA SE CONFIGURA   
           movwf  SSPADD      ;LA FRECUENCIA DE TRABAJO DEL PUERTO I2C A 400KHz, PARA UNA 
                              ;FRECUENCIA DE RELOJ DE 10MHz
 
           movlw  0x00        ;SE PONE A 0 AL REGISTRO SSPSTAT
           movwf  SSPSTAT 

           movlw  0x80        ;SE LE ASIGNA LA DIVISION AL TMR0
           movwf  TMR0_OPT
           
           bcf    STATUS,5    ;SELECCION DEL BANCO 0 

;**********************************************************************************************

  
;****************************** INICIO DEL PROGRAMA PRINCIPAL *********************************

           clrf   PORTA         ;SE LIMPIAN LOS POSIBLES VALORES ERRÓNEOS DE LOS PUERTOS 
           clrf   PORTB  
           clrf   PORTC  
           clrf   PORTD 
           clrf   PORTE     
           
           clrf   PIR1          ;SE PONE A 0 A PIR1 Y RCREG A 0
           clrf   RCREG            

           call   RET_1_SEG     ;COMO PRECAUCIÓN SE GENERA UN RETARDO DE 1 SEGUNDO   

           bsf    PORTD,7       ;SE CONMUTA LA LLAVE ELECTRÓNICA PARA PODER COMUNICAR LA
                                ;CENTRAL CON EL MÓDULO DE CONTROL DEL DISPLAY 

           movlw  0x90          ;SE CONFIGURAN RC6 Y RC7 COMO PUERTO RS232, SE SELECCIONAN 8 BITS        
           movwf  RCSTA         ;DE RECEPCIÓN, SE HABILITA LA RECEPCIÓN CONTINUA           
            
           movlw  0x28          ;SE MUEVE EL VALOR 0x28 A SSPCON, DE ESTA FORMA SE CONFIGURA AL
           movwf  SSPCON        ;PUERTO I2C COMO MAESTRO, SE HABILITA EL PUERTO I2C Y 
                                ;SE CONFIGURAN LOS PINES SDA Y SCL COMO FUENTE DEL PUERTO I2C

           clrf   FLG_NVL_NOR   ;SE PONEN A 0 LOS REGISTROS QUE SE DETALLAN
           clrf   FLG_NVL_INF
           clrf   FLG_NVL_SUP

           clrf   FLG_INI_PRO   
           clrf   FLG_FIN_PRO

           clrf   FLG_EST_SPF          

           clrf   FLG_TEM_050   
           clrf   FLG_TEM_100 
 
           clrf   FLG_NVL_SEC
           clrf   FLG_NVL_CON
           clrf   FLG_NVL_BRL
           clrf   FLG_VAL_INF
           clrf   FLG_VAL_NOR  
           clrf   FLG_VAL_SUP
           clrf   FLG_VEL_PRO       
           clrf   FLG_EST_BUZ
                   
           clrf   FLG_NVL_REF  

           clrf   FLG_ERR_I2C
          
           clrf   FLG_CON_002
           clrf   FLG_CON_003
           clrf   FLG_CON_006  

           clrf   FLG_EST_BUF
          
           clrf   FLG_TEC_MEN 
           clrf   FLG_EST_LLP 

           clrf   FLG_SAL_SEC  


           movlw  0x07          ;SE MUEVE EL VALOR 0x07 A VAL_COM_LLP, DE ESTA FORMA, SE GENERA   
           movwf  VAL_COM_LLP   ;COMBINACIÓN CON LA CUAL SE VA A ANALIZAR EL ESTADO DE LA TECLA
                                ;MENÚ Y DE LA LLAVE DE PULSOS
 
           movlw  0x34          ;SE MUEVE EL VALOR 0x34 A VAL_COM_SEN, DE ESTA FORMA, SE GENERA   
           movwf  VAL_COM_SEN   ;COMBINACIÓN CON LA CUAL SE VA A ANALIZAR EL ESTADO DE LOS
                                ;SENSORES DE NIVELES DE LOS DEPÓSITOS
           
           movlw  0x7F          ;SE MUEVE EL VALOR 0x7F A VAL_REF_VEL, DE ESTA FORMA, SE VAN A 
           movwf  VAL_REF_VEL   ;CONTROLAR LAS TRES VELOCIDADES DE PROCESO

           call   IDL_I2C
           call   SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA 
    
           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A DIR_DIS_I2C, DE ESTA, FORMA SE INDICA
           movwf  DIR_DIS_I2C   ;LA DIRECCIÓN EN LA QUE SE VA A ESCRIBIR 

           call   SEC_SEL_DIS
           call   SEC_DIR_DIS

           movlw  0xA1          ;SE MUEVE EL VALOR 0xA1 A SEL_DIS_I2C, DE ESTA FORMA, SE
           movwf  SEL_DIS_I2C   ;SELECCIONA LA MEMORIA EXTERNA Y SE INDICA QUE SE VA LEER EN ELLA   
            
           call   SEC_SEL_DIS_RS
           call   LER_I2C
           call   DET_I2C         

           movf   DAT_OBT_I2C,W ;SE MUEVE DAT_OBT_I2C A W 
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF

           btfss  STATUS,2      ;¿EL VALOR DE DATO_OBT_I2C ES 0xFF?, ¿ES LA PRIMERA VEZ
                                ;QUE SE ENCIENDE EL SISTEMA?

           goto   LER_MEM_001   ;NO

;**********************************************************************************************

                     
;******************** PROCESO DE CARGA Y GRABACIÓN DE VALORES INICIALES *********************** 

           movlw  0x0A          ;SI, POR DEFECTO SE CARGAN VALORES INICIALES EN LOS REGISTROS
           movwf  NVL_SEC       ;QUE SE DETALLAN 
           
           movlw  0x5A        
           movwf  RET_DIS
      
           movlw  0x5A
           movwf  NVL_CON

           movlw  0x32 
           movwf  NVL_BRL

           movlw  0x00
           movwf  VEL_PRO 
           movwf  EST_BUZ
           movwf  PEL_PRO
           movwf  FLG_INI_PRO
           movwf  FLG_FIN_PRO 

           movlw  0xAB          ;SE MUEVE EL VALOR 0xAB A NVL_REF_INF QUE CORRESPONDE A UNA   
           movwf  NVL_REF_INF   ;TENSIÓN GENERADA POR EL SENSOR DE 3.30V   

           movlw  0xB5          ;SE MUEVE EL VALOR 0xB5 A NVL_REF_NOR QUE CORRESPONDE A UNA     
           movwf  NVL_REF_NOR   ;TENSIÓN GENERADA POR EL SENSOR DE 3.50V
          
           movlw  0xBF          ;SE MUEVE EL VALOR 0xBF A NVL_REF_SUP QUE CORRESPONDE A UNA   
           movwf  NVL_REF_SUP   ;TENSIÓN GENERADA POR EL SENSOR DE 3.70V


           movlw  'L'           ;SE GRABA EL CÓDIGO DE SEGURIDAD, EN ESTE CASO CORRESPONDE
           movwf  DIG_001       ;A LA COMBINACIÓN L, M, J, C 

           movlw  'M'
           movwf  DIG_002

           movlw  'J'
           movwf  DIG_003 

           movlw  'C'
           movwf  DIG_004

           call   GRA_PAR_001   ;SE ORDENA GRABAR LOS VALORES INICIALES DE LOS PARAMETROS          

           goto   INI_DSP

;**********************************************************************************************
             

;******************* PROCESO DE CARGA DE LOS VALORES LEÍDOS EN LA MEMORIA ********************* 

LER_MEM_001 movlw 0x01          ;SE MUEVE EL VALOR 0x01 A CON_DAT_I2C, DE ESTA FORMA, SE VAN A  
           movwf  CON_DAT_I2C   ;DEPOSITAR CORRECTAMENTE, EN EL REGISTRO QUE CORRESPONDE, LOS
                                ;DATOS LEÍDOS DE LA MEMORIA 
 
           call   LER_MEM       ;SE EFECTÚA UNA LECTURA DE LA MEMORIA 

           movf   DAT_001,W     ;SE MUEVE DAT_001 A W   
           movwf  NVL_SEC       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE 

           movf   DAT_002,W     ;SE MUEVE DAT_002 A W   
           movwf  RET_DIS       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE

           movf   DAT_003,W     ;SE MUEVE DAT_003 A W   
           movwf  NVL_CON       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
                 
           movf   DAT_004,W     ;SE MUEVE DAT_004 A W   
           movwf  NVL_BRL       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
          
           movf   DAT_005,W     ;SE MUEVE DAT_005 A W   
           movwf  NVL_REF_INF   ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
           
           movf   DAT_006,W     ;SE MUEVE DAT_006 A W   
           movwf  NVL_REF_NOR   ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
           
           movf   DAT_007,W     ;SE MUEVE DAT_007 A W   
           movwf  NVL_REF_SUP   ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE 
           
           movf   DAT_008,W     ;SE MUEVE DAT_008 A W   
           movwf  VEL_PRO       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE 

           movf   DAT_009,W     ;SE MUEVE DAT_009 A W   
           movwf  EST_BUZ       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
         
           movf   DAT_010,W     ;SE MUEVE DAT_010 A W   
           movwf  PEL_PRO       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
           
           movf   DAT_011,W     ;SE MUEVE DAT_011 A W   
           movwf  FLG_INI_PRO   ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
           
           movf   DAT_012,W     ;SE MUEVE DAT_012 A W   
           movwf  FLG_FIN_PRO   ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE

           movf   DAT_013,W     ;SE MUEVE DAT_013 A W   
           movwf  DIG_001       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE

           movf   DAT_014,W     ;SE MUEVE DAT_014 A W   
           movwf  DIG_002       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
         
           movf   DAT_015,W     ;SE MUEVE DAT_015 A W   
           movwf  DIG_003       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE
    
           movf   DAT_016,W     ;SE MUEVE DAT_016 A W   
           movwf  DIG_004       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE

;**********************************************************************************************


;************************ ENVÍO DE LA ORDEN DE INICIO DE LA PANTALLA **************************
                       
INI_DSP    call   RET_500_mSE   ;SE GENERA UN RETARDO DE 500 MILISEGUNDOS 

           call   MEN_INI_DSP   ;SE ORDENA INICIALIZAR EL DISPLAY                               
           call   MEN_CAD_DAT   ;SE ENVÍA LA CADENA CON LOS PARAMETROS Y SUS VALORES 
           call   MEN_PRE_SIS   ;SE ORDENA MOSTRAR EL MESAJE DE PRESENTACIÓN

;**********************************************************************************************

  
;****************** EXPLORACIÓN DE LOS ESTADOS DE FLG_INI_PRO Y FLG_FIN_PRO *******************
          
           call   RET_1_SEG     ;SE GENERA UN RETARDO DE 1 SEGUNDO     

           bsf    PORTB,0       ;SE ACTIVA EL RELÉ DE ALIMENTACIÓN DE LINEA

           movf   FLG_INI_PRO,W ;SE MUEVE FLG_INI_PRO A W    
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'
      
           btfss  STATUS,2      ;¿SE HA COLOCADO ALGUNA PELÍCULA?
           goto   EXP_DEP_001   ;NO
  
           movf   FLG_FIN_PRO,W ;SI, SE MUEVE FLG_FIN_PRO A W    
           sublw  'F'           ;SE LE RESTA EL VALOR 'F'
      
           btfsc  STATUS,2      ;¿SE COMPLETÓ EL PROCESO DE REVELADO?
           goto   EXP_DEP_001   ;SI

           movlw  '5'           ;NO, SE MUEVE EL VALOR '5' A ERR_NUM_XX, DE ESTA FORMA SE  
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO

           call   MEN_ERR       ;SE ORDENA MOSTRAR EL  MENSAJE "ALARMA ERROR 04"        
           call   MEN_EXP_PEL   ;SE ORDENA MOSTRAR EL MENSAJE "EXPULSANDO PELICULA"
           call   LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA 

           bsf    PORTB,2       ;SE ENCIENDE EL MOTOR DE TRANSMISIÓN 

;**********************************************************************************************


;***************************** EXPULSIÓN DE LA PELÍCULA ATASCADA ******************************

           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A CON_001, DE ESTA FORMA SE PONE A 0  
           movwf  CON_001       ;A ESTE CONTADOR 

           movlw  0xC8          ;SE MUEVE EL VALOR 0xC8 A CON_002, DE ESTA FORMA, SE REPITE
           movwf  CON_002       ;LA TEMPORIZACIÓN DE 100 MILISEGUNDOS 200 VECES (20 SEGUNDOS)   
        
           movlw  0x0F          ;SE MUEVE EL VALOR 0x0F A CON_003, DE ESTA FORMA, SE REPITE  
           movwf  CON_003       ;LA TEMPORIZACIÓN DE 20 SEGUNDOS 15 VECES (5 MINUTOS) DURANTE
                                ;ESTE TIEMPO EL SISTEMA DEBE RETIRAR, CORRECTAMENTE LA PELICULA
                                ;ATASCADA 

REP_BUC_001 call  INC_CON_001   ;SE INCREMENTA CON_001

LER_SPI_001 btfss PORTE,1       ;¿SE INTENTÓ COLOCAR UNA PELICULA?            
           goto   LER_SPF_001   ;NO

           call   MEN_POR_ESP   ;SI, SE ODENA PRESENTAR EL MESAJE "POR FAVOR ESPERE"   
           call   MEN_EXP_PEL   ;SE ODENA PRESENTAR EL MESAJE "EXPULSANDO PELICULA"

LER_SPF_001 btfsc PORTE,2       ;¿SE DETECTÓ LA PELÍCULA AL FINAL DEL PROCESO?   
           goto   RET_5_SEG     ;SI            
          
           call   DEC_CON_002   ;NO, SE DECREMENTA CON_002 

           movf   FLG_CON_002,W ;SE MUEVE FLG_CON_002 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  

           btfss  STATUS,2      ;¿LLEGÓ CON_002 A 0,PASARON 20 SEGUNDOS?           
           goto   REP_BUC_001   ;NO 

           clrf   FLG_CON_002   ;SI, SE PONE A 0 A FLG_CON_002
            
           call   DEC_CON_003   ;SE DECREMENTA CON_003   

           movf   FLG_CON_003,W ;SE MUEVE FLG_CON_003 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  

           btfss  STATUS,2      ;¿LLEGÓ CON_003 A 0, PASARON 5 MINUTOS?          
           goto   REP_BUC_001   ;NO      
           goto   ERR_007       ;SI, SE PRODUCE EL ERROR CORRESPONDIENTE 

;**********************************************************************************************


;****** RETARDO DE 5 SEGUNDOS PARA ASEGURAR QUE LA PELICULA SEA EXPULSADA COMPLETAMENTE ******* 

RET_5_SEG  movlw  0x32          ;SE MUEVE EL VALOR 0x32 A CON_003, DE ESTA FORMA, SE
           movwf  CON_003       ;REPITE LA TEMPORIZACIÓN DE 100 MILISEGUNDOS 50 VECES  
                                ;(5 SEGUNDOS)     

REP_BUC_002 call  INC_CON_001   ;SE INCREMENTA CON_001 
           call   DEC_CON_003   ;SE DECREMETA CON_003  

           movf   FLG_CON_003,W ;SE MUEVE FLG_CON_003 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  

           btfss  STATUS,2      ;¿LLEGÓ CON_003 A 0, PASARON 5 SEGUNDOS?            
           goto   REP_BUC_002   ;NO   

           bcf    PORTB,2       ;SE DESCONECTA EL MOTOR DE TRANSMISIÓN

           movlw  'F'           ;SE MUEVE EL VALOR 'F' A FLG_FIN_PRO, DE ESTA FORMA, SE INDICA 
           movwf  FLG_FIN_PRO   ;QUE LA PELÍCULA FUÉ EXPULSADA CORRECTAMENTE 

           clrf   FLG_CON_003   ;SE PONE A 0 A FLG_CON_003

           call   GRA_FLG_FPR   ;SE ORDENA GRABAR EL VALOR DE FLG_FIN_PRO 
           call   MEN_PRE_SIS   ;SE ORDENA PRESENTAR EL MENSAJE "PREPARANDO SISTEMA"          
           call   RET_1_SEG     ;SE GENERA UN RETARDO DE 1 SEGUNDO  

;**********************************************************************************************


;*************** EXPLORACIÓN INICIAL DEL ESTADO DE LOS NIVELES DE LOS DEPÓSITOS ***************

EXP_DEP_001 call  EXP_SEN_DEP   ;SE EXPLORA EL ESTADO DE LOS SENSORES DE LOS DEPÓSITOS 

;**********************************************************************************************          


;*************************** PROCESO DE CALENTAMIENTO DEL QUÍMICO *****************************    

TEM_15_MIN movlw  0x00          ;SE MUEVE EL VALOR 0x00 A CON_001, DE ESTA FORMA SE PONE A 0  
           movwf  CON_001       ;A ESTE CONTADOR 

           movlw  0xC8          ;SE MUEVE EL VALOR 0xC8 A CON_002, DE ESTA FORMA, SE REPITE
           movwf  CON_002       ;LA TEMPORIZACIÓN DE 100 MILISEGUNDOS 200 VECES (20 SEGUNDOS)   
         
           movlw  0x2D          ;SE MUEVE EL VALOR 0x2D A CON_003, DE ESTA FORMA SE REPITE 
           movwf  CON_003       ;LA TEMPORIZACIÓN DE 20 SEGUNDOS 45 VECES (15 MINUTOS)
                                ;DURANTE ESTE TIEMPO EL QUÍMICO DEBE ALCANZAR SU TEMPERATURA
                                ;ADECUADA 

           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A CON_005 Y CON_006, DE ESTA FORMA, SE   
           movwf  CON_005       ;PONE A 0 A ESTOS CONTADORES 
           movwf  CON_006 
         
          
REP_BUC_003 call  INC_CON_001   ;SE INCREMENTA CON_001
            
           bsf    PORTB,1       ;SE ENCIENDE EL CALENTADOR Y EL MEZCLADOR  

           call   CON_AN_DI_1   ;SE OBTIENE LA CONVERSIÓN ANALÓGICA DIGITAL DEL VALOR DEL SENSOR
                                ;PRINCIPAL DE LA TEMPERATURA DEL QUÍMICO

           movf   FLG_NVL_NOR,W ;SE MUEVE FLG_NVL_NOR A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
 
           btfsc  STATUS,2      ;¿LA TEMPERATURA DEL QUIMICO LLEGÓ A SU VALOR ESTABLECIDO?
           goto   TEM_QUI_LIS   ;SI

           call   EXP_MEN_001   ;NO, SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ
 
           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_TEC_MEN A W
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'   
       
           btfsc  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENU?    
           goto   LER_REF_LIN_2 ;SI   

           call   EXP_SEN_DEP   ;NO, SE EXPLORA EL ESTADO DE LOS SENSORES DE LOS DEPÓSITOS 


LER_SPI_002 btfss PORTE,1       ;¿SE INTENTÓ COLOCAR UNA PELICULA?            
           goto   CON_DEC_001   ;NO

           call   MEN_POR_ESP   ;SI, SE ORDENA PRESNETAR EL MENSAJE "POR FAVOR ESPERE"   
           call   MEN_PRE_SIS   ;SE PRDENA PRESENTAR EL MENSAJE "PREPARANDO SISTEMA"


CON_DEC_001 call  DEC_CON_002   ;SE DECREMETA CON_002 

           movf   FLG_CON_002,W ;SE MUEVE FLG_CON_002 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 

           btfss  STATUS,2      ;¿LLEGÓ CON_002 A 0,PASARON 20 SEGUNDOS?    
           goto   REP_BUC_003   ;NO

           clrf   FLG_CON_002   ;SI, SE PONE A 0 A FLG_CON_002 
            
           call   DEC_CON_003   ;SE DECREMENTA CON_003

           movf   FLG_CON_003,W ;SE MUEVE FLG_CON_003 A W 
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF   

           btfss  STATUS,2      ;¿LLEGÓ CON_003 A 0, PASARON 15 MINUTOS?                      
           goto   REP_BUC_003   ;NO
           goto   ERR_006       ;SI, SE PRODUCE EL ERROR CORRESPONDIENTE

;**********************************************************************************************


;*************** INTERRUPCIÓN EN EL TEMPORIZADOR DE 15 MINUTOS, INGRESÓ AL MENÚ ***************

LER_REF_LIN_2 call LER_REF_LIN  ;SE EXPLORA EL ESTADO LA SEÑAL DE REFERENCIA DE LÍNEA    

           bcf    PORTB,1       ;SE DESCONECTA EL CALENTADOR Y EL MEZCLADOR 
          
           clrf   FLG_NVL_NOR   ;SE PONE A 0 A FLG_NVL_NOR 
           clrf   FLG_VAL_INF   ;SE PONE A 0 A FLG_VAL_INF
           clrf   FLG_VAL_SUP   ;SE PONE A 0 A FLG_VAL_SUP 
                          
           call   ENT_MEN       ;SE INGRESA AL MENÚ
           call   BOR_FLG_006   ;SE PONE A 0 A FLG_CON_006 
           call   MEN_PRE_SIS   ;SE ORDENA PRESENTAR EL MENSAJE "PREPARANDO SISTEMA"
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   GRA_PAR_002   ;SE ORDENA GRABAR EL VALOR DE LOS PARAMETROS (MODIFICADOS)
   
           clrf   CON_001       ;SE PONE A 0 A C0N_001
       
           goto   REP_BUC_003

;**********************************************************************************************


;*********** PASO AL MODO DE ESPERA, DESPUES DEL CALENTAMIENTO INCIAL DEL QUÍMICO *************

TEM_QUI_LIS call  MEN_SIS_LIS   ;SE ORDENA PRESENTAR EL MENSAJE "SISTEMA LISTO"
            call  RET_1_SEG     ;SE GENERA UN RETARDO DE 1 SEGUNDO

LER_SPI_003 btfsc PORTE,1       ;¿SE COLOCÓ UNA PELÍCULA? 
           goto   RET_INI_PEL   ;SI
          
           call   LER_REF_LIN   ;NO, SE EXPLORA EL ESTADO LA SEÑAL DE REFERENCIA DE LÍNEA
           call   CON_AN_DI_1   ;SE EFECTÚA LA CONVERSIÓN ANALÓGICA DIGITAL DEL SENSOR PRINCIPAL 
   
           call   RET_100_mSE   ;SE PRODUCE UN RETARDO DE 100 MILISEGUNDOS PARA DARLE
                                ;ESTABILIDAD AL PROCESO DE CONVERSIÓN
  
           call   CON_AN_DI_2   ;SE EFECTÚA LA CONVERSIÓN ANALÓGICA DIGITAL DEL SENSOR DE SEGURIDAD
           call   EXP_FLG_REF   ;SE EXPLORA EL ESTADO DE LOS NIVELES DE REFERECIA 
           call   EXP_SEN_DEP   ;SE EXPLORA EL ESTADO DE LOS SENSORES DE LOS DEPÓSITOS 
           call   EXP_MEN_001   ;SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_TEC_MEN A W
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'   
       
           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENU?  
           goto   LER_SPI_003   ;NO  
         
;**********************************************************************************************


;******************* INTERRUPCIÓN EN EL ESTADO DE REPOSO, INGRESÓ AL MENÚ *********************

LER_REF_LIN_3 call LER_REF_LIN  ;SI, SE EXPLORA EL ESTADO LA SEÑAL DE REFERENCIA DE LÍNEA    

           bcf    PORTB,1       ;SE DESCONECTA EL CALENTADOR Y EL MEZCLADOR 
             
           clrf   FLG_VAL_INF   ;SE PONE A 0 A FLG_VAL_INF
           clrf   FLG_VAL_SUP   ;SE PONE A 0 A FLG_VAL_SUP  

           call   ENT_MEN       ;SE INGRESA AL MENÚ
           call   BOR_FLG_006   ;SE PONE A 0 A FLG_CON_006 
           call   MEN_INT_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "INTRODUZCA PELÍCULA"
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   GRA_PAR_002   ;SE ORDENA GRABAR EL VALOR DE LOS PARAMETROS (MODIFICADOS)
   
           goto   LER_SPI_003  

;**********************************************************************************************


;******* CON ESTE RETARDO DE 1 SEGUNDO SE DETERMINA SI REALMENTE SE COLOCÓ UNA PELICULA *******  

RET_INI_PEL call  RET_1_SEG     ;SE GENERA UN RETARDO DE 1 SEGUNDO

           btfss  PORTE,1       ;¿SE SIGUE DETECTANDO LA PELÍCULA QUE SE COLOCÓ? 
           goto   LER_SPI_003   ;NO, SE VUELVE AL ESTADO DE REPOSO      

;**********************************************************************************************


;************************** INICIO DEL PROCESO COMPLETO DE REVELADO ***************************

           movf   FLG_INI_PRO,W ;SI, SE MUEVE FLG_INI_PRO A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE HA COLOCADO UNA PELÍCULA ANTERIORMENTE? 
           goto   AJU_FLG_FPR   ;SI

           movlw  'I'           ;NO, ES LA PRIMERA VEZ, SE MUEVE EL VALOR 'I' A FLG_INI_PRO   
           movwf  FLG_INI_PRO   ;DE ESTA FORMA, SE INDICA QUE EL PROCESO INICIÓ CORRECTAMENTE 

           call   GRA_FLG_IPR   ;SE ORDENA GRABAR EL ESTADO DE FLG_INI_PRO


AJU_FLG_FPR movlw 0x00          ;SE MUEVE EL VALOR 0x00 A FLG_FIN_PRO, DE ESTA FORMA, SE   
           movwf  FLG_FIN_PRO   ;BORRA EL ESTADO FLG_FIN_PRO  
           
           call   GRA_FLG_FPR   ;SE ORDENA GRABAR EL ESTADO DE FLG_FIN_PRO    
           call   MEN_PRO_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "PROCESANDO PELÍCULA"  
            
           movlw  0xC8          ;SE MUEVE EL VALOR 0xC8 A CON_002, DE ESTA FORMA, SE REPITE
           movwf  CON_002       ;LA TEMPORIZACIÓN DE 100 MILISEGUNDOS 200 VECES (20 SEGUNDOS)   
           
           movlw  0x0F          ;SE MUEVE EL VALOR 0x0F A CON_003, DE ESTA FORMA, SE REPITE 
           movwf  CON_003       ;LA TEMPORIZACIÓN DE 20 SEGUNDOS 15 VECES (5 MINUTOS)
                                ;SUPERADO ESE TIEMPO, SE PASA AL MODO DE REPOSO      
 
           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A CON_004, DE ESTA FORMA, SE PONE A 0 A 
           movwf  CON_004       ;ESTE CONTADOR

           movlw  0xFF          ;SE MUEVE EL VALOR 0xFF A FLG_SAL_SEC, DE ESTA FORMA, SE INDICA
           movwf  FLG_SAL_SEC   ;QUE DEBE ACTIVARSE EL MODULADOR DE ANCHO DE PULSO 

           call   LER_REF_LIN   ;SE EXPLORA EL ESTADO LA SEÑAL DE REFERENCIA DE LÍNEA 

           bsf    PORTB,2       ;SE ENCIENDE EL MOTOR DE TRANSMISIÓN
           bsf    PORTB,3       ;SE ENCIENDE LA BOMBA DE ALIMENTACIÓN 
           bsf    PORTB,4       ;SE ENCIENDE LA BOMBA DE RECIRCULACIÓN 
           bsf    PORTB,5       ;SE ENCIENDE EL VENTILADOR DE SECADO 
                        

LER_REF_LIN_4 call LER_REF_LIN  ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA

           call   INC_CON_004   ;SE INCREMENTA CON_004
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO 


LER_SPI_004 btfsc PORTE,1       ;¿SE SIGUE DETECTANDO LA PELÍCULA?
           goto   LER_REF_LIN_4 ;SI   

  
DES_BOM_ALI call  LER_REF_LIN   ;NO, ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA 

           bcf    PORTB,3       ;SE DESCONECTA LA BOMBA DE ALIMENTACIÓN  

           call   INC_CON_004   ;SE INCREMENTA CON_004
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO

           call   BOR_CON_004   ;SE PONEN A 0 A LOS INDICADORES FLG_TEM_050 Y FLG_TEM_100   

;**********************************************************************************************


;*************************** INICIO DEL TEMPORIZADOR DE 20 SEGUNDOS ***************************

LER_REF_LIN_6 call LER_REF_LIN  ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA

           call   INC_CON_004   ;SE INCREMENTA CON_004

           movf   FLG_TEM_100,W ;SE MUEVE FLG_TEM_100 A W  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
 
           btfss  STATUS,2      ;¿LLEGÓ CON_004 A TEMPORIZAR 100 MILISEGUNDOS? 
           goto   SAL_SEC_001   ;NO  
      
           call   BOR_CON_004   ;SI, SE PONEN A 0 A LOS INDICADORES FLG_TEM_050 Y FLG_TEM_100                                  
           call   DEC_CON_002   ;SE DECREMENTA CON_002

           movf   FLG_CON_002,W ;SE MUEVE FLG_CON_002 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
 
           btfsc  STATUS,2      ;¿LLEGÓ CON_002 A 0, PASARON 20 SEGUNDOS?           
           goto   RET_5_MIN     ;SI  
           
LER_SPI_005 btfss PORTE,1       ;NO, ¿SE INTENTÓ COLOCAR OTRA PELÍCULA?
           goto   SAL_SEC_001   ;NO  
            
           call   SAL_SEC       ;SI, SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO  
           call   MEN_POR_ESP   ;SE ORDENA PRESENTAR EL MENSAJE "POR FAVOR ESPERE"
           call   LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
           call   MEN_PRO_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "PROCESANDO PELÍCULA"
       
           goto   LER_REF_LIN_6  
            
SAL_SEC_001 call  SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO

           goto   LER_REF_LIN_6

;**********************************************************************************************        


;**************************** INICIO DEL TEMPORIZADOR DE 5 MINUTOS ****************************

RET_5_MIN  clrf   FLG_CON_002   ;SE PONE A 0 A FLG_CON_002

           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
           call   MEN_RIN_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "INTRODUZCA PELICULA" 


LER_REF_LIN_7 call LER_REF_LIN  ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA

           call   INC_CON_004   ;SE INCREMENTA CON_004

           movf   FLG_TEM_100,W ;SE MUEVE FLG_TEM_100 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
          
           btfss  STATUS,2      ;¿LLEGÓ CON_004 A TEMPORIZAR 100 MILISEGUNDOS?
           goto   LER_SPI_006   ;NO  
      
           call   BOR_CON_004   ;SI, SE PONEN A 0 A LOS INDICADORES FLG_TEM_050 Y FLG_TEM_100   
           call   EXP_MEN_001   ;SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_TEC_MEN A W
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'   
       
           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           goto   CON_DEC_002   ;NO

           call   SAL_SEC       ;SI, SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO

           movf   FLG_FIN_PRO,W ;SE MUEVE FLG_FIN_PRO A W 
           sublw  'F'           ;SE LE RESTA EL VALOR 'F' 
           
           btfss  STATUS,2      ;¿SE DETECTÓ EL FINAL DE LA PELÍCULA, SE PUEDE ACCEDER AL MENÚ? 
           goto   ENV_MEN_ADV   ;NO

           clrf   FLG_VAL_INF   ;SI, SE PONE A 0 A FLG_VAL_INF
           clrf   FLG_VAL_SUP   ;SE PONE A 0 A FLG_VAL_SUP            

           call   ENT_MEN       ;SE PERMITE EL INGRESO AL MENÚ
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
           call   BOR_FLG_006   ;SE PONE A 0 A FLG_CON_006 
           call   MEN_INT_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "INTRODUZCA PELÍCULA"    
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ

           goto   LER_REF_LIN_7 


ENV_MEN_ADV call  MEN_POR_ESP   ;SE ORDENA PRESENTAR EL MENSAJE "POR FAVOR ESPERE"
           call   LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
           call   MEN_INT_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "INTRODUZCA PELICULA"
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           
           goto   LER_REF_LIN_7     


LER_SPI_006 btfss PORTE,1       ;¿SE INTENTÓ COLOCAR OTRA PELÍCULA?
           goto   LER_SPF_002   ;NO 

           bsf    PORTB,3       ;SI, SE VUELVE A ENCENDER LA BOMBA DE ALIMENTACIÓN  
           bsf    PORTB,4       ;SE VUELVE A ENCENDER LA BOMBA DE RECIRCULACIÓN

           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO       
           call   MEN_PRO_PEL   ;SE ORDENA PRESENTAR EL MENSAJE "PROCESANDO PELÍCULA"

           movlw  0xC8          ;SE MUEVE EL VALOR 0xC8 A CON_002, DE ESTA FORMA, SE REPITE
           movwf  CON_002       ;LA TEMPORIZACIÓN DE 100 MILISEGUNDOS 200 VECES (20 SEGUNDOS) 

           movlw  0x0F          ;SE MUEVE EL VALOR 0x0F A CON_003, DE ESTA FORMA, SE VUELVE A 
           movwf  CON_003       ;REPETIR LA TEMPORIZACIÓN DE 5 MINUTOS
       
           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A FLG_FIN_PRO, DE ESTA FORMA, SE   
           movwf  FLG_FIN_PRO   ;BORRA EL ESTADO FLG_FIN_PRO  
                         
           goto   LER_REF_LIN_4    



LER_SPF_002 btfsc PORTE,2       ;¿SE DETECTÓ LA PELÍCULA AL FINAL DEL PROCESO?   
           goto   EXP_FLG_0FF   ;SI

           movf   FLG_EST_SPF,W ;NO, SE MUEVE FLG_EST_SPF A W 
           sublw  0x00          ;SE LE ESTA EL VALOR 0x00    

           btfss  STATUS,2      ;¿EL VALOR DE FLG_EST_SPF ES IGUAL A 0x00?
           clrf   FLG_EST_SPF   ;NO, SE LO PONE A 0
           goto   SAL_SEC_002   ;SI, YA ESTÁ EN 0 


EXP_FLG_0FF movf  FLG_EST_SPF,W ;SE MUEVE FLG_EST_SPF A W 
           sublw  0xFF          ;SE LE ESTA EL VALOR 0xFF    

           btfsc  STATUS,2      ;¿EL VALOR DE FLG_EST_SPF ES IGUAL A 0xFF?
           goto   SAL_SEC_002   ;SI, SE SIGUE DETECTANDO LA MÍSMA PELÍCULA
 
           call   SAL_SEC       ;NO, SE DETECTA OTRA PELÍCULA, SE ACTIVA LA SALIDA PARA EL
                                ;CALENTADOR DE SECADO

           movlw  'F'           ;SE MUEVE EL VALOR 'F' A FLG_FIN_PRO, DE ESTA FORMA, SE INDICA   
           movwf  FLG_FIN_PRO   ;QUE LA PELÍCULA ESTA SIENDO PROCESADA CORRECTAMENTE 

           movlw  0xFF          ;SE MUEVE EL VALOR 0xFF A FLG_EST_SPF 
           movwf  FLG_EST_SPF

           call   INC_PEL_PRO   ;SE INCREMENTA EL CONTADOR DE PELÍCULAS  
           call   MEN_INC_PEL   ;SE LE ORDENA AL MÓDULO DE CONTROL DEL DISPLAY, INCREMENTAR EL
                                ;CONTADOR DE PELÍCULAS
           
           goto   LER_REF_LIN_7


CON_DEC_002 call  DEC_CON_002   ;SE DECREMETA CON_002         

           movf   FLG_CON_002,W ;SE MUEVE FLG_CON_002 A W 
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
 
           btfss  STATUS,2      ;¿LLEGÓ CON_002 A TEMPORIZAR 20 SEGUNDOS?        
           goto   SAL_SEC_002   ;NO 
           
           clrf   FLG_CON_002   ;SI, SE PONE A 0 A FLG_CON_002  
            
           call   DEC_CON_003   ;SE DECREMENTA CON_003 

           movf   CON_003,W     ;SE MUEVE CON_003 A W    
           sublw  0x06          ;SE LE RESTA EL VALOR 0x06

           btfsc  STATUS,2      ;¿LLEGÓ CON_003 AL VALOR 0x06, PASARON 3 MINUTOS?            
           goto   DES_BOM_REC   ;SI
          
           movf   FLG_CON_003,W ;NO, SE MUEVE FLG_CON_003 A W    
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF   

           btfss  STATUS,2      ;¿LLEGÓ CON_003 A 0, PASARON 5 MINUTOS?
           goto   SAL_SEC_002   ;NO
           goto   ACT_EST_REP   ;SI 
         
          
DES_BOM_REC bcf   PORTB,4       ;SE DESCONECTA LA BOMBA DE RECIRCULACIÓN             

SAL_SEC_002 call  SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
       
           goto   LER_REF_LIN_7

;**********************************************************************************************


;******************* PASO AL MODO DE REPOSO, DESPUES DE PROCESAR PELÍCULAS ******************** 

ACT_EST_REP call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAN DE REFERENCIA DE LÍNEA 

           bcf    PORTB,1       ;COMO PRECAUCIÓN SE DESCONECTA EL CALENTADOR DEL QUÍMICO  
           bcf    PORTB,2       ;SE DESCONECTA EL MOTOR DE TRANSMISIÓN
           bcf    PORTB,5       ;SE DESCONECTA EL VENTILADOR DE SECADO 
           bcf    PORTB,6       ;SE DESCONECTA EL CALENTADOR DE SECADO                          

           movf   FLG_INI_PRO,W ;SE MUEVE FLG_INI_PRO A W  
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfss  STATUS,2      ;¿SE DETECTÓ CORRECAMENTE EL PRINCIPIO DE LA PELÍCULA?
           goto   ERR_010       ;NO         

           movf   FLG_FIN_PRO,W ;SI, SE MUEVE FLG_FIN_PRO A W  
           sublw  'F'           ;SE LE RESTA EL VALOR 'F'

           btfss  STATUS,2      ;¿SE DETECTÓ CORRECTAMENTE EL FINAL DE LA PELÍCULA? 
           goto   ERR_010       ;NO

           call   GRA_FLG_FPR   ;SI, SE ORDENA GRABAR EL ESTADO DE FLG_FIN_PRO
           call   GRA_PEL_PRO   ;SE ORDENA GRABAR EL ESTADO DEL CONTADOR DE PELÍCULAS  
           call   GRA_PAR_002   ;SE ORDENA GRABAR LOS VALORES DE LOS PARÁMETROS (MODIFICADOS)   

           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A FLG_SAL_SEC, DE ESTA FORMA, SE INDICA
           movwf  FLG_SAL_SEC   ;QUE NO DEBE DESACTIVARSE EL MODULADOR DE ANCHO DE PULSO 

           clrf   FLG_CON_003   ;SE PONE A 0 A FLG_CON_003 
         
           goto   LER_SPI_003   ;SE VUELVE AL ESTADO DE PREPOSO

;**********************************************************************************************

                                            
;*********** DETECCIÓN DE ERRORES DE FUNCIONAMIENTO, DETENCIÓN DEL TODO EL SISTEMA ************ 
           

;**********************************************************************************************

ERR_001    movlw  '1'           ;SE MUEVE EL VALOR '1' A ERROR_NX, DE ESTA FORMA SE 
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO

           goto   DES_CAL_LIN  

;**********************************************************************************************


;**********************************************************************************************

ERR_002    movlw  '2'           ;SE MUEVE EL VALOR '2' A ERROR_NX, DE ESTA FORMA SE 
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
 
           goto   DES_CAL_LIN 
           
;**********************************************************************************************


;**********************************************************************************************

ERR_003    movlw  '3'           ;SE MUEVE EL VALOR '3' A ERROR_NX, DE ESTA FORMA SE 
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
 
           goto   DES_CAL_LIN 

;**********************************************************************************************


;**********************************************************************************************

ERR_004    movlw  '4'           ;SE MUEVE EL VALOR '4' A ERROR_NX, DE ESTA FORMA SE 
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
 
           goto   DES_CAL_LIN 

;**********************************************************************************************


;**********************************************************************************************

ERR_006    movlw  '6'           ;SE MUEVE EL VALOR '6' A ERR_NUM_XX, DE ESTA FORMA SE  
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
  
           goto   DES_CAL_LIN 

;**********************************************************************************************


;**********************************************************************************************

ERR_007    bcf    PORTB,2       ;SE DESCONECTA EL MOTOR DE TRANSMISIÓN  
           bcf    PORTB,0       ;SE DESCONECTA EL RELÉ DE ALIMENTACIÓN DE LÍNEA

           movlw  '7'           ;SE MUEVE EL VALOR '7' A ERR_NUM_XX, DE ESTA FORMA SE  
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
  
           goto   ENV_MEN_ERR

;**********************************************************************************************


;**********************************************************************************************

ERR_008    movlw  '8'           ;SE MUEVE EL VALOR '8' A ERR_NUM_XX, DE ESTA FORMA SE  
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO

           goto   DES_CAL_LIN   

;**********************************************************************************************


;**********************************************************************************************

ERR_009    movlw  '9'           ;SE MUEVE EL VALOR '9' A ERR_NUM_XX, DE ESTA FORMA SE  
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
          
           goto   DES_CAL_LIN

;**********************************************************************************************

;**********************************************************************************************

ERR_010    movlw  'A'           ;SE MUEVE EL VALOR 'A' A ERR_NUM_XX, DE ESTA FORMA SE  
           movwf  ERR_NUM_XX    ;INDICA EL TIPO DE ERROR QUE SE PRODUJO
 
DES_CAL_LIN call  LER_REF_LIN
            
           bcf    PORTB,1       ;SE DESCONECTA EL CALENTADOR Y MEZCLADOR DEL QUÍMICO   
           bcf    PORTB,0       ;SE DESCONECTA EL RELÉ DE ALIMENTACIÓN DE LÍNEA           
 
ENV_MEN_ERR call  MEN_ERR  
           
;**********************************************************************************************


;****************************** SE PRODUJO ALGÚN TIPO DE ERROR ********************************

ERR_SIS    bsf    PORTB,7     ;SE GENERA UNA SECUENCIA DE ENCENDIDO Y APAGADO DEL 
           call   RET_50_mSE  ;INICADOR DE ERROR INDICANDO QUE SE PRODUJO UN ERROR
           bcf    PORTB,7     
           call   RET_50_mSE  
           goto   ERR_SIS

;**********************************************************************************************


;************************************ ZONA DE SUBRUTINAS **************************************


;********** SUBRUTINAS DE ENVÍO DE MENSAJES HACIA EL MÓDULO DE CONTROL DEL DISPLAY ************


;******************************** MENSAJES DE FUNCIONAMIENTO **********************************


;********************* ENVÍO DE LA ORDEN DE INICIALIZACIÓN DEL DISPLAY ************************

MEN_INI_DSP call  CAR_M       ;SE ENVIA EL CÓDIGO M.1, SE ORDENA PRESENTAR EL MENSAJE  
                              ;CORRESPONDIENTE 
           movlw  '1'
           movwf  TXREG
        
           goto   RET_MEN_232

;**********************************************************************************************


;******************** ENVÍO DE LA CADENA CON LOS DATOS DE LOS PARAMETROS **********************  

MEN_CAD_DAT movf  NVL_SEC,W   ;SE ENVÍA LA CADENA DE PARÁMETROS, CON RETARDOS DE  
           movwf  TXREG       ;10 MILISEGUNDOS ENTRE CADA UNO
           call   RET_200_uSE

           movf   NVL_CON,W     
           movwf  TXREG         
           call   RET_200_uSE

           movf   NVL_BRL,W     
           movwf  TXREG         
           call   RET_200_uSE 

           movf   NVL_REF_NOR,W
           movwf  TXREG         
           call   RET_200_uSE

           movf   VEL_PRO,W
           movwf  TXREG         
           call   RET_200_uSE

           movf   EST_BUZ,W     
           movwf  TXREG         
           call   RET_200_uSE 

           movf   PEL_PRO,W
           movwf  TXREG      

           goto   RET_MEN_232 

;**********************************************************************************************           


;*********************** ENVÍO DE LA ORDEN DE PRESENTACIÓN DEL EQUIPO *************************

MEN_PRE_SIS call  CAR_M       ;SE ENVIA EL CÓDIGO M.2, SE ORDENA PRESENTAR EL MENSAJE  
                              ;CORRESPONDIENTE      
           movlw  '2'
           movwf  TXREG
                
           goto   RET_MEN_232

;**********************************************************************************************


;*************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE POR FAVOR ESPERE ****************

MEN_POR_ESP call  CAR_M         ;SE ENVIA EL CÓDIGO M.3, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '3'
           movwf  TXREG

           goto   RET_MEN_232           

;**********************************************************************************************


;**************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE SISTEMA LISTO ******************

MEN_SIS_LIS call  CAR_M         ;SE ENVIA EL CÓDIGO M.3, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '4'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE INTRODUCIR PELICULA **************

MEN_INT_PEL call  CAR_M         ;SE ENVIA EL CÓDIGO M.5, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '5'
           movwf  TXREG
          
           goto   RET_MEN_232 

;**********************************************************************************************



;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE INTRODUCIR PELICULA **************

MEN_RIN_PEL call  CAR_M         ;SE ENVIA EL CÓDIGO M.6, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '6'
           movwf  TXREG
          
           goto   RET_MEN_232 

;**********************************************************************************************



;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE PROCESANDO PELÍCULA **************

MEN_PRO_PEL call  CAR_M         ;SE ENVIA EL CÓDIGO M.7, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '7'
           movwf  TXREG

           goto   RET_MEN_232

;**********************************************************************************************


;************* ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE EXPULSANDO PELÍCULA ***************

MEN_EXP_PEL call  CAR_M         ;SE ENVIA EL CÓDIGO M.8, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '8'
           movwf  TXREG

           goto   RET_MEN_232

;**********************************************************************************************


;***************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CODIGO = 0000 *****************

MEN_ING_COD call  CAR_M         ;SE ENVIA EL CÓDIGO M.8, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE           
           movlw  '9'
           movwf  TXREG

           goto   RET_MEN_232

;**********************************************************************************************


;************************** MENSAJES DE LAS POSIBILIDADES DEL MENU ****************************

;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CONTROL DE SECADO ****************

MEN_CON_SEC call  CAR_P         ;SE ENVIA EL CÓDIGO P.1, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '1'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************* ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CONTROL DE PANTALLA ***************

MEN_CON_PAN call  CAR_P         ;SE ENVIA EL CÓDIGO P.2, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '2'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;********** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CONTROL DE TEMP. QUIMICO *************

MEN_CON_QUI call  CAR_P         ;SE ENVIA EL CÓDIGO P.3, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '3'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;******** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CONTROL DE TIEMPO DE PROCESO ***********

MEN_CON_VEL call  CAR_P         ;SE ENVIA EL CÓDIGO P.4, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '4'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CONTROL DE BUZZER ****************

MEN_CON_BUZ call  CAR_P         ;SE ENVIA EL CÓDIGO P.5, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '5'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************* ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE CONTROL DE PELICULAS **************

MEN_CON_PEL call  CAR_P         ;SE ENVIA EL CÓDIGO P.6, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '6'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;**************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE SALIR DEL MENÚ *****************

MEN_SAL_MEN call  CAR_P         ;SE ENVIA EL CÓDIGO P.7, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE  
           movlw  '7'
           movwf  TXREG
           
           goto   RET_MEN_232 

;**********************************************************************************************


;******************** MENSAJES DE LOS VALORES DEL PARÁMETRO SELECCIONADO **********************


;************* ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE NIVEL DE SECADO = XX **************

MEN_NVL_SEC call  CAR_N         ;SE ENVIA EL CÓDIGO N.1, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  '1'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;*********************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE *************************

;                                     NIV. DE CONTR. = XX 
;                                     NIV. DE BRILLO = XX               
                                        
MEN_NVL_CB call   CAR_N         ;SE ENVIA EL CÓDIGO N.2, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  '2'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE NIVEL DE REF. = XX ***************

MEN_NVL_REF call  CAR_N         ;SE ENVIA EL CÓDIGO N.3, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  '3'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;*************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE VELOCIDAD = BAJA ****************
;                                                                       = MEDIA    
;                                                                       = ALTA 
                                     
MEN_VEL_PRO call  CAR_N         ;SE ENVIA EL CÓDIGO N.4, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  '4'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************* ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE ¿BUZZER ACTIVO? = SI *************
;                                                           ¿BUZZER ACTIVO? = NO 
 
MEN_EST_BUZ call  CAR_N         ;SE ENVIA EL CÓDIGO N.5, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  '5'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE PELIC. PROC. = XXX ***************
 
MEN_PEL_PRO call  CAR_N         ;SE ENVIA EL CÓDIGO N.6, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  '6'
           movwf  TXREG

           goto   RET_MEN_232 

;**********************************************************************************************


;******************* ENVÍO DE LA ORDEN DE INCREMENTO DEL NIVEL DE SECADO **********************

MEN_INC_SEC call  CAR_I         ;SE ENVIA EL CÓDIGO I.1, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '1'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;******************* ENVÍO DE LA ORDEN DE DECREMENTO DEL NIVEL DE SECADO **********************

MEN_DEC_SEC call  CAR_D         ;SE ENVIA EL CÓDIGO D.1, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '1'
           movwf  TXREG
         
           goto   RET_MEN_232  

;**********************************************************************************************


;****************** ENVÍO DE LA ORDEN DE INCREMENTO DEL NIVEL DE CONTRASTE ********************

MEN_INC_CON call  CAR_I        ;SE ENVIA EL CÓDIGO I.2, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '2'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;****************** ENVÍO DE LA ORDEN DE DECREMENTO DEL NIVEL DE CONTRASTE ********************

MEN_DEC_CON call  CAR_D         ;SE ENVIA EL CÓDIGO D.2, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '2'
           movwf  TXREG
         
           goto   RET_MEN_232  

;**********************************************************************************************


;******************* ENVÍO DE LA ORDEN DE INCREMENTO DEL NIVEL DE BRILLO **********************

MEN_INC_BRL call  CAR_I        ;SE ENVIA EL CÓDIGO I.3, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '3'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;******************* ENVÍO DE LA ORDEN DE DECREMENTO DEL NIVEL DE BRILLO **********************

MEN_DEC_BRL call  CAR_D         ;SE ENVIA EL CÓDIGO D.3, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '3'
           movwf  TXREG
         
           goto   RET_MEN_232  

;**********************************************************************************************


;***************** ENVÍO DE LA ORDEN DE INCREMENTO DEL NIVEL DE REFERENCIA ********************

MEN_INC_REF call  CAR_I        ;SE ENVIA EL CÓDIGO I.4, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '4'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;***************** ENVÍO DE LA ORDEN DE DECREMENTO DEL NIVEL DE REFERENCIA ********************

MEN_DEC_REF call  CAR_D        ;SE ENVIA EL CÓDIGO D.4, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '4'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************



;**************** ENVÍO DE LA ORDEN DE INCREMENTO DE LA VELOCIDAD DE PROCESO *******************

MEN_INC_VEL call  CAR_I        ;SE ENVIA EL CÓDIGO I.5, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '5'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;**************** ENVÍO DE LA ORDEN DE DECREMENTO DE LA VELOCIDAD DE PROCESO *******************

MEN_DEC_VEL call  CAR_D        ;SE ENVIA EL CÓDIGO D.5, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '5'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;************************ ENVÍO DE LA ORDEN DE ACTIVACIÓN DEL BUZZER **************************

MEN_ACT_BUZ call  CAR_I         ;SE ENVIA EL CÓDIGO I.6, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '6'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;********************** ENVÍO DE LA ORDEN DE DESACTIVACIÓN DEL BUZZER *************************

MEN_DES_BUZ call  CAR_D         ;SE ENVIA EL CÓDIGO D.6, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '6'
           movwf  TXREG
         
           goto   RET_MEN_232  

;**********************************************************************************************


;**************** ENVÍO DE LA ORDEN DE INCREMENTO DEL CONTADOR DE PELICULAS *******************

MEN_INC_PEL call  CAR_I         ;SE ENVIA EL CÓDIGO I.7, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE
           movlw  '7'
           movwf  TXREG

           goto   RET_MEN_232 
          
;**********************************************************************************************


;*********** ENVÍO DE LA ORDEN DE VISUALIZACIÓN DE LA "FLECHA" EN LA PRIMERA LÍNEA ************

MEN_FLH_CON call  CAR_F         ;SE ENVIA EL CÓDIGO F.C, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  'C'
           movwf  TXREG

           goto   RET_MEN_232  
       
;**********************************************************************************************


;*********** ENVÍO DE LA ORDEN DE VISUALIZACIÓN DE LA "FLECHA" EN LA SEGUNDA LÍNEA ************

MEN_FLH_BRL call  CAR_F         ;SE ENVIA EL CÓDIGO F.B, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  'B'
           movwf  TXREG

           goto   RET_MEN_232  
       
;**********************************************************************************************


;**************** ENVÍO DE LA ORDEN DE MODIFICACIÓN DEL NIVEL DE CONTASTE *********************

MEN_CAM_CON call  CAR_C         ;SE ENVIA EL CÓDIGO C.C, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  'C'
           movwf  TXREG

           goto   RET_MEN_232  
       
;**********************************************************************************************


;**************** ENVÍO DE LA ORDEN DE MODIFICACIÓN DEL NIVEL DE CONTASTE *********************

MEN_CAM_BRL call  CAR_C         ;SE ENVIA EL CÓDIGO C.B, SE ORDENA PRESENTAR EL MENSAJE  
                                ;CORRESPONDIENTE 
           movlw  'B'
           movwf  TXREG

           goto   RET_MEN_232  
       
;**********************************************************************************************


;************** ENVÍO DE LA ORDEN DE PRESETACIÓN DEL MENSAJE DEL ERROR PRODUCIDO **************

MEN_ERR    movlw  'E'
           movwf  TXREG

           call   RET_200_uSE
             
           movf   ERR_NUM_XX,W 
           movwf  TXREG

RET_MEN_232 call  LER_BUF_01
           return 

;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "M" ************************************

CAR_M      movlw  'M'           ;SE ENVIA EL CÓDIGO M  
           movwf  TXREG

           call   RET_PAT          
           return  
   
;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "P" ************************************

CAR_P      movlw  'P'           ;SE ENVIA EL CÓDIGO P  
           movwf  TXREG
        
           call   RET_PAT
           return  
   
;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "N" ************************************

CAR_N      movlw  'N'           ;SE ENVIA EL CÓDIGO N  
           movwf  TXREG
        
           call   RET_PAT
           return  
   
;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "I" ************************************

CAR_I      movlw  'I'           ;SE ENVIA EL CÓDIGO I 
           movwf  TXREG
        
           call   RET_PAT 
           return  
   
;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "D" ************************************

CAR_D      movlw  'D'           ;SE ENVIA EL CÓDIGO D 
           movwf  TXREG
        
           call   RET_PAT
           return  
   
;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "C" ************************************

CAR_C      movlw  'C'           ;SE ENVIA EL CÓDIGO C  
           movwf  TXREG
        
           call   RET_PAT
           return  
   
;**********************************************************************************************


;********************************** ENVÍO DEL CARACTER "F" ************************************

CAR_F      movlw  'F'           ;SE ENVIA EL CÓDIGO F  
           movwf  TXREG
        
           call   RET_PAT
           return  
   
;**********************************************************************************************


;******************************* SUBRUTINAS DE FUNCIONAMIENTO ********************************* 


;**************** EXPLORACIÓN DEL ESTADO DEL MÓDULO DE CONTROL DEL DISPLAY 1 ****************** 

LER_BUF_01 call   LER_REF_LIN
           call   SAL_SEC

           btfss  PIR1,5      ;¿EL BUFFER DE RECEPCIÓN DEL PUERTO ESTA LLENO?      
           goto   LER_BUF_01  ;NO

           movf   RCREG,W     ;SI, SE MUEVE EL VALOR DE RCREG A W
           sublw  'O'         ;SE LE RESTA EL VALOR 'O'      
            
           btfss  STATUS,2    ;¿SE RECIBIÓ LA RESPUESTA CORRECTA DESDE EL DISPLAY?
           goto   ERR_SIS     ;NO
                       
           clrf   RCREG       ;SI, SE PONE EL BUFFER A 0  
           return              

;**********************************************************************************************


;*************************** ENTRADA A LAS POSIBILIDADES DEL MENU *****************************

ENT_MEN    call   LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA  
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO

;**********************************************************************************************


;********************** TEMPORIZADOR DE 2 SEGUNDOS CON ESTE SE CONTROLA ***********************
 
;******************** EL INGRESO AL MODO DE SERVICIO Ó A AJUSTES BÁSICOS **********************    

           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A CON_001, DE ESTA FORMA SE PONE A 0  
           movwf  CON_001       ;A ESTE CONTADOR 

           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A CON_005 Y CON_006, DE ESTA FORMA, SE   
           movwf  CON_005       ;PONE A 0 A ESTOS CONTADORES 
           movwf  CON_006 
         
          
REP_BUC_004 call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA 
            
           incf   CON_001,F     ;CON_001 SE INCREMENTA EN UNA UNIDAD 
        
           movf   CON_001,W     ;SE MUEVE CON_001 A W
           sublw  0xC8          ;SE LE RESTA EL VALOR 0xC8 
           
           btfsc  STATUS,2      ;¿LLEGÓ C0N_001 AL VALOR 0xC8, PASARON 2 SEGUNDOS? 
           goto   ING_COD       ;SI 

           btfss  PORTC,0       ;NO, ¿SE SIGUE PRESIONANDO LA TECLA MENÚ?
           goto   ENT_VEL_PRO   ;NO

           call   SAL_SEC       ;SI, SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
        
           goto   REP_BUC_004   
          
;**********************************************************************************************



            
;******************* PETICIÓN DEL CÓDIGO PARA INGRESAR AL MODO DE SERVICIO ********************
      
ING_COD    call   SAL_SEC       ;SI, SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
           call   MEN_ING_COD   ;SE ORDENA MOSTRAR EL MENSAJE "CODIGO = 0000" 
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ


MEN_LLP_COD call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_PAN   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_SAL_MEN   ;SI         

           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   ENT_NVL_SEC   ;SI

           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_COD   ;NO    
           return               ;SI 

;**********************************************************************************************
















;******************************************************************************************














;************************** ENTRADA AL PARÁMETRO CONTROL DE SECADO ****************************
 
           call   MEN_CON_SEC   ;SE ORDENA MOSTRAR EL MENSAJE "CONTROL DE SECADO"
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ 
          

MEN_LLP_P01 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_PAN   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_SAL_MEN   ;SI         

           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   ENT_NVL_SEC   ;SI

           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P01   ;NO    
           return               ;SI 


PAR_CON_SEC call  MEN_CON_SEC   ;SE ORDENA PRESENTAR EL MENSAJE CONTROL DE SECADO 

            clrf  FLG_EST_LLP   ;SE PONE A 0 A FLG_EST_LLP

            goto  MEN_LLP_P01  

;**********************************************************************************************


;*********** ENTRADA AL PARÁMETRO CONTROL DE PANTALLA CON SECUENCIA DE GIRO HORARIO ***********

PAR_CON_PAN call  MEN_CON_PAN   ;SE ORDENA PRESENTAR EL MENSAJE CONTROL DE PANTALLA 
            call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006   

MEN_LLP_P02 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS
         
           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_QUI   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_CON_SEC   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?             
           goto   ENT_NVL_CB    ;SI
  
           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P02   ;NO    
           return               ;SI 

;**********************************************************************************************


;********* ENTRADA AL PARÁMETRO CONTROL DE TEMP. QUIMICO CON SECUENCIA DE GIRO HORARIO ********

PAR_CON_QUI call  MEN_CON_QUI   ;SE ORDENA PRESENTAR EL MENSAJE CONTROL DE TEMP. QUIMICO 
           call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
    
MEN_LLP_P03 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS  
         
           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_VEL   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_CON_PAN   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?             
           goto   ENT_NVL_REF   ;SI
  
           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P03   ;NO   
           return               ;SI

;**********************************************************************************************


;****** ENTRADA AL PARÁMETRO CONTROL DE TIEMPO DE PTOCESO CON SECUENCIA DE GIRO HORARIO *******

PAR_CON_VEL call  MEN_CON_VEL   ;SE ORDENA PRESENTAR EL MENSAJE CONTROL DE TIEMPO DE PROCESO
            call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
          
MEN_LLP_P04 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS  
            
           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_BUZ   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_CON_QUI   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?             
           goto   ENT_VEL_PRO   ;SI
  
           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P04   ;NO   
           return               ;SI

;**********************************************************************************************


;************ ENTRADA AL PARÁMETRO CONTROL DE BUZZER CON SECUENCIA DE GIRO HORARIO ************

PAR_CON_BUZ call  MEN_CON_BUZ   ;SE ORDENA PRESENTAR EL MENSAJE CONTROL DE BUZZER 
           call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006

MEN_LLP_P05 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS 
         
           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_PEL_PRO   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_CON_VEL   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?             
           goto   ENT_EST_BUZ   ;SI
  
           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P05   ;NO
           return               ;SI

;**********************************************************************************************


;********** ENTRADA AL PARÁMETRO CONTROL DE PELÍCULAS CON SECUENCIA DE GIRO HORARIO ***********

PAR_PEL_PRO call  MEN_CON_PEL   ;SE ORDENA PRESENTAR EL MENSAJE CONTROL DE PELICULA
           call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006 
      

MEN_LLP_P06 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS
         
           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_SAL_MEN   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_CON_BUZ   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?    
           goto   ENT_PEL_PRO   ;SI
  
           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P06   ;NO    
           return               ;SI
             
;**********************************************************************************************


;******* ENTRADA AL PARÁMETRO CONTROL DE SALIDA DEL MENÚ CON SECUENCIA DE GIRO HORARIO ********

PAR_SAL_MEN call  MEN_SAL_MEN   ;SE ORDENA PRESENTAR EL MENSAJE SALIR DEL MENÚ
            call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006              

MEN_LLP_P07 call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS
         
           movf   FLG_EST_LLP,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_SEC   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   PAR_PEL_PRO   ;SI         

           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfsc  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?             
           goto   REF_LIN_SAL   ;SI
           
           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfss  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           goto   MEN_LLP_P07   ;NO     
           return               ;SI 
            

REF_LIN_SAL call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA
           return

;**********************************************************************************************


;****************** MODIFICACIÓN DE LOS VALORES DEL PARÁMETRO SELECCIONADO ********************


;******************************* ENTRADA A NIVEL DE SEC. = XX *********************************

ENT_NVL_SEC call  MEN_NVL_SEC   ;SE ORDENA PRESENTAR EL MENSAJE NIVEL DE SECADO 
           
           movf   RET_DIS,W     ;SE MUEVE RET_DIS A W 
           movwf  NVL_PAT       ;SE COPIA SU VALOR A NVL_PAT 

           call   REF_MAX_5B
           call   REF_MIN_00
           call   EXP_MEN_000
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006

;**********************************************************************************************


;** EXPLORACIÓN DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS PARA MODIFICAR EL NIVEL DE SECADO ****

EXP_LLP_SEC call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS 

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   INC_NVL_SEC   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   DEC_NVL_SEC   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_SEC   ;NO

           call   BOR_CON_056   ;SI, SE PONE A 0 A CON_005 Y CON_006 
          
           goto   ENT_MEN       

;**********************************************************************************************


;****************************** INCREMENTO DEL NIVEL DE SECADO ********************************  

INC_NVL_SEC call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
           call   COM_FLG_SEC   ;SE EXPLORA EL ESTADO DE FLG_NVL_SEC   
           call   DEC_NVL_PAT   ;SE DECREMENTO EL VALOR DEL NIVEL PATRÓN  

           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF A W  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÁXIMO DE SECADO ADMITIDO?
           goto   INC_SEC       ;NO
           call   ACT_PAT_INC   ;SI

           goto   EXP_LLP_SEC              

INC_SEC    incf   NVL_SEC,F     ;NVL_SEC SE INCREMENTA EN UNA UNIDAD

           call   MEN_INC_SEC   ;SE ORDENA MOSTRAR EL VALOR INCREMENTADO DEL NIVEL DE SECADO     
           
           goto   ACT_NVL_SEC          

;**********************************************************************************************


;****************************** DECREMENTO DEL NIVEL DE SECADO ********************************

DEC_NVL_SEC call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
           call   COM_FLG_SEC   ;SE EXPLORA EL ESTADO DE FLG_NVL_SEC   
           call   INC_NVL_PAT   ;SE INCREMENTA EL VALOR DEL NIVEL PATRÓN
            
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF A W  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÍNIMO DE SECADO ADMITIDO?
           goto   DEC_SEC       ;NO      
           call   ACT_PAT_DEC   ;SI

           goto   EXP_LLP_SEC           
                  
DEC_SEC    decf   NVL_SEC,F     ;NVL_SEC SE DECREMENTA EN UNA UNIDAD

           call   MEN_DEC_SEC   ;SE ORDENA MOSTRAR EL VALOR DECREMENTADO DEL NIVEL DE SECADO  

ACT_NVL_SEC movf  NVL_PAT,W     ;SE MUEVE NVL_PAT A W 
           movwf  RET_DIS       ;SE COPIA SU VALOR A RET_DIS, ACTUALIZANDO SU VALOR 

           goto   EXP_LLP_SEC           
                 
;**********************************************************************************************


;******************************* ENTRADA A NIV. DE CONTR. = 00 ********************************
;                                          NIV. DE BRILL. = 00

ENT_NVL_CB call   MEN_NVL_CB   ;        
           call   EXP_MEN_000  ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056  ;SE PONE A 0 A CON_005 Y CON_006
 
;**********************************************************************************************


;******************* EXPLORACIÓN DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS *********************

;****************** PARA INGRESAR A LA POSIBLILIDAD DE MODIFICAR EL BRILLO ********************
 
;*********************** Ó A LA POSIBILIDAD DE MODIFICAR EL CONTRASTE *************************

EXP_LLP_CB call   EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 
  
           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   ENT_CFB       ;SI         
      
           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_CB    ;NO

           call   MEN_CAM_CON   ;SI, SE ORDENA PRODUCIR EL PARPADEO DE LA FLECHA EN LA FILA 
                                ;SUPERIOR

;**********************************************************************************************
          

;********************* EXPLORACIÓN DE LA LLAVE DE PULSOS Y LA TECLA MENÚ **********************
  
;** PARA MODIFICAR EL NIVEL DE CONTRASTRE Ó SALIR DE LA POSIBILIDAD DE MODIFICAR LOS VALORES **       

ENT_NVL_CON movf  NVL_CON,W     ;SE MUEVE NVL_CON A W 
           movwf  NVL_PAT       ;SE COPIA SU VALOR A NVL_PAT 

           call   REF_MAX_64     
           call   REF_MIN_FF    
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006 

EXP_LLP_CON call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 
 
           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   INC_NVL_CON   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   DEC_NVL_CON   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_CON   ;NO

           call   MEN_CAM_CON   ;SI, SE ORDENA DETENER EL PARPADEO DE LA FLECHA EN LA FILA 
                                ;SUPERIOR

           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006  

           goto   EXP_LLP_CB 

;**********************************************************************************************


;**************************** INCREMENTO DEL NIVEL DE CONTRASTE *******************************
    
INC_NVL_CON call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
           call   COM_FLG_CON   ;SE EXPLORA EL ESTADO DE FLG_NVL_CON    
           call   INC_NVL_PAT   ;SE IMCREMENTA EL VALOR DEL NIVEL PATRÓN       
 
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÁXIMO DE CONTRASTE ADMITIDO?
           goto   INC_CON       ;NO
           call   ACT_PAT_DEC   ;SI            

           goto   EXP_LLP_CON              

INC_CON    call   MEN_INC_CON   ;SE ORDENA MOSTRAR EL VALOR INCREMENTADO DEL NIVEL DE CONTRASTE

           goto   ACT_VAL_CON
                 
;**********************************************************************************************


;**************************** DECREMENTO DEL NIVEL DE CONTRASTE *******************************

DEC_NVL_CON call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
           call   COM_FLG_CON   ;SE EXPLORA EL ESTADO DE FLG_NVL_CON    
           call   DEC_NVL_PAT   ;SE DECREMENTA EL VALOR DEL NIVEL PATRÓN
            
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÁXIMO DE CONTRASTE ADMITIDO?
           goto   DEC_CON       ;NO
           call   ACT_PAT_INC   ;SI            

           goto   EXP_LLP_CON              

DEC_CON    call   MEN_DEC_CON   ;SE ORDENA MOSTRAR EL VALOR DECREMENTADO DEL NIVEL DE CONTRASTE

ACT_VAL_CON movf  NVL_PAT,W     ;SE MUEVE NVL_PAT A W 
           movwf  NVL_CON       ;SE COPIA SU VALOR A NVL_CON, ACTUALIZANDO SU VALOR 

           goto   EXP_LLP_CON
         
;**********************************************************************************************

;*********** 

ENT_CFB    call   MEN_FLH_BRL   ;SE ORDENA CAMBIAR LA POSICIÓN DE LA FLECHA A LA FILA INFERIOR 
           call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006

EXP_LLP_CFB call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 
   
           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   PAR_CON_PAN   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   ENT_CFC       ;SI    

           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_CFB   ;NO
           goto   ENT_NVL_BRL   ;SI    
              
ENT_CFC    call   MEN_FLH_CON   ;SE ORDENA CAMBIAR LA POSICIÓN DE LA FLECHA A LA FILA SUPERIOR 
           call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
          
           goto   EXP_LLP_CB
        
;**********************************************************************************************


;********************* EXPLORACIÓN DE LA LLAVE DE PULSOS Y LA TECLA MENÚ **********************
  
;*** PARA MODIFICAR EL NIVEL DE BRILLO Ó SALIR DE LA POSIBILIDAD DE MODIFICAR LOS VALORES *****      

ENT_NVL_BRL call  MEN_CAM_BRL   ;SE ORDENA PRODUCIR EL PARPADEO DE LA FLECHA EN LA FILA INFERIOR              
           
           movf   NVL_BRL,W     ;SE MUEVE NVL_BRL A W 
           movwf  NVL_PAT       ;SE COPIA SU VALOR A NVL_PAT 

           call   REF_MAX_64 
           call   REF_MIN_FF
           call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006  
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
            

EXP_LLP_BRL call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI  

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   INC_NVL_BRL   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   DEC_NVL_BRL   ;SI         

           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_BRL   ;NO

           call   MEN_CAM_BRL   ;SI, SE ORDENA DETENER EL PARPADEO DE LA FLECHA EN LA FILA
                                ;INFERIOR
   
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006   

           goto   EXP_LLP_CFB 

;**********************************************************************************************


;****************************** INCREMENTO DEL NIVEL DE BRILLO ********************************          

INC_NVL_BRL call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006  
           call   COM_FLG_BRL   ;SE EXPLORA EL ESTADO DE FLG_NVL_BRL             
           call   INC_NVL_PAT   ;SE IMCREMENTA EL VALOR DEL NIVEL PATRÓN     
            
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÁXIMO DE BRILLO ADMITIDO?
           goto   INC_BRL       ;NO
           call   ACT_PAT_DEC   ;SI
          
           goto   EXP_LLP_BRL           

INC_BRL    call   MEN_INC_BRL   ;SE ORDENA MOSTRAR EL VALOR INCREMENTADO DEL NIVEL DE BRILLO

           goto   ACT_VAL_BRL                 

;**********************************************************************************************


;***************************** DECREMENTO DEL NIVEL DE BRILLO *********************************

DEC_NVL_BRL call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006  
           call   COM_FLG_BRL   ;SE EXPLORA EL ESTADO DE FLG_NVL_BRL             
           call   DEC_NVL_PAT   ;SE DECREMENTA EL VALOR DEL NIVEL PATRÓN     
            
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÁXIMO DE BRILLO ADMITIDO?
           goto   DEC_BRL       ;NO
           call   ACT_PAT_INC   ;SI
          
           goto   EXP_LLP_BRL           

DEC_BRL    call   MEN_DEC_BRL   ;SE ORDENA MOSTRAR EL VALOR DECREMENTADO DEL NIVEL DE BRILLO

ACT_VAL_BRL movf  NVL_PAT,W     ;SE MUEVE NVL_PAT A W 
           movwf  NVL_BRL       ;SE COPIA SU VALOR A NVL_BRL, ACTUALIZANDO SU VALOR

           goto   EXP_LLP_BRL           

;**********************************************************************************************


;******************************* ENTRADA A NIVEL DE REF. = XXX ********************************

ENT_NVL_REF call  MEN_NVL_REF   ;SE ORDENA PRESENTAR EL MENSAJE NIVEL DE REF. = XXX
           
           movf   NVL_REF_NOR,W ;SE MUEVE NVL_REF_NOR A W 
           movwf  NVL_PAT       ;SE COPIA SU VALOR A NVL_PAT 

           call   REF_MAX_FE
           call   REF_MIN_01
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006

;**********************************************************************************************


;********************* EXPLORACIÓN DE LA LLAVE DE PULSOS Y LA TECLA MENÚ **********************
  
;*************************** PARA MODIFICAR EL NIVEL DE REFERENCIA ****************************

;********************* Ó SALIR DE LA POSIBILIDAD DE MODIFICAR LOS VALORES *********************      

EXP_LLP_REF call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS
 
           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 
  
           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   INC_NVL_REF   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   DEC_NVL_REF    ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_REF   ;NO

           call   MEN_CON_QUI   ;SI, SE ORDENA PRESENTAR EL MENSAJE CONTROL DE TEMP. QUIMICO
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006 

           goto   MEN_LLP_P03

;**********************************************************************************************


;**************************** INCREMENTO DEL NIVEL DE REFERENCIA ******************************  

INC_NVL_REF call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006  
           call   COM_FLG_REF   ;SE EXPLORA EL ESTADO DE FLG_NVL_REF      
           call   INC_NVL_PAT   ;SE INCREMENTA EL VALOR DEL NIVEL PATRÓN
            
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÁXIMO DE REFERENCIA ADMITIDO?
           goto   INC_REF       ;NO
           call   ACT_PAT_DEC   ;SI
           
           goto   EXP_LLP_REF           

INC_REF    incf   NVL_REF_INF,F ;NVL_REF_INF, SE INCREMENTA EN UNA UNIDAD
           incf   NVL_REF_SUP,F ;NVL_REF_SUP, SE INCREMENTA EN UNA UNIDAD

           call   MEN_INC_REF   ;SE ORDENA MOSTRAR EL VALOR INCREMENTADO DEL NIVEL DE REFERENCIA   
                
           goto   ACT_VAL_REF 

;**********************************************************************************************


;**************************** DECREMENTO DEL NIVEL DE REFERENCIA ******************************

DEC_NVL_REF call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006  
           call   COM_FLG_REF   ;SE EXPLORA EL ESTADO DE FLG_NVL_REF      
           call   DEC_NVL_PAT   ;SE DECREMENTA EL VALOR DEL NIVEL PATRÓN
                          
           movf   FLG_NVL_REF,W ;SE MUEVE FLG_NVL_REF A W  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
   
           btfss  STATUS,2      ;¿SE LLEGÓ AL NIVEL MÍNIMO DE REFERENCIA ADMITIDO?
           goto   DEC_REF       ;NO      
           call   ACT_PAT_INC   ;SI

           goto   EXP_LLP_REF           
                  
DEC_REF    decf   NVL_REF_INF,F ;NVL_REF_INF SE DECREMENTA EN UNA UNIDAD
           decf   NVL_REF_SUP,F ;NVL_REF_SUP SE DECREMENTA EN UNA UNIDAD

           call   MEN_DEC_REF   ;SE ORDENA MOSTRAR EL VALOR DECREMENTADO DEL NIVEL DE REFERENCIA

ACT_VAL_REF movf  NVL_PAT,W     ;SI, SE MUEVE NVL_PAT A W 
           movwf  NVL_REF_NOR   ;SE COPIA SU VALOR A NVL_REF_NOR, ACTUALIZANDO SU VALOR

           goto   EXP_LLP_REF           
                            
;**********************************************************************************************


;******************************** ENTRADA A VELOCIDAD = BAJA **********************************
;                                                     = MEDIA                               
;                                                     = ALTA        

ENT_VEL_PRO call  MEN_VEL_PRO   ;SE ORDENA PRESENTAR EL MENSAJE VELOCIDAD = XXX 
           
           movf   VEL_PRO,W     ;SE MUEVE VEL_PRO A W 
           movwf  NVL_PAT       ;SE COPIA SU VALOR A NVL_PAT 

           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006

;**********************************************************************************************


;******************** EXPLORACIÓN DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS ********************

;************************** PARA MODIFICAR LA VELOCIDAD DE PROCESO ****************************

EXP_LLP_VEL call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS 

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   INC_VEL_PRO   ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   DEC_VEL_PRO   ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_VEL   ;NO

           call   MEN_CON_VEL   ;SI, SE ORDENA PRESENTAR EL MENSAJE CONTROL DE TIEMPO DE PROCESO
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006 

           goto   MEN_LLP_P04

;**********************************************************************************************


;*************************** INCREMENTO DE LA VELOCIDAD DE PROCESO ****************************  

INC_VEL_PRO call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
           call   COM_FLG_VEL   ;SE EXPLORA EL ESTADO DE FLG_VEL_PRO   

           movf   NVL_PAT,W     ;SE MUEVE NVL_PAT A W   
           sublw  0xFE          ;SE LE RESTA EL VALOR 0xFE 
 
           btfsc  STATUS,2      ;¿EL VALOR DE LA VELOCIDAD ESTA EN SU VALOR MÁXIMO?
           goto   EXP_LLP_VEL   ;SI, NO SE EFECTÚA NINGUNA MODIFICACIÓN 

           movf   NVL_PAT,W     ;NO, SE MUEVE NVL_PAT A W  
           addwf  VAL_REF_VEL,0 ;SE LE SUMA VAL_REF_VEL   
           movwf  NVL_PAT       ;NVL_PAT ADQUIERE EL NUEVO VALOR  
                   
INC_VEL    call   MEN_INC_VEL   ;SE ORDENA MOSTRAR EL VALOR INCREMENTADO DE LA VELOCIDAD DE 
                                ;PROCESO     
           
           goto   ACT_VAL_VEL  

;**********************************************************************************************           



;*************************** DECREMENTO DE LA VELOCIDAD DE PROCESO **************************** 

DEC_VEL_PRO call  BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006
           call   COM_FLG_VEL   ;SE EXPLORA EL ESTADO DE FLG_VEL_PRO   

           movf   NVL_PAT,W     ;SE MUEVE NVL_PAT A W   
           sublw  0x00          ;SE LE RESTA EL VALOR 0x00 
 
           btfsc  STATUS,2      ;¿EL VALOR DE LA VELOCIDAD ESTA EN SU VALOR MÍNIMO?
           goto   EXP_LLP_VEL   ;SI, NO SE EFECTÚA NINGUNA MODIFICACIÓN 

           movf   VAL_REF_VEL,W ;NO, SE MUEVE VAL_REF_VEL A W    
           subwf  NVL_PAT,0     ;SE LE RESTA NVL_PAT    
           movwf  NVL_PAT       ;NVL_PAT ADQUIERE EL NUEVO VALOR  
                   
DEC_VEL    call   MEN_DEC_VEL   ;SE ORDENA MOSTRAR EL VALOR INCREMENTADO DE LA VELOCIDAD DE 
                                ;PROCESO     
 
ACT_VAL_VEL movf  NVL_PAT,W     ;SI, SE MUEVE NVL_PAT A W 
           movwf  VEL_PRO       ;SE COPIA SU VALOR A VEL_PRO, ACTUALIZANDO SU VALOR
      
           goto   EXP_LLP_VEL      

;**********************************************************************************************


;****************************** ENTRADA A ¿BUZZER ACTIVO? = SI ********************************
;                                         ¿BUZZER ACTIVO? = NO

ENT_EST_BUZ call  MEN_EST_BUZ   ;SE ORDENA PRESENTAR EL MENSAJE ¿BUZZER ACTIVO? = XX           
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ    
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006

;**********************************************************************************************


;********************* EXPLORACIÓN DE LA LLAVE DE PULSOS Y LA TECLA MENÚ **********************
  
;************** PARA ENTRAR A LA POSIBILIDAD DE MODIFICAR EL ESTADO DEL BUZZER ****************
 
EXP_LLP_BUZ call  EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS

           movf   FLG_CON_006,W ;NO, SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 
   
           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'I'           ;SE LE RESTA EL VALOR 'I'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO HORARIO?
           goto   ACT_BUZ       ;SI         

           movf   FLG_EST_LLP,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'D'           ;SE LE RESTA EL VALOR 'D'

           btfsc  STATUS,2      ;¿SE GENERÓ LA SECUENCIA EN SENTIDO ANTIHORARIO?
           goto   DES_BUZ       ;SI         

           movf   FLG_TEC_MEN,W ;SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_LLP_BUZ   ;NO

           call   MEN_CON_BUZ   ;SI, SE ORDENA PRESENTAR EL MENSAJE CONTROL DE BUZZER
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006  

           goto   MEN_LLP_P05

;**********************************************************************************************


;*********************************** ACTIVACIÓN DEL BUZZER ************************************          
 
ACT_BUZ    call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006                
           call   COM_FLG_BUZ   ;SE EXPLORA EL ESTADO DE FLG_NVL_BUZ  

           movf   EST_BUZ,W     ;SE MUEVE EST_BUZ A W  
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
    
           btfsc  STATUS,2      ;¿EL BUZZER YA SE ENCUENTRA ACTIVADO?     
           goto   EXP_LLP_BUZ   ;SI
  
           movlw  0xFF          ;SE MUEVE EL VALOR 0xFF A EST_BUZ, DE ESTA FORMA, SE ACTIVA  
           movwf  EST_BUZ       ;EL BUZZER 
          
           call   MEN_ACT_BUZ   ;SE ORDENA ACTIVAR EL BUZZER

           goto   EXP_LLP_BUZ 

;**********************************************************************************************


;********************************* DESACTIVACIÓN DEL BUZZER ***********************************          

DES_BUZ    call   BOR_LLP_056   ;SE PONE A 0 A FLG_EST_LLP, CON_005 Y CON_006    
           call   COM_FLG_BUZ   ;SE EXPLORA EL ESTADO DE FLG_NVL_BUZ 

           movf   EST_BUZ,W     ;SE MUEVE EST_BUZ A W  
           sublw  0x00          ;SE LE RESTA EL VALOR 0x00
    
           btfsc  STATUS,2      ;¿EL BUZZER YA SE ENCUENTRA DESACTIVADO?     
           goto   EXP_LLP_BUZ   ;SI
  
           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A EST_BUZ, DE ESTA FORMA, SE DESACTIVA  
           movwf  EST_BUZ       ;EL BUZZER 
          
           call   MEN_DES_BUZ   ;SE ORDENA DESACTIVAR EL BUZZER 

           goto   EXP_LLP_BUZ 

;**********************************************************************************************


;******************************* ENTRADA A PELIC. PROC. = XXX *********************************
                              
ENT_PEL_PRO call  MEN_PEL_PRO   ;SE ORDENA PRESENTAR EL MENSAJE PELIC. PROC. = XXX        
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006 

;**********************************************************************************************


;************************* EXPLORACIÓN DE LA TECLA MENÚ PARA SALIR ****************************
  
;***************** DE LA PRESENTACIÓN DE LA CANTIDAD DE PELICULAS PROCESADAS ******************
 
EXP_MEN_PP call   EXP_EST_LLP   ;SE EXPLORA EL ESTADO DE LA TECLA MENÚ Y DE LA LLAVE DE PULSOS
         
           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
          
           btfsc  STATUS,2      ;¿SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO?
           return               ;SI 

           movf   FLG_TEC_MEN,W ;NO, SE MUEVE FLG_EST_LLP A W 
           sublw  'M'           ;SE LE RESTA EL VALOR 'M'

           btfss  STATUS,2      ;¿PRESIONÓ LA TECLA MENÚ?
           goto   EXP_MEN_PP    ;NO

           call   MEN_CON_PEL   ;SI, SE ORDENA PRESENTAR EL MENSAJE CONTROL DE PELICULA 
           call   EXP_MEN_000   ;SE EXPLORA EL ESTADO PASIVO DE LA TECLA MENÚ
           call   BOR_CON_056   ;SE PONE A 0 A CON_005 Y CON_006
  
           goto   MEN_LLP_P06

;**********************************************************************************************





























;*********** RUTINAS DE EXPLORACIÓN Y MANEJO DEL LA TECLA MENÚ Y LA LLAVE ROTATIVA ************

;************* EXPLORACION DE LOS ESTADOS DE LA TECLA MENÚ Y LA LLAVE DE PUSLOS ***************

;********************** GENERACIÓN DE LOS INDICADORES CORRESPONDIENTES ************************

EXP_EST_LLP ;call  SAL_SEC

           ;call   EXP_POR_00C 
           
           ;movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           ;sublw  0x00          ;SE LE RESTA EL VALOR 0x00
           
           ;btfsc  STATUS,2      ;¿EL ESTADO DE REPOSO DE LA LLAVE ES 00?
           ;goto   EST_REP_000   ;SI

           ;call   EXP_TEC_MEN   ;NO

           ;btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           ;goto   EXP_EST_LLP   ;NO
          
           ;call   VAL_TEC_MEN   ;SI  
           ;return 
          

EST_REP_000 call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA 
           call   INC_CON_056   ;SE INCREMENTAN CON_005 Y CON_006 

           movf   FLG_CON_006,W ;SE MUEVE FLG_CON_006 A W 
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF
                            
           btfsc  STATUS,2      ;LLEGÓ CON_006 A TEMPORIZAR 1 MINUTO?   
           return               ;SI

           call   SAL_SEC       ;NO, SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO   
           call   EXP_POR_00C   ;SE EXPLORA EL ESTADO DEL PUERTO C
  
           movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           sublw  0x02          ;SE LE RESTA EL VALOR 0x02
 
           btfsc  STATUS,2      ;¿SE INICIÓ LA SECUENCIA DE GIRO EN SENTIDO HORARIO?
           goto   SEC_HOR_000   ;SI 

           movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           sublw  0x04          ;SE LE RESTA EL VALOR 0x04
 
           btfsc  STATUS,2      ;¿SE INICIÓ LA SECUENCIA DE GIRO EN SENTIDO ANTIHORARIO?
           goto   SEC_NHO_000   ;SI

           call   EXP_TEC_MEN   ;NO, SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ     

           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           goto   EST_REP_000   ;NO

           call   VAL_TEC_MEN   ;SI, SE ASIGNA EL VALOR CORRESPONDIENTE AL INDICADOR DEL ESTADO    
           return               ;DE LA TELCA MENÚ

;**********************************************************************************************


;*************** EXPLORACIÓN DE LA LLAVE DE PULSOS EN SENTIDO DE ANTIHORARIO ******************

SEC_HOR_000 call  LIN_SEC_POR 

           movf   VAL_RES_LLP,W ;SE MUEVE VAL_RES_LLP A W 
           sublw  0x00          ;SE LE RESTA EL VALOR 0x00
  
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x00? 
           return               ;SI, SE GENERA UNA SECUENCIA INCORRECTA   

           movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           sublw  0x06          ;SE LE RESTA EL VALOR 0x06
 
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x06?
           goto   SEC_0X4       ;SI  
           
           call   EXP_TEC_MEN   ;NO, SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ 

           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           goto   SEC_HOR_000   ;NO

           call   VAL_TEC_MEN   ;SI, SE ASIGNA EL VALOR CORRESPONDIENTE AL INDICADOR DEL ESTADO    
           return               ;DE LA TELCA MENÚ
 

      
SEC_0X4    call   LIN_SEC_POR

           movf   VAL_RES_LLP,W ;SE MUEVE VAL_RES_LLP A W 
           sublw  0x02          ;SE LE RESTA EL VALOR 0x02
 
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x02? 
           return               ;SI, SE GENERA UNA SECUENCIA INCORRECTA  

           movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           sublw  0x04          ;SE LE RESTA EL VALOR 0x04
 
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x04?
           goto   SEC_0x0_HOR   ;SI  
          
           call   EXP_TEC_MEN   ;NO, SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ      

           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           goto   SEC_0X4       ;NO  
 
           call   VAL_TEC_MEN   ;SI, SE ASIGNA EL VALOR CORRESPONDIENTE AL INDICADOR DEL ESTADO    
           return               ;DE LA TELCA MENÚ

 
SEC_0x0_HOR call  SEC_0X0       ;SE EXPLORA LA SECUENCIA 0x0                  

           movlw  'I'           ;SE MUEVE EL VALOR 'I' A FLG_EST_LLP, DE ESTA FORMA, SE INDICA  
           movwf  FLG_EST_LLP   ;QUE SE GENERÓ LA SECUENCIA HORARIA
           return

;**********************************************************************************************


;************** EXPLORACIÓN DE LA LLAVE DE PULSOS EN SENTIDO DE GIRO ANTIHORARIO **************

SEC_NHO_000 call  LIN_SEC_POR

           movf   VAL_RES_LLP,W ;SE MUEVE VAL_RES_LLP A W 
           sublw  0x00          ;SE LE RESTA EL VALOR 0x00
  
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x00? 
           return               ;SI, SE GENERA UNA SECUENCIA INCORRECTA   

           movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           sublw  0x06          ;SE LE RESTA EL VALOR 0x06
 
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x06?
           goto   SEC_0X2       ;SI
                     
           call   EXP_TEC_MEN   ;NO, SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ       

           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           goto   SEC_NHO_000   ;NO

           call   VAL_TEC_MEN   ;SI, SE ASIGNA EL VALOR CORRESPONDIENTE AL INDICADOR DEL ESTADO    
           return               ;DE LA TELCA MENÚ  


SEC_0X2    call  LIN_SEC_POR

           movf   VAL_RES_LLP,W ;NO, SE MUEVE VAL_RES_LLP A W 
           sublw  0x04          ;SE LE RESTA EL VALOR 0x04
 
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x04? 
           return               ;SI, SE GENERA UNA SECUENCIA INCORRECTA   
             
           movf   VAL_RES_LLP,W ;NO ;SE MUEVE VAL_RES_LLP A W 
           sublw  0x02          ;SE LE RESTA EL VALOR 0x02
 
           btfsc  STATUS,2      ;¿SE OBTUVO LA SECUENCIA 0x02?
           goto   SEC_0x0_NOR   ;SI
 
           call   EXP_TEC_MEN   ;NO, SE EXPLORA EL ESTADO ACTIVO DE LA TECLA MENÚ    

           btfss  STATUS,2      ;¿SE PRESIONÓ LA TECLA MENÚ?
           goto   SEC_0X2       ;NO  
 
           call   VAL_TEC_MEN   ;SI, SE ASIGNA EL VALOR CORRESPONDIENTE AL INDICADOR DEL ESTADO    
           return               ;DE LA TELCA MENÚ



SEC_0x0_NOR call  SEC_0X0       ;SE EXPLORA LA SECUENCIA 0x0    

           movlw  'D'           ;SI,SE MUEVE EL VALOR 'D' A FLG_EST_LLP, DE ESTA FORMA, SE INDICA  
           movwf  FLG_EST_LLP   ;QUE SE GENERÓ LA SECUENCIA ANTIHORARIA
           return
          
;**********************************************************************************************


;********** EXPLORACIÓN DE LA SENAL DE REFERENCIA DE LÍNEA, ACTIVACIÓN DE LA SALIDA *********** 

;****************** PARA EL CALENTADOR DE SECADO, EXPLORACIÓN DEL PUERTO C ********************  

LIN_SEC_POR call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE LREFERENCIA DE LÍNEA 
           call   SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO
           call   EXP_POR_00C   ;SE EXPLORA EL PUERTO C
           return

;**********************************************************************************************


;********************* EXPLORACIÓN DEL ESTADO INACTIVO DE LA TECLA MENÚ *********************** 
                                              
EXP_MEN_000 call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE LREFERENCIA DE LÍNEA  
            call  SAL_SEC       ;SE ACTIVA LA SALIDA PARA EL CALENTADOR DE SECADO

            btfsc PORTC,0       ;¿SE SIGUE PRESIONANDO LA TECLA MENÚ?
            goto  EXP_MEN_000   ;SI

            clrf  FLG_TEC_MEN   ;NO, SE PONE A 0 EL INDICADOR DE ESTADO DE LA TECLA MENÚ     
           return             

;**********************************************************************************************

;********************** EXPLORACIÓN DEL ESTADO ACTIVO DE LA TECLA MENÚ ************************ 
                                              
EXP_MEN_001 btfss  PORTC,0      ;¿SE PRESIONÓ LA TECLA MENÚ?
           return               ;NO
           
           call   VAL_TEC_MEN   ;SI, SE ASIGNA EL VALOR CORRESPONDIENTE AL INDICADOR DEL ESTADO    
           return               ;DE LA TELCA MENÚ       
          

;**********************************************************************************************

;********* ASIGNACIÓN DEL VALOR 'M' A FLG_TEC_MEN CUANDO LA TECLA MENÚ ES PRESIONADA **********           

VAL_TEC_MEN movlw  'M'          ;SE MUEVE EL VALOR 'M' A FLG_TEC_MEN, DE ESTA FORMA, SE  
           movwf  FLG_TEC_MEN   ;INDICA QUE LA TECLA MENÚ FUE PRESIONADA  
           return 

;**********************************************************************************************

;************************* EXPLORACIÓN DEL ESTADO DE LA TECLA MENÚ ****************************

EXP_TEC_MEN movf  VAL_RES_LLP,W ;SE MUEVE VAL_RES_LLP A W
           andlw  0x01          ;SE HACE UNA FUNCIÓN TIPO "AND" ENTRE VAL_RES_TEC Y EL VALOR 
                                ;0X01 DE ESTA FORMA, SE ANALIZA SOLAMENTE EL ESTADO DE LA 
                                ;TECLA MENÚ    

           movwf  VAL_RES_LLP   ;VAL_RES_LLP ADQUIERE EL NUEVO VALOR    
           movf   VAL_RES_LLP,W ;SE MUEVE VAL_RES_LLP A W
           sublw  0x01          ;SE LE RESTA EL VALOR 0x01
           return 

;**********************************************************************************************

;**************** SECUENCIA DE EXPLORACIÓN DEL ESTADO 000 DE LA LLAVE ROTATIVA ****************
                                               
SEC_0X0    call   LIN_SEC_POR

           movf   VAL_RES_LLP,W ;SE MUEVE VAL_RES_LLP A W 
           sublw  0x00          ;SE LE RESTA EL VALOR 0x00
 
           btfss  STATUS,2      ;¿SE OVTUBO LA SECUENCIA 0x00?
           goto   SEC_0X0       ;NO 
           return               ;SI

;**********************************************************************************************


;******************* EXPLORACIÓN DE LOS BITS DEL PUERTO C CORRESPONDIENTES ********************
                                              
EXP_POR_00C movf  PORTC,W     ;SE MUEVEN LOS VALORES DEL PUERTO C A W  
           movwf  VAL_OBT_LLP ;SE COPIAN ESOS VALORES A VAL_OBT_LLP
          
           movf   VAL_OBT_LLP,W ;SE MUEVE VAL_OBT_LLP A W 
           andwf  VAL_COM_LLP,W ;SE HACE UNA FUNCIÓN TIPO "AND" ENTRE VAL_OBT_LLP Y VAL_COM_LLP 
                              ;DE ESTA FORMA, SE ELIMINAN LOS POSIBLES VALORES ALTOS DE LOS BITS
                              ;3 AL 7 DE LA COMPARACIÓN, QUEDANDO ÚTILES LOS TRES PRIMEROS 

           movwf  VAL_RES_LLP ;SE COPIA EL VALOR OBTENIDO A VAL_RES_LLP   
           return
           
;**********************************************************************************************


;**************************** EXPLORACIÓN DE LOS BITS DEL PUERTO A **************************** 

EXP_SEN_DEP movf  PORTA,W       ;SE MUEVEN LOS VALORES DEL PUERTO A, A W   
           movwf  VAL_OBT_SEN   ;SE COPIAN ESOS VALORES A VAL_OBT_SEN 

           movf   VAL_OBT_SEN,W ;SE MUEVE VAL_OBT_SEN A W 
           andwf  VAL_COM_SEN,W ;SE HACE UNA FUNCIÓN TIPO "AND" ENTRE VAL_OBT_SEN Y VAL_COM_SEN 
                                ;DE ESTA FORMA, SE ELIMINAN LOS VALORES DE LOS BITS 0, 1, 3, 6
                                ;Y 7, QUEDANDO ÚTILES LOS VALORES DE LOS BITS 2, 4 Y 5

           movwf  VAL_RES_SEN   ;SE COPIA EL VALOR OBTENIDO A VAL_RES_SEN   
    
;**********************************************************************************************


;***** COMPARACIÓN DEL VALOR OBTENIDO, PARA DETERMINAR SI ES NECESARIO GENERAR UN ERROR *******   

           movf   VAL_RES_SEN,W ;SE MUEVE VAL_RES_SEN A W     
           sublw  0x30          ;SE LE RESTA EL VALOR 0x30

           btfsc  STATUS,2      ;¿DISMINUYÓ EL NIVEL DEL PRIMER DEPÓSITO?
           goto   ERR_001       ;SI  

           movf   VAL_RES_SEN,W ;NO, SE ENCUENTRA EN SU NIVEL NORMAL, SE MUEVE VAL_RES_SEN A W     
           sublw  0x24          ;SE LE RESTA EL VALOR 0x24

           btfsc  STATUS,2      ;¿DISMINUYÓ EL NIVEL DEL SEGUNDO DEPÓSITO?
           goto   ERR_002       ;SI  

           movf   VAL_RES_SEN,W ;NO, SE ENCUENTRA EN SU NIVEL NORMAL, SE MUEVE VAL_RES_SEN A W     
           sublw  0x14          ;SE LE RESTA EL VALOR 0x14

           btfsc  STATUS,2      ;¿DISMINUYÓ EL NIVEL DEL TERCER DEPÓSITO?
           goto   ERR_003       ;SI  

           movf   VAL_RES_SEN,W ;NO, SE ENCUENTRA EN SU NIVEL NORMAL, SE MUEVE VAL_RES_SEN A W     
           sublw  0x00          ;SE LE RESTA EL VALOR 0x00

           btfsc  STATUS,2      ;¿DISMINUYERON LOS NIVELES DE LOS TRES DEPÓSITOS?
           goto   ERR_004       ;SI  
           return               ;NO, SE ENCUENTRAN A SUS NIVELES NORMALES    

;**********************************************************************************************


;************************** SALIDA DEL MODULADOR DE ANCHO DE PULSO ****************************

SAL_SEC    movf   FLG_SAL_SEC,W ;SE MUEVE FLG_SAL_SEC A W            
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
              
           btfsc  STATUS,2      ;¿SE DEBE ACTIVAR EL CALENTADO DE SECADO?    
           goto   ACT_SAL_SEC   ;SI

           call   RET_800_uSE   ;NO, SE GENERA UN RETARDO DE 800 MICOSEGUNDOS, DE ESTA FORMA, 
                                ;SE SOBREPASA EL ESTADO ALTO DE LA SEÑAL DE REFERENCIA DE LÍNEA 
           return               


ACT_SAL_SEC call  RET_200_uSE 

           movf   RET_DIS,W     ;SE MUEVE EL VALOR ACTUAL DE RET_DIS A W
           movwf  CON_RET_SEC   ;SE LO COPIA A CON_RET_SEC  

REP_RET_SEC call  RET_PAT       ;SE GENERA EL RETARDO PATRÓN DE 100 MICROSEGUNDOS      
                 
           decfsz CON_RET_SEC,1 ;SE DECREMENTA CON_RET_SEC ¿LLEGÓ A 0?    
           goto   REP_RET_SEC   ;NO

           bsf    PORTB,6       ;SI, SE ACTIVA EL PULSO DE DISPARO PARA EL CONTROLADOR DE SECADO 
            
           call   RET_200_uSE  
               
           bcf    PORTB,6      
           return

;**********************************************************************************************


;********** EXPLORACIÓN DE LA SEÑAL DE REFECRENCIA DE LÍNEA, DECREMENTO DE CON_001 ************

INC_CON_001 call  LER_REF_LIN   ;SE EXPLORA EL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA 

           incf   CON_001,F     ;CON_001 SE INCREMENTA EN UNA UNIDAD

           movf   CON_001,W     ;SE MUEVE CON_001 A W
           sublw  0x0A          ;SE LE RESTA EL VALOR 0x0A  
          
           btfss  STATUS,2      ;¿LLEGÓ CON_001 AL VALOR 0x0A, PASARON 100 MILISEGUNDOS? 
           goto   ESP_800_uSE   ;NO

           movlw  0x00          ;SI, SE MUEVE EL VALOR 0x00 A CON_001 , DE ESTA FORMA, SE  
           movwf  CON_001       ;REPITE LA SECUENCIA INDICADA ANTERIORMENTE
           return            
                
ESP_800_uSE call  RET_800_uSE   ;SE GENERA UN RETARDO DE 800 MICROSEGUNDOS, DE ESTA FORMA,
                                ;SE SOBREPASA EL ESTADO ALTO DE LA SEÑAN DE REFERENCIA DE LÍNEA            
           goto   INC_CON_001   

;**********************************************************************************************


;************************************ DECREMENTO CON_002 **************************************

DEC_CON_002 decfsz CON_002,1    ;CON_002 SE DECREMENTA EN UNA UNIDAD, ¿LLEGÓ A 0?
           return               ;NO

           movlw  0xC8          ;SI, SE MUEVE EL VALOR 0xC8 A CON_002, REPITIENDO LA 
           movwf  CON_002       ;SECUENCIA MENCIONADA   

           movlw  0xFF          ;SE MUEVE EL VALOR 0xFF A FLG_CON_002, DE ESTA FORMA, SE INDICA
           movwf  FLG_CON_002   ;QUE CON_002 LLEGÓ A 0 
           return

;**********************************************************************************************


;******************************* DECREMENTO CON_002 Y CON_003 *********************************

DEC_CON_003 decfsz CON_003,1    ;CON_003 SE DECREMENTA EN UNA UNIDAD, ¿LLEGÓ A 0? 
           return               ;NO

           movlw  0xFF          ;SI, SE MUEVE EL VALOR 0xFF A FLG_CON_003, DE ESTA FORMA,
           movwf  FLG_CON_003   ;SE INDICA QUE CON_003 LLEGÓ A 0 
           return

;**********************************************************************************************


;********** INCREMENTO DE CON_004, PROCESO DE CONVERSIÓN DE LOS SENSORES PRINCIPAL ************
                                           
;*********************** Y DE SEGURIDAD DE LA TEMPERATURA DEL QUÍMICO *************************

INC_CON_004 incf  CON_004,F   ;C0N_004 SE INCREMENTA EN UNA UNIDAD
          
           movf   CON_004,W   ;SE MUEVE CON_004 A W
           sublw  0x05        ;SE LE RESTA EL VALOR 0x05

           btfss  STATUS,2    ;¿LLEGÓ CON_004 AL VALOR 0x05, PASARON 50 MILISEGUNDOS?
           goto   COM_TEM_100 ;NO        

           call   CON_AN_DI_1 ;SI

           movlw  0xFF        ;SE MUEVE EL VALOR 0xFF A FLG_TEM_050, DE ESTA FORMA, SE INDICA  
           movwf  FLG_TEM_050 ;QUE CON_004 LLEGÓ A TEMPORIZAR 50 MILISEGUNDOS
           return  


COM_TEM_100 movf  CON_004,W   ;SE MUEVE COUNTER3 A W
           sublw  0x0A        ;SE LE RESTA EL VALOR 0x0A
 
           btfss  STATUS,2    ;¿LLEGÓ CON_004 AL VALOR 0x0A, PASARON 100 MILISEGUNDOS?
           return             ;NO                          
     
           call   CON_AN_DI_2 ;SI
           call   EXP_FLG_REF

           movlw  0x00        ;SE MUEVE EL VALOR 0x00 A CON_004, DE ESTA FORMA, SE LO PONE A   
           movwf  CON_004     ;0 NUEVAMENTE  

           movlw  0xFF        ;SE MUEVE EL VALOR 0xFF A FLG_TEM_100, DE ESTA FORMA, SE INDICA  
           movwf  FLG_TEM_100 ;QUE CON_004 LLEGÓ A TEMPORIZAR 100 MILISEGUNDOS
           return  

;**********************************************************************************************


;****************** PUESTA A 0 DE LOS INDICADORES FLG_TEM_050 Y FLG_TEM_100 ******************* 

BOR_CON_004 clrf  FLG_TEM_050   ;SE PONEN A 0 LOS INDICADORES DE TEMPORIZACIONES EFECTUADAS    
           clrf   FLG_TEM_100   ;DE 50 Y 100 MILISEGUNDOS 
           return

;**********************************************************************************************


;******************************* INCREMENTO DE CON_005 y CON_006 ******************************  

INC_CON_056 incf  CON_005,F   ;CON_005 SE INCREMENTA EN UNA UNIDAD

           movf   CON_005,W   ;SE MUEVE CON_005 A W 
           sublw  0x64        ;SE LE RESTA EL VALOR 0x64 
             
           btfss  STATUS,2    ;¿LLEGÓ CON_005 AL VALOR 0x64, PASÓ 1 SEGUNDO? 
           return             ;NO
           
           movlw  0x00        ;SI, SE MUEVE EL VALOR 0x00 A CON_006, DE ESTA FORMA, SE LO
           movwf  CON_005     ;VUELVE A PONER A 0           

           incf   CON_006,F   ;CON_006 SE INCREMENTA EN UNA UNIDAD
          
           movf   CON_006,W   ;SE MUEVE CON_006 A W
           sublw 0x0A  ;sublw  0x3C        ;SE LE RESTA EL VALOR 0x3C
             
           btfss  STATUS,2    ;¿LLEGÓ CON_005 AL VALOR 0x3C, PASÓ 1 MINUTO? 
           return             ;NO

           movlw  0xFF        ;SI, SE MUEVE EL VALOR 0xFF A FLG_CON_006, DE ESTA FORMA, SE   
           movwf  FLG_CON_006 ;INDICA QUE SE OBTUVO LA TEMPORIZACIÓN DE 1 MINUTO

           movlw  0x00        ;SE MUEVE EL VALOR 0x00 A CON_006, DE ESTA FORMA, SE LO VUELVE A
           movwf  CON_006     ;PONER A 0
 
           return  

;**********************************************************************************************


;********************************* PUESTA A 0 DE FLG_CON_006 **********************************

BOR_FLG_006 clrf  FLG_CON_006   ;SI, PONE A 0 A FLG_CON_006  
           return             

;**********************************************************************************************         


;************************ PUESTA A 0 DE FLG_EST_LLP, CON_005 Y CON_005 ************************

BOR_LLP_056 clrf  FLG_EST_LLP  ;SE PONE A 0 A FLG_EST_LLP  

           call   BOR_CON_056 ;SE PONE A 0 A CON_005 Y CON_005
           return
 
;**********************************************************************************************


;****************************** PUESTA A 0 DE CON_005 Y CON_006 ******************************* 

BOR_CON_056 movlw 0x00        ;SE MUEVE EL VALOR 0x00 A CON_005 Y CON_006, DE ESTA FORMA, 
           movwf  CON_005     ;SE PONE A 0 A ESTOS CONTADORES 
           movwf  CON_006
           return

;**********************************************************************************************


;**************************** EXPLORACIÓN DEL ESTADO DE FLG_NVL_SEC *************************** 

COM_FLG_SEC movf  FLG_NVL_SEC,W ;SE MUEVE FLG_NVL_SEC A W              
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
           
           btfsc  STATUS,2      ;¿SE MODIFICÓ ANTERIORMENTE EL NIVEL DE SECADO?     
           return               ;SI    

           movlw  0xFF          ;NO, SE MUEVE EL VALOR 0xFF A FLG_NVL_SEC, DE ESTA FORMA,  
           movwf  FLG_NVL_SEC   ;SE INDICA QUE EL EL NIVEL DE SECADO FUE MODIFICADO
           return
                         
;**********************************************************************************************


;**************************** EXPLORACIÓN DEL ESTADO DE FLG_NVL_CON *************************** 

COM_FLG_CON movf  FLG_NVL_CON,W ;SE MUEVE FLG_NVL_CON A W              
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
           
           btfsc  STATUS,2      ;¿SE MODIFICÓ ANTERIORMENTE EL NIVEL DE CONTRASTE?     
           return

           movlw  0xFF          ;NO, SE MUEVE EL VALOR 0xFF A FLG_NVL_CON, DE ESTA 
           movwf  FLG_NVL_CON   ;FORMA SE INDICA QUE LOS VALORES HAN SIDO MODIFICADOS 
           return

;**********************************************************************************************                 


;**************************** EXPLORACIÓN DEL ESTADO DE FLG_NVL_BRL *************************** 

COM_FLG_BRL movf  FLG_NVL_BRL,W ;SE MUEVE FLG_NVL_BRL A W              
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
           
           btfsc  STATUS,2      ;¿SE MODIFICÓ ANTERIORMENTE EL NIVEL DE BRILLO?     
           return               ;SI   

           movlw  0xFF          ;NO, SE MUEVE EL VALOR 0xFF A FLG_NVL_BRL, DE ESTA FORMA, SE  
           movwf  FLG_NVL_BRL   ;INDICA QUE LOS VALORES HAN SIDO MODIFICADOS 
           return

;**********************************************************************************************


;**************************** EXPLORACIÓN DEL ESTADO DE FLG_NVL_REF *************************** 

COM_FLG_REF movf  FLG_NVL_REV,W ;SE MUEVE FLG_NVL_REV A W              
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
           
           btfsc  STATUS,2      ;¿SE MODIFICÓ ANTERIORMENTE EL NIVEL DE REFERENCIA?
           return               ;SI
     
           movlw  0xFF          ;NO, SE MUEVE EL VALOR 0xFF A FLG_NVL_REV, DE ESTA 
           movwf  FLG_NVL_REV   ;FORMA SE INDICA QUE LOS VALORES HAN SIDO MODIFICADOS 
           return

;**********************************************************************************************


;**************************** EXPLORACIÓN DEL ESTADO DE FLG_VEL_PRO *************************** 

COM_FLG_VEL movf  FLG_VEL_PRO,W ;SE MUEVE FLG_VEL_PRO A W              
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
           
           btfsc  STATUS,2      ;¿SE MODIFICÓ ANTERIORMENTE LA VELOCIDAD DE PROCESO?
           return               ;SI
     
           movlw  0xFF          ;NO, SE MUEVE EL VALOR 0xFF A FLG_VEL_PRO, DE ESTA FORMA, SE 
           movwf  FLG_VEL_PRO   ;INDICA QUE LOS VALORES HAN SIDO MODIFICADOS 
           return

;**********************************************************************************************


;**************************** EXPLORACIÓN DEL ESTADO DE FLG_EST_BUZ *************************** 

COM_FLG_BUZ movf  FLG_EST_BUZ,W ;SE MUEVE FLG_EST_BUZ A W              
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 
           
           btfsc  STATUS,2      ;¿SE MODIFICÓ ANTERIORMENTE EL ESTADO DEL BUZZER?
           return               ;SI
     
           movlw  0xFF          ;NO, SE MUEVE EL VALOR 0xFF A FLG_EST_BUZ, DE ESTA 
           movwf  FLG_EST_BUZ   ;FORMA SE INDICA QUE LOS VALORES HAN SIDO MODIFICADOS 
           return

;**********************************************************************************************


;**************** EXPLORACIÓN DEL ESTADO DE LA SEÑAL DE REFERENCIA DE LÍNEA *******************

LER_REF_LIN btfsc PORTE,0       ;¿SE DETECTÓ EL PULSO DE SINCRONÍSMO DE LÍNEA?
            goto  LER_REF_LIN   ;SI


REP_LEC_RLN btfss PORTE,0       ;NO, ¿SE VOLVÍO A DETECTAR EL PULSO DE SINCRONÍSMO DE LÍNEA?
            goto  REP_LEC_RLN   ;NO
            return              ;SI

;**********************************************************************************************


;**************************** INCREMENTO DEL CONTADOR DE PELÍCULAS ****************************

INC_PEL_PRO incf  PEL_PRO,F    ;PEL_PRO SE INCREMENTA EN UNA UNIDAD, DE ESTA FORMA, SE 
                               ;INCREMENTA EL CONTADOR DE PELÍCULAS

           movf   PEL_PRO,W    ;SE MUEVE PEL_PRO A W                
           sublw  0xFF         ;SE LE RESTA EL VALOR 0xFF              

           btfss  STATUS,2     ;¿LLEGÓ PEL_PRO AL VALOR 0xFF?
           return              ;NO

           movlw  0x00         ;SI, SE PONE A 0 A PEL_PRO, DE ESTA FORMA, SE PONE A 0 AL  
           movwf  PEL_PRO      ;CONTADOR DE PELÍCULAS

           return 

;**********************************************************************************************


;**************** PROCESO DE COMPARACIÓN DEL VALOR OBTENIDO DE LA CONVERSIÓN ******************

;*** CON EL VALOR DE REFERENCIA ESTABLECIDO DEL SENSOR PRINCIPAL DE TEMPERATURA DEL QUÍMICO ***

CON_AN_DI_1 call  OBT_DAT_CON    ;SE OBTIENE EL VALOR DIGITAL DE LA CONVERSIÓN     

           movf   DAT_OBT_CAD,W  ;SE MUEVE DAT_OBT_CAD A W
           subwf  NVL_REF_NOR,0  ;SE LE RESTA EL VALOR DE NVL_REF_NOR

           movf   STATUS,W       ;SE MUEVE STATUS A W
           movwf  VAL_RES_CAD    ;SE COPIA SU VALOR A VAL_RES_CAD 

           movf   VAL_RES_CAD,W  ;SE MUEVE VAL_RES_CAD A W
           sublw  0x19           ;SE LE RESTA EL VALOR 0x19 

           btfsc  STATUS,2       ;¿EL VALOR DE VAL_RES_CAD ES INFERIOR AL DE NVL_REF_NOR?           
           goto   AJU_FLG_INF    ;SI 

           movf   VAL_RES_CAD,W  ;NO, SE MUEVE VAL_RES_CAD A W
           sublw  0x1B           ;SE LE RESTA EL VALOR 0x1B 

           btfsc  STATUS,2       ;¿EL VALOR DE VAL_RES_CAD ES INFERIOR AL DE NVL_REF_NOR?           
           goto   AJU_FLG_INF    ;SI 
                        
           movf   VAL_RES_CAD,W  ;NO, SE MUEVE VAL_RES_CAD A W
           sublw  0x18           ;SE LE RESTA EL VALOR 0x18 

           btfsc  STATUS,2       ;¿EL VALOR DE VAL_RES_CAD ES SUPERIOR AL DE NVL_REF_NOR?           
           goto   AJU_FLG_SUP    ;SI 

           movf   VAL_RES_CAD,W  ;NO, SE MUEVE VAL_RES_CAD A W
           sublw  0x1A           ;SE LE RESTA EL VALOR 0x1A 

           btfsc  STATUS,2       ;¿EL VALOR DE VAL_RES_CAD ES SUPERIOR AL DE NVL_REF_NOR?           
           goto   AJU_FLG_SUP    ;SI  
           return                ;NO 


AJU_FLG_INF movf  FLG_VAL_INF,W  ;SE MUEVE FLG_VAL_INF A W   
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF
 
           btfsc  STATUS,2       ;¿EL VALOR DE FLG_VAL_INF ES IGUAL A 0xFF?            
           return                ;SI, NO SE ENCIENDE EL CALENTADOR Y EL MEZCLADOR  

           bsf    PORTB,1        ;NO, SE ENCIENDEN EL CALENTADOR Y EL MEZCLADOR 
           
           clrf   FLG_VAL_SUP    ;SE PONE A 0 A FLG_VAL_SUP   

           movlw  0xFF           ;NO, SE MUEVE EL VALOR 0xFF A FLG_VAL_INF, DE ESTA FORMA, SE    
           movwf  FLG_VAL_INF    ;INDICA QUE EL VALOR OBTENIDO ES INFERIOR A VAL_RES_CAD      
           return  


AJU_FLG_SUP movf  FLG_VAL_SUP,W  ;SE MUEVE FLG_VAL_SUP A W   
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF
 
           btfsc  STATUS,2       ;¿EL VALOR DE FLG_VAL_SUP ES IGUAL A 0xFF?            
           return                ;SI  

           bcf    PORTB,1        ;NO, SE DESCONECTAN EL CALENTADOR Y EL MEZCLADOR    

           clrf   FLG_VAL_INF    ;SE PONE A 0 A FLG_VAL_INF 

           movlw  0xFF           ;NO, SE MUEVE EL VALOR 0xFF A FLG_VAL_SUP Y FLG_NVL_NOR    
           movwf  FLG_VAL_SUP    ;DE ESTA FORMA, SE INDICA QUE EL VALOR OBTENIDO ES SUPERIOR A 
           movwf  FLG_NVL_NOR    ;A VAL_RES_CAD Y QUE LA TEMPERATURA LLEGÓ A SU NIVEL ESTABLECIDO  
           return  

;**********************************************************************************************


;**************** PROCESO DE COMPARACIÓN DEL VALOR OBTENIDO DE LA CONVERSIÓN ******************

;* CON EL VALOR DE REFERENCIA ESTABLECIDO DEL SENSOR DE SEGURIDAD DE TEMPERATURA DEL QUÍMICO **

CON_AN_DI_2 bsf   ADCON0,3       ;SE SELECCIONA RA1 COMO ENTRADA ANALÓGICA
            
           call   OBT_DAT_CON    ;SE OBTIENE EL VALOR DIGITAL DE LA CONVERSIÓN

           movf   DAT_OBT_CAD,W  ;SE MUEVE DAT_OBT_CAD A W
           subwf  NVL_REF_INF,0  ;SE LE RESTA EL VALOR DE NVL_REF_INF
          
           movf   STATUS,W       ;SE MUEVE STATUS A W
           movwf  VAL_RES_CAD    ;SE COPIA SU VALOR A VAL_RES_CAD 
            

           movf   VAL_RES_CAD,W  ;SE MUEVE VAL_RES_CAD A W
           sublw  0x19           ;SE LE RESTA EL VALOR 0x19 

           btfsc  STATUS,2       ;¿EL VALOR DE VAL_RES_CAD ES INFERIOR AL DE NVL_REF_INF?           
           goto   AJU_FLG_NIF    ;SI 

           movf   VAL_RES_CAD,W  ;NO, SE MUEVE VAL_RES_CAD A W
           sublw  0x1B           ;SE LE RESTA EL VALOR 0x1B 

           btfsc  STATUS,2       ;¿EL VALOR DE VAL_RES_CAD ES INFERIOR AL DE NVL_REF_INF?           
           goto   AJU_FLG_NIF    ;SI 
                        
           movf   DAT_OBT_CAD,W  ;NO, SE MUEVE DAT_OBT_CAD A W
           subwf  NVL_REF_SUP,0  ;SE LE RESTA EL VALOR DE NVL_REF_NOR

           movf   STATUS,W       ;SE MUEVE STATUS A W
           movwf  VAL_RES_CAD    ;SE COPIA SU VALOR A VAL_RES_CAD 

           movf   VAL_RES_CAD,W  ;SE MUEVE VAL_RES_CAD A W
           sublw  0x18           ;SE LE RESTA EL VALOR 0x18 

           btfsc  STATUS,2       ;¿EL VALOR DE DAT_OBT_CAD ES SUPERIOR AL DE NVL_REF_SUP?           
           goto   AJU_FLG_NSU    ;SI 

           movf   VAL_RES_CAD,W  ;NO, SE MUEVE VAL_RES_CAD A W
           sublw  0x1A           ;SE LE RESTA EL VALOR 0x1A 

           btfsc  STATUS,2       ;¿EL VALOR DE DAT_OBT_CAD ES SUPERIOR AL DE NVL_REF_SUP?           
           goto   AJU_FLG_NSU    ;SI 

           bcf    ADCON0,3       ;NO, SE SELECCIONA RA0 COMO ENTRADA ANALÓGICA
           return        

        
AJU_FLG_NIF movlw 0xFF           ;SE MUEVE EL VALOR 0xFF A NVL_REF_INF, DE ESTA FORMA SE
           movwf  FLG_NVL_INF    ;INDICA QUE LA TEMPERATURA DE QUÍMICO DISMINUYÓ POR  
                                 ;DEBAJO DEL NIVEL PERMITIDO
            
           bcf    ADCON0,3       ;NO, SE SELECCIONA RA0 COMO ENTRADA ANALÓGICO
           return


AJU_FLG_NSU movlw 0xFF           ;SE MUEVE EL VALOR 0xFF A NVL_REF_SUP, DE ESTA FORMA SE
           movwf  FLG_NVL_SUP    ;INDICA QUE LA TEMPERATURA DE QUÍMICO AUMENTÓ POR  
                                 ;ENCIMA DEL NIVEL PERMITIDO

           bcf    ADCON0,3       ;NO, SE SELECCIONA RA0 COMO ENTRADA ANALÓGICA
           return 
                                                 
;**********************************************************************************************


;************* PORCESO DE OBTENCIÓN DEL VALOR DIGITAL DE LA ENTRADA SELECCIONADA ************** 

OBT_DAT_CON bsf   ADCON0,2       ;SE INICIA LA CONVERSIÓN 
           bcf    PIR1,6  
           
LER_ANA_DIG btfss PIR1,6         ;¿SE PRODUJO LA CONVERSIÓN ANALÓGICA DIGITAL? 
           goto   LER_ANA_DIG    ;NO

           movf   ADRESH,W       ;SI, SE MUEVE ADRESH A W              
           movwf  DAT_OBT_CAD    ;SE MUEVE EL DATO OBTENIDO A DAT_OBT_CAD
           return

;**********************************************************************************************


;******* EXPLORACIÓN DE LOS ESTADOS DE FLG_NVL_INF Y FLG_NVL_SUP, GENRACIÓN DE ERRORES ******** 

 EXP_FLG_REF movf FLG_NVL_INF,W ;SE MUEVE FLG_NVL_INF A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF

           btfsc  STATUS,2      ;¿LA TEMPERATURA DEL QUÍMICO DISMINUYÓ POR DEBAJO DE SU NIVEL 
                                ;NORMAL?

           goto   ERR_008       ;SI, SE GENERA EL ERROR CORRESPONDIENTE   
 
           movf   FLG_NVL_SUP,W ;NO, SE MUEVE FLG_NVL_SUP A W
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF

           btfsc  STATUS,2      ;¿LA TEMPERATURA DEL QUÍMICO AUMENTÓ POR ENCIMA DE SU NIVEL 
                                ;NORMAL?

           goto   ERR_009       ;SI, SE GENERA EL ERROR CORRESPONDIENTE
           return               ;NO 
   
;**********************************************************************************************


;**** RUTINAS DE AJUSTES DE LOS NIVELES DE REFERENCIA, PARA LOS PARAMETROS SELECCIONADOS ****** 



;****************************** NIVEL DE REFERENCIA MÍNIMO 0x00 *******************************

REF_MIN_00 movlw  0x00          ;SE MUEVE EL VALOR 0x00 A NVL_REF_MIN, DE ESTA FORMA SE  
           movwf  NVL_REF_MIN   ;ESTABLECE EL NIVEL MÍNIMO 
           return 

;**********************************************************************************************


;****************************** NIVEL DE REFERENCIA MÍNIMO 0x01 *******************************

REF_MIN_01 movlw  0x01          ;SE MUEVE EL VALOR 0x01 A NVL_REF_MIN, DE ESTA FORMA SE  
           movwf  NVL_REF_MIN   ;ESTABLECE EL NIVEL MÍNIMO 
           return 

;**********************************************************************************************


;****************************** NIVEL DE REFERENCIA MÍNIMO 0xFF *******************************

REF_MIN_FF movlw  0xFF          ;SE MUEVE EL VALOR 0xFF A NVL_REF_MIN, DE ESTA FORMA SE  
           movwf  NVL_REF_MIN   ;ESTABLECE EL NIVEL MÍNIMO 
           return 

;**********************************************************************************************


;****************************** NIVEL DE REFERENCIA MÁXIMO 0x5B *******************************

REF_MAX_5B movlw  0x5B          ;SE MUEVE EL VALOR 0x6B A NVL_REF_MAX, DE ESTA FORMA SE  
           movwf  NVL_REF_MAX   ;ESTABLECE EL NIVEL MÁXIMO
           return

;**********************************************************************************************


;****************************** NIVEL DE REFERENCIA MÁXIMO 0x64 *******************************

REF_MAX_64 movlw  0x64          ;SE MUEVE EL VALOR 0x64 A NVL_REF_MAX, DE ESTA FORMA SE  
           movwf  NVL_REF_MAX   ;ESTABLECE EL NIVEL MÁXIMO
           return

;**********************************************************************************************


;****************************** NIVEL DE REFERENCIA MÁXIMO 0xFD *******************************

REF_MAX_FE movlw  0xFE          ;SE MUEVE EL VALOR 0xFE A NVL_REF_MAX, DE ESTA FORMA SE  
           movwf  NVL_REF_MAX   ;ESTABLECE EL NIVEL MÁXIMO
           return

;**********************************************************************************************


;********** INCREMENTO DEL NIVEL PATRÓN, QUE SE APLICARÁ AL PARÁMETRO SELECCIONADO ************

INC_NVL_PAT incf  NVL_PAT,F     ;NVL_PAT SE INCREMENTA EN UNA UNIDAD 
           
           movf   NVL_REF_MAX,W ;SE MUEVE NVL_REF_MAX A W  
           subwf  NVL_PAT,0     ;SE LE RESTA NVL_PAT
          
           goto   COM_FLG_PAT 

;**********************************************************************************************


;********** DECREMENTO DEL NIVEL PATRÓN, QUE SE APLICARÁ AL PARÁMETRO SELECCIONADO ************

DEC_NVL_PAT decf  NVL_PAT,F     ;NVL_PAT SE DECREMENTA EN UNA UNIDAD 
  
           movf   NVL_REF_MIN,W ;SE MUEVE NVL_REF_MIN A W  
           subwf  NVL_PAT,0     ;SE LE RESTA NVL_PAT
          
COM_FLG_PAT btfss STATUS,2      ;¿LLEGÓ NVL_PAT AL VALOR MÁXIMO? 
           return               ;NO 

           movlw  0xFF          ;SI, SE MUEVE EL VALOR 0xFF A FLG_NVL_REF, DE ESTA      
           movwf  FLG_NVL_REF   ;FORMA SE INDICA QUE SE LLEGÓ AL NIVEL MÁXIMO ADMITDO
           return

;**********************************************************************************************


;***************************** DECREMENTO DEL VALOR DE NVL_PAT ********************************

ACT_PAT_DEC decf  NVL_PAT,F     ;NVL_PAT SE DECREMENTA EN UNA UNIDAD 
  
           clrf   FLG_NVL_REF   ;SE PONE A FLG_NVL_REF A 0  
           return
 
;********************************************************************************************** 


;***************************** INCREMENTO DEL VALOR DE NVL_PAT ********************************

ACT_PAT_INC incf  NVL_PAT,F     ;NVL_PAT SE INCREMENTA EN UNA UNIDAD 

           clrf   FLG_NVL_REF   ;SE PONE A FLG_NVL_REF A 0  
           return
 
;********************************************************************************************** 


;*********************************** MANEJO DEL PUERTO I2C ************************************


;********************* SECUENCIA DE LECTURA DE LOS DATOS DE LA MEMORIA ************************
                     
LER_MEM    movf   DAT_OBT_I2C,W ;SE MUEVE DAT_OBT_I2C A W   
           movwf  DAT_001       ;SE COPIA EL DATO EN EL REGISTRO QUE CORRESPONDE 

REP_LEC_MEM incf  CON_DAT_I2C,F ;CON_DAT_I2C SE INCREMENTA EN UNA UNIDAD
                           
           movlw  0xA1          ;SE MUEVE EL VALOR 0xA1 A SEL_DIS, DE ESTA FORMA SE VUELVE A 
           movwf  SEL_DIS_I2C   ;SELECCIONAR LA MEMORIA EXTERNA Y SE INDICA QUE SE VA A LEER EN
                                ;ELLA   
            
           call   SEC_SEL_DIS
           call   LER_I2C
           call   DET_I2C 
           
           movf   CON_DAT_I2C,W ;SE MUEVE CON_DAT_I2C A W
           sublw  0x02          ;SE LE RESTA EL VALOR 0x02           
           btfsc  STATUS,2      ;¿ES EL SEGUNDO DATO?  
           goto   DAT_N02       ;SI
            
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x03          ;SE LE RESTA EL VALOR 0x03           
           btfsc  STATUS,2      ;¿ES EL TERCER DATO?  
           goto   DAT_N03       ;SI
              
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x04          ;SE LE RESTA EL VALOR 0x04           
           btfsc  STATUS,2      ;¿ES EL CUARTO DATO?  
           goto   DAT_N04       ;SI
          
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x05          ;SE LE RESTA EL VALOR 0x05           
           btfsc  STATUS,2      ;¿ES EL QUINTO DATO?  
           goto   DAT_N05       ;SI

           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x06          ;SE LE RESTA EL VALOR 0x06           
           btfsc  STATUS,2      ;¿ES EL SEXTO DATO?  
           goto   DAT_N06       ;SI

           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x07          ;SE LE RESTA EL VALOR 0x07           
           btfsc  STATUS,2      ;¿ES EL SÉPTIMO DATO?  
           goto   DAT_N07       ;SI
           
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x08          ;SE LE RESTA EL VALOR 0x08           
           btfsc  STATUS,2      ;¿ES EL OCTAVO DATO?  
           goto   DAT_N08       ;SI
                     
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x09          ;SE LE RESTA EL VALOR 0x09           
           btfsc  STATUS,2      ;¿ES EL NOVENO DATO?  
           goto   DAT_N09       ;SI

           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x0A          ;SE LE RESTA EL VALOR 0x0A           
           btfsc  STATUS,2      ;¿ES EL DÉCIMO DATO?  
           goto   DAT_N10       ;SI

           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x0B          ;SE LE RESTA EL VALOR 0x0B           
           btfsc  STATUS,2      ;¿ES EL NÚMERO 11?  
           goto   DAT_N11       ;SI

           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x0C          ;SE LE RESTA EL VALOR 0x0C           
           btfsc  STATUS,2      ;¿ES EL NÚMERO 12?  
           goto   DAT_N12       ;SI

           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x0D          ;SE LE RESTA EL VALOR 0x0D           
           btfsc  STATUS,2      ;¿ES EL NÚMERO 13?  
           goto   DAT_N13       ;SI
            
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x0E          ;SE LE RESTA EL VALOR 0x0E           
           btfsc  STATUS,2      ;¿ES EL NÚMERO 14?  
           goto   DAT_N14       ;SI
  
           movf   CON_DAT_I2C,W ;NO, SE MUEVE CON_DAT_I2C A W
           sublw  0x0F          ;SE LE RESTA EL VALOR 0x0A           
           btfsc  STATUS,2      ;¿ES EL NÚMERO 15?  
           goto   DAT_N15       ;SI
           goto   DAT_N16       ;NO, ES EL ÚLTIMO, EL NÚMERO 16 


  
DAT_N02    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_002                  
           goto   REP_LEC_MEM

DAT_N03    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_003                  
           goto   REP_LEC_MEM

DAT_N04    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_004                  
           goto   REP_LEC_MEM

DAT_N05    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_005                  
           goto   REP_LEC_MEM

DAT_N06    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_006                  
           goto   REP_LEC_MEM

DAT_N07    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_007                  
           goto   REP_LEC_MEM

DAT_N08    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_008                  
           goto   REP_LEC_MEM

DAT_N09    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_009                  
           goto   REP_LEC_MEM

DAT_N10    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_010                  
           goto   REP_LEC_MEM

DAT_N11    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_011                  
           goto   REP_LEC_MEM

DAT_N12    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_012

DAT_N13    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_013

DAT_N14    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_014

DAT_N15    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_015

DAT_N16    movf   DAT_OBT_I2C,W ;IDEM A LÍNEA
           movwf  DAT_016                  
           return

;**********************************************************************************************


;***************************** GRABACIÓN INICIAL DE LOS PARAMETROS **************************** 

GRA_PAR_001 call  GRA_NVL_SEC
           call   GRA_RET_DIS 
           call   GRA_NVL_CON
           call   GRA_NVL_BRL 
           call   GRA_NVL_INF 
           call   GRA_NVL_NOR     
           call   GRA_NVL_SUP  
           call   GRA_VEL_PRO      
           call   GRA_EST_BUZ  
           call   GRA_FLG_IPR           
           call   GRA_FLG_FPR
           call   GRA_PEL_PRO
           call   GRA_DIG_001  
           call   GRA_DIG_002
           call   GRA_DIG_003
           call   GRA_DIG_004 
           return   

;**********************************************************************************************


;********** GRABACIÓN DE LOS PARAMETROS (SI CORRESPONDE) DESPUES DE SALIR DEL MENÚ ************

GRA_PAR_002 movf  FLG_NVL_SEC,W  ;SE MUEVE FLG_NVL_SEC A W
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF 
            
           btfss  STATUS,2       ;¿SE MODIFICARON LOS VALORES DEL NIVEL DE SECADO?
           goto   EXP_FLG_NC     ;NO
          
           call   GRA_NVL_SEC    ;SI, SE ORDENA GRABAR LOS VALORES ACTUALIZADOS DEL NIVEL DE
           call   GRA_RET_DIS    ;Y DEL TEMPORIZADOR DE DISPARO DEL CONTROLADOR DE SECADO       

           clrf   FLG_NVL_SEC    ;SE PONE A 0 A FLAG_NVL_SEC                         

   
EXP_FLG_NC movf   FLG_NVL_CON,W  ;SE MUEVE FLG_NVL_CON A W
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF 
            
           btfss  STATUS,2       ;¿SE MODIFICARON LOS VALORES DEL NIVEL DE CONTRASTE?
           goto   EXP_FLG_NB     ;NO
 
           call   GRA_NVL_CON    ;SI, SE ORDENA GRABAR EL NIVEL ACTUALIZADO DE CONTRASTE
           
           clrf   FLG_NVL_CON    ;SE PONE A 0 A FLAG_NVL_CON


EXP_FLG_NB movf   FLG_NVL_BRL,W  ;SE MUEVE FLG_NVL_BRL A W
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF 
            
           btfss  STATUS,2       ;¿SE MODIFICARON LOS VALORES DEL NIVEL DE BRILLO?
           goto   EXP_FLG_RV     ;NO
  
           call   GRA_NVL_BRL    ;SI, SE ORDENA GRABAR EL NIVEL ACTUALIZADO DE BRILLO
    
           clrf   FLG_NVL_BRL    ;SE PONE A 0 A FLAG_NVL_BRL

EXP_FLG_RV movf   FLG_NVL_REV,W  ;SE MUEVE FLG_NVL_REV A W
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF 
            
           btfss  STATUS,2       ;¿SE MODIFICARON LOS VALORES DEL NIVEL DE REFERENCIA?
           goto   EXP_FLG_VP     ;NO
  
           call   GRA_NVL_INF    ;SI, SE ORDENA GRABAR LOS VALORES ACTUALIZADOS DE LOS NIVELES  
           call   GRA_NVL_NOR    ;DE REFERENCIA, NORMAL, INFERIOR Y SUPERIOR
           call   GRA_NVL_SUP  

           clrf   FLG_NVL_REV    ;SE PONE A 0 A FLAG_NVL_REV


EXP_FLG_VP movf   FLG_VEL_PRO,W  ;SE MUEVE FLG_VEL_PRO A W
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF 
            
           btfss  STATUS,2       ;¿SE MODIFICÓ LA VELOCIDAD DE PROCESO?
           goto   EXP_FLG_EB     ;NO
  
           call   GRA_VEL_PRO    ;SI, SE ORDENA GRABAR EL ESTADO ACTUALIZADO DE LA VELOCIDAD DE 
                                 ;PROCESO

           clrf   FLG_VEL_PRO    ;SE PONE A 0 A FLAG_NVL_REV


EXP_FLG_EB movf   FLG_EST_BUZ,W  ;NO,SE MUEVE FLG_EST_BUZ A W
           sublw  0xFF           ;SE LE RESTA EL VALOR 0xFF 
            
           btfss  STATUS,2       ;¿SE MODIFICÓ EL ESTADO DEL BUZZER?
           return                ;NO

           call   GRA_EST_BUZ    ;SI, SE ORDENA GRABAR EL ESTADO ACTUALIZADO DEL BUZZER
           
           clrf   FLG_EST_BUZ    ;SE PONE A 0 A FLG_EST_BUZ

           return

;**********************************************************************************************


;*************************** GRABACIÓN DE LOS DISTINTOS PARÁMETROS **************************** 

                                                                                     
;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE NVL_SEC *************************

GRA_NVL_SEC call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
         
           movlw  0x00          ;SE MUEVE EL VALOR 0x00 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 00 DE LA MEMORIA EXTERNA   

           movf   NVL_SEC,W     ;SE MUEVE NVL_SEC A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA GRABAR SU
                                ;VALOR ACTUALIZADO            
           goto   SEC_GRA_I2C
            
;**********************************************************************************************


;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE NVL_SEC *************************

GRA_RET_DIS call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
         
           movlw  0x01          ;SE MUEVE EL VALOR 0x01 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 01 DE LA MEMORIA EXTERNA   

           movf   RET_DIS,W     ;SE MUEVE RET_DIS A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA GRABAR SU
                                ;VALOR ACTUALIZADO            
           goto   SEC_GRA_I2C
            
;**********************************************************************************************


;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE NVL_CON *************************

GRA_NVL_CON call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA

           movlw  0x02          ;SE MUEVE EL VALOR 0x02 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 02 DE LA MEMORIA EXTERNA  
        
           movf   NVL_CON,W     ;SE MUEVE NVL_CON A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA
                                ;GRABAR SU VALOR ACTUALIZADO
           goto   SEC_GRA_I2C   
            
;**********************************************************************************************

             
;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE NVL_BRL *************************

GRA_NVL_BRL call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA

           movlw  0x03          ;SE MUEVE EL VALOR 0x03 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 03 DE LA MEMORIA EXTERNA  
        
          
           movf   NVL_BRL,W     ;SE MUEVE NVL_BRL A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA
                                ;GRABAR SU VALOR ACTUALIZADO
           goto   SEC_GRA_I2C 
            
;**********************************************************************************************


;*** SECUENCIA DE GRABACIÓN DEL VALOR DE REFERENCIA INFERIOR PARA LA TEMPERATURA DEL QUÍMICO ***

GRA_NVL_INF call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA

           movlw  0x04          ;SE MUEVE EL VALOR 0x04 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 04 DE LA MEMORIA EXTERNA  
                   
           movf   NVL_REF_INF,W ;SE MUEVE NVL_REF_INF A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A
                                ;GRABAR SU VALOR ACTUALIZADO
           goto   SEC_GRA_I2C 

;***********************************************************************************************


;**** SECUENCIA DE GRABACIÓN DEL VALOR DE REFERENCIA NORMAL PARA LA TEMPERATURA DEL QUÍMICO ****

GRA_NVL_NOR call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA

           movlw  0x05          ;SE MUEVE EL VALOR 0x05 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 05 DE LA MEMORIA EXTERNA  
        
            
           movf   NVL_REF_NOR,W ;SE MUEVE REF_NVL_NOR A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA
                                ;GRABAR SU VALOR ACTUALIZADO

           goto   SEC_GRA_I2C 

;**********************************************************************************************


;*** SECUENCIA DE GRABACIÓN DEL VALOR DE REFERENCIA SUPERIOR PARA LA TEMPERATURA DEL QUÍMICO ***

GRA_NVL_SUP call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA  

           movlw  0x06          ;SE MUEVE EL VALOR 0x06 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 06 DE LA MEMORIA EXTERNA  
            
           movf   NVL_REF_SUP,W ;SE MUEVE NVL_REF_SUP A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A             
                                ;GRABAR SU VALOR ACTUALIZADO 
     
           goto   SEC_GRA_I2C 

;**********************************************************************************************


;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE VEL_PRO *************************

GRA_VEL_PRO call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
         
           movlw  0x07          ;SE MUEVE EL VALOR 0x07 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 07 DE LA MEMORIA EXTERNA  
        
           movf   VEL_PRO,W     ;SE MUEVE VEL_PRO A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA GRABAR SU
                                ;VALOR ACTUALIZADO
            
           goto   SEC_GRA_I2C
            
;**********************************************************************************************

                                                                                                  
;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE PEL_PRO *************************

GRA_EST_BUZ call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
                  
           movlw  0x08          ;SE MUEVE EL VALOR 0x08 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 08 DE LA MEMORIA EXTERNA  
        
           movf   EST_BUZ,W     ;SE MUEVE EST_BUZ A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA
                                ;GRABAR SU VALOR ACTUALIZADO

           goto   SEC_GRA_I2C

;**********************************************************************************************


;************************ SECUENCIA DE GRABACIÓN DEL VALOR DE PEL_PRO *************************

GRA_PEL_PRO call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
           
           movlw  0x09          ;SE MUEVE EL VALOR 0x09 A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 09 DE LA MEMORIA EXTERNA  
        
           movf   PEL_PRO,W     ;SE MUEVE PEL_PRO A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A GRABAR
                                ;SU VALOR ACTUALIZADO

           goto   SEC_GRA_I2C 
                     
;**********************************************************************************************


;********************** SECUENCIA DE GRABACIÓN DEL CÓDIGO DE SEGURIDAD ************************

GRA_DIG_001 call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA   

           movlw  0x0C          ;SE MUEVE EL VALOR 0x0C A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 0C DE LA MEMORIA EXTERNA

           movf   DIG_001,W     ;SE MUEVE DIG_001 A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A GRABAR
                                ;SU VALOR ACTUALIZADO

           goto   SEC_GRA_I2C

           
GRA_DIG_002 call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA   

           movlw  0x0D          ;SE MUEVE EL VALOR 0x0C A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 0C DE LA MEMORIA EXTERNA

           movf   DIG_002,W     ;SE MUEVE DIG_001 A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A GRABAR
                                ;SU VALOR ACTUALIZADO
           
           goto   SEC_GRA_I2C

          
GRA_DIG_003 call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA   

           movlw  0x0E          ;SE MUEVE EL VALOR 0x0C A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 0C DE LA MEMORIA EXTERNA

           movf   DIG_003,W     ;SE MUEVE DIG_001 A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A GRABAR
                                ;SU VALOR ACTUALIZADO
         
           goto   SEC_GRA_I2C
          

GRA_DIG_004 call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA   

           movlw  0x0F          ;SE MUEVE EL VALOR 0x0C A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 0C DE LA MEMORIA EXTERNA

           movf   DIG_004,W     ;SE MUEVE DIG_001 A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA SE VA A GRABAR
                                ;SU VALOR ACTUALIZADO
           
           goto   SEC_GRA_I2C  
 
;**********************************************************************************************


;********************** SECUENCIA DE GRABACIÓN DEL VALOR DE FLAG_I_PR *************************

GRA_FLG_IPR call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
      
           movlw  0x0A          ;SE MUEVE EL VALOR 0x0A A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 0A DE LA MEMORIA EXTERNA  
        
           movf   FLG_INI_PRO,W ;SE MUEVE FLG_INI_PRO A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA, SE VA
                                ;GRABAR SU VALOR ACTUALIZADO 

           goto   SEC_GRA_I2C

;**********************************************************************************************


;********************** SECUENCIA DE GRABACIÓN DEL VALOR DE FLAG_F_PR *************************

GRA_FLG_FPR call  SEL_MEM_ESC   ;SE SELECCIONA LA MEMORIA EXTERNA, PARA ESCRIBIR EN ELLA
 
           movlw  0x0B          ;SE MUEVE EL VALOR 0x0B A DIR_DIS_I2C, DE ESTA FORMA, SE 
           movwf  DIR_DIS_I2C   ;SELECCIONA LA DIRECCIÓN 0B DE LA MEMORIA EXTERNA  
        
           movf   FLG_FIN_PRO,W ;SE MUEVE FLG_FIN_PRO A W   
           movwf  DAT_DIS_I2C   ;SE COPIA SU VALOR A DAT_DIS_I2C, DE ESTA FORMA, SE VA
                                ;GRABAR SU VALOR ACTUALIZADO 

;********************************************************************************************** 


;*********************************** SECUENCIA DE GRABACIÓN ***********************************

SEC_GRA_I2C call  SEC_SEL_DIS
           call   SEC_DIR_DIS
           call   SEC_DAT_DIS
           call   DET_I2C

           call   RET_50_mSE      ;SE GENERA UN RETARDO DE 50 MILISEGUNDOS 
           return   
         
;**********************************************************************************************


;********************** SELECCIÓN DE LA MEMORIA EXTERNA COMO DISPOSITIVO **********************  

SEL_MEM_ESC movlw 0xA0          ;SE MUEVE EL VALOR 0x0A A SEL_DIS_I2C, DE ESTA FORMA, SE  
           movwf  SEL_DIS_I2C   ;SELECCIONA LA MEMORIA EXTERNA Y SE INDICA QUE SE VA A ESCRIBIR 
                                ;EN ELLA                 
           return
      
;**********************************************************************************************


;********* SECUENCIA DE SELECCIÓN DE DISPOSITIVO, CONFIGURACIÓN DE LECTURA Ó ESCRITURA ********
           
SEC_SEL_DIS_RS call EMP_I2C_2   ;SE ENVÍA LA CONDICIÓN DE START      
               goto AJU_SEL_DIS              
 
;**********************************************************************************************


;******** SECUENCIA DE SELECCIÓN DE DISPOSITIVO, CONFIGURACIÓN DE LECTURA Ó ESCRITURA *********
           
SEC_SEL_DIS  call   EMP_I2C       ;SE ENVÍA LA CONDICIÓN DE START      
  
AJU_SEL_DIS  movf   SEL_DIS_I2C,W ;SE MUEVE SEL_DIS_I2C A W   
             movwf  DAT_ESC_I2C   ;SE COPIA SU VALOR A DAT_ESC_I2C, DE ESTA FORMA, SEGÚN EL
                                  ;VALOR DE SEL_DIS_I2C SE SELECCIONA EL DISPOSITIVO EN EL CUAL
                                  ;SE VA A LEER Ó ESCRIBIR   
 
             goto   EMP_ESC_I2C

;**********************************************************************************************


;************ SECUENCIA DE SELECCIÓN DE DIRECCIÓN DEL DISPOSITIVO SELECCIONADO ****************

SEC_DIR_DIS  movf   DIR_DIS_I2C,W ;SE MUEVE DIR_DIS_I2C, DE ESTA FORMA, SE INDICA LA          
             movwf  DAT_ESC_I2C   ;DIRECCIÓN EN LA QUE SE VA A COMENZAR
             
             goto   EMP_ESC_I2C 
                  
;**********************************************************************************************


;************* SECUENCIA DE ESCRITURA EN LA DIRECCIÓN DEL DISPOSITIVO SELECCIONADO ************

SEC_DAT_DIS  movf   DAT_DIS_I2C,W ;SE MUEVE DAT_DIS_I2C, DE ESTA FORMA, SE INDICA EL          
             movwf  DAT_ESC_I2C   ;DATO A GRABAR EN LA DIRECCIÓN SELECCIONADA
                                
EMP_ESC_I2C  call   SEC_ESC_I2C

             movf   FLG_ERR_I2C,W ;SE MUEVE FLG_ERR_I2C A W 
             sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF 

             btfss  STATUS,2      ;¿EL CICLO DE ESCRITURA TERMINÓ CORRECTAMENTE?    
             goto   ERR_SIS       ;NO, HUBO UN ERROR DE ESCRITURA 
             return               ;SI

;**********************************************************************************************


;****************************** GENERACIÓN DEL ESTADO RESTART *********************************

EMP_I2C_2   call  IDL_I2C

            bsf   STATUS,5      ;SE SELECCIONA EL BANCO 1  
            bsf   SSPCON2,1     ;SE REPITE LA CONDICIÓN DE START

EXP_SSP_1   btfsc SSPCON2,1     ;¿LA CONDICÍON DE RESTART ESTA TODAVÍA EN ESE ESTADO? 
            goto  EXP_SSP_1     ;SI

            bcf   STATUS,5      ;NO, SE SELCCIONA EL BANCO 0
            goto  EXP_PIR_3

;*********************************************************************************************


;******************************** GENERACIÓN DEL ESTADO START ********************************* 

EMP_I2C    call   IDL_I2C

           bsf    STATUS,5      ;SE SELECCIONA EL BANCO 1
  
           bsf    SSPCON2,0     ;SE INICIA LA CONDICIÓN DE START

EXP_SSP_0  btfsc  SSPCON2,0     ;¿LA CONDICÍON DE START ESTA TODAVÍA EN ESE ESTADO? 
           goto   EXP_SSP_0     ;SI

           bcf    STATUS,5      ;NO, SE SELECCIONA EL BANCO 0

EXP_PIR_3  btfss  PIR1,3        ;¿LA CONDICIÓN DE START Ó RESTART FUE COMPLETADA?
           goto   EXP_PIR_3     ;NO

           bcf    PIR1,3        ;SI, SE PONE EL BIT INDICADOR A 0   
           return

;**********************************************************************************************


;************************************ CICLO DE ESCRITURA **************************************

SEC_ESC_I2C clrf  FLG_ERR_I2C   ;SE PONE A 0 A FLG_ERR_I2C 
           call   IDL_I2C

           movf   DAT_ESC_I2C,W ;SE MUEVE DAT_ESC_I2C A W   
           movwf  SSPBUF        ;SE COPIA EL VALOR DE DAT_ESC_I2C A SSPBUF
   
           bsf    STATUS,5      ;SE SELECCIONA EL BANCO 1
 
           btfsc  SSPSTAT,2     ;¿LA TRANSMISIÓN ESTÁ EN PROGRESO?  
           goto   $-1           ;SI 

           btfss  SSPCON2,6     ;NO, YA TERMINÓ, ¿SE RECIBÍO LA SEÑAL DE RECONOCIMIENTO?
           goto   ACK_REC       ;SI

           bsf    SSPCON2,2     ;NO, SE PRODUJO UN ERROR, SE GENERA LA CONDICIÓN DE STOP
           bcf    STATUS,5      ;SE SELECCIONA EL BANCO 0
           return             

ACK_REC    bcf    STATUS,5      ;SE SELECCIONA EL BANCO 0

           btfss  PIR1,3        ;¿EL CICLO DE ESCRITURA TERMINÓ? 
           goto   $-1           ;TADAVÍA NO
  
           bcf    PIR1,3        ;SI, YA TERMINÓ

           movlw  0xFF          ;SE MUEVE EL VALOR 0xFF A FLG_ERR_I2C, INDICANDO QUE EL 
           movwf  FLG_ERR_I2C   ;CICLO TERMINÓ CORRECTAMENTE
           return

;**********************************************************************************************


;****************************************** XXXXXXXXXXXX ******************************

IDL_I2C    bsf    STATUS,5      ;SE SELECCIONA EL BANCO 1
 
           btfsc  SSPSTAT,2     ;¿LA TRASMISIÓN ESTÁ EN PROGRESO?
           goto   $-1           ;SI

           movf   SSPCON2,W     ;NO, SE MUEVE SSPCON2 A W
           andlw  0x1F          ;SE EJECUTA LA FUNCIÓN "Y" CON SSPCON2
                         
           btfss  STATUS,2      ;¿EL ESTADO DE SSPCON2 ESTÁ EN 0xE0? 
           goto   $-3           ;NO

           bcf    STATUS,5      ;SI, SE SELECCIONA EL BANCO 0
           return

;**********************************************************************************************


;************************************* CICLO DE LECTURA ***************************************

LER_I2C    call   IDL_I2C
   
           bsf    STATUS,5      ;SE SELECCIONA EL BANCO 1
    
           bsf    SSPCON2,3     ;SE ACTIVA EL MODO DE RECEPCIÓN
   
           btfsc  SSPCON2,3     ;¿TERMINÓ EL CICLO DE RECEPCIÓN?  
           goto   $-1           ;NO

           btfss  SSPSTAT,0     ;SI, ¿EL DATO ESTÁ DISPONIBLE EN SSPBUF?
           goto   $-1           ;NO

           bcf    STATUS,5      ;SI, SE SELECCIONA EL BANCO 0

           movf   SSPBUF,W      ;SE MUEVE SSPBUF A W
           movwf  DAT_OBT_I2C   ;SE COPIA EL VALOR A DAT_OBT_I2C 
           return

;**********************************************************************************************


;***************************** GENERACIÓN DE LA REPUESTA SIN ACK ******************************

ENV_NAK_I2C bsf   STATUS,5      ;SE SELECCIONA EL BANCO 0   
           bsf    SSPCON2,5     ;SE ENVIA RESPUESTA SIN ACK
           bsf    SSPCON2,4     ;SE INICIALIZA LA SECUENCIA DE ACK
           bcf    STATUS,5      ;SE SELECCIONA EL BANCO 0 
           return

;**********************************************************************************************


;******************************** GENERACIÓN DEL ESTADO STOP **********************************

DET_I2C    bsf    STATUS,5      ;SE SELECCIONA EL BANCO 0
           bsf    SSPCON2,2     ;SE GENERA LA CONDICIÓN DE STOP
           bcf    STATUS,5      ;SE SELECCIONA EL BANCO 0
           return

;**********************************************************************************************


;****************************** SUBRUTINAS DE RETARDO DE TIEMPO *******************************
                                               

;************************** RUTINA DE RETARDO DE 200 MICROSEGUNDOS ****************************

RET_200_uSE movlw 0x02        ;SE MUEVE EL VALOR 0x02 A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET ;TEMPORIZACIÓN DE 100 MICROSEGUNDOS 2 VECES (200 MICROSEGUNDOS)
   
           goto   REP_100_uSE   
       
;**********************************************************************************************


;************************** RUTINA DE RETARDO DE 800 MICROSEGUNDOS ****************************

RET_800_uSE movlw 0x08          ;SE MUEVE EL VALOR 0x08 A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET   ;TEMPORIZACIÓN DE 100 MICROSEGUNDOS 8 VECES (800 MICROSEGUNDOS)
  
REP_100_uSE call  RET_PAT       ;SE GENERA EL RETARDO PATRÓN DE 100 MICROSEGUNDOS

           decfsz PRI_CON_RET,1 ;SEG_CON_RET SE DECREMENTA EN UNA UNIDAD, ¿LLEGÓ A 0?
           goto   REP_100_uSE   ;NO
           return               ;SI

;**********************************************************************************************


;*************************** RUTINA DE RETARDO DE 50 MILISEGUNDOS *****************************

RET_50_mSE movlw  0x05        ;SE MUEVE EL VALOR 0x05 A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET ;TEMPORIZACIÓN DE 10 MILISEGUNDOS 5 VECES (50 MILISEGUNDOS)
 
           goto   RET_10_mSE    

;**********************************************************************************************


;************************** RUTINA DE RETARDO DE 100 MILISEGUNDOS *****************************

RET_100_mSE movlw 0x0A        ;SE MUEVE EL VALOR 0x0A A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET ;TEMPORIZACIÓN DE 10 MILISEGUNDOS 10 VECES (100 MILISEGUNDOS)
 
           goto   RET_10_mSE    

;**********************************************************************************************


;************************** RUTINA DE REATRDO DE 500 MILISEGUNDOS *****************************

RET_500_mSE movlw 0x32        ;SE MUEVE EL VALOR 0x32 A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET ;TEMPORIZACIÓN DE 10 MILISEGUNDOS 50 VECES (500 MILISEGUNDOS)
 
           goto   RET_10_mSE    

;**********************************************************************************************


;****************************** RUTINA DE RETARDO DE 1 SEGUNDO ********************************

RET_1_SEG  movlw  0x64        ;SE MUEVE EL VALOR 0x64 A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET ;TEMPORIZACIÓN DE 10 MILISEGUNDOS 100 VECES (1 SEGUNDO)

           goto   RET_10_mSE    

;**********************************************************************************************


;***************************** RUTINA DE RETARDO DE 2 SEGUNDOS ********************************

RET_2_SEG  movlw  0xC8          ;SE MUEVE EL VALOR 0xC8 A PRI_CON_RET , DE ESTA FORMA, REPITE LA  
           movwf  PRI_CON_RET   ;TEMPORIZACIÓN DE 10 MILISEGUNDOS 200 VECES (2 SEGUNDOS)
  
RET_10_mSE movlw  0x64          ;SE MUEVE EL VALOR 0x64 A SEG_CON_RET, DE ESTA FORMA, REPITE LA   
           movwf  SEG_CON_RET   ;RUTINA DEL RETARDO PATRÓN DE 100 MICROSEGUNDOS, 100 VECES 
                                ;(10 MILISEGUNDOS)

REP_10_uSE call   RET_PAT       ;SE GENERA EL RETARDO PATRÓN DE 100 MICROSEGUNDOS

           decfsz SEG_CON_RET,1 ;SEG_CON_RET SE DECREMENTA EN UNA UNIDAD, ¿LLEGÓ A 0?
           goto   REP_10_uSE    ;NO

           movlw  0x64          ;SI, SE MUEVE EL VALOR 0x64 A SEG_CON_RET, DE ESTA FORMA, SE REPITE     
           movwf  SEG_CON_RET   ;LA RUTINA DE RETARDO DE 10 MILISEGUNDOS

           decfsz PRI_CON_RET,1 ;PRI_CON_RET SE DECREMENTA EN UNA UNIDAD, ¿LLEGÓ A 0?
           goto   REP_10_uSE    ;NO 
           return               ;SI

;**********************************************************************************************


;*********************** RUTINA DE RETARDO PATRÓN DE 100 MICROSEGUNDOS ************************
                                      
RET_PAT    movlw  0x01        
           movwf  RET_100_uSE
           
REP_SEC_RET bcf   INTCON,2    ;Borra flag del TMR0

           movlw  0x8C  ;0X89                
           movwf  TMR0_OPT

           btfss  INTCON,2    ;Espera overflow del TMR0
           goto   $-1

           decfsz RET_100_uSE,1    ;Repite 10 veces
           goto   REP_SEC_RET                
           return

;***********************************************************************************************

                                          
END 
































;************************** SALIDA DEL MODULADOR DE ANCHO DE PULSO ****************************

SAL_SEC    movf   FLG_SAL_SEC,W ;SE MUEVE FLG_SAL_SEC A W            
           sublw  0xFF          ;SE LE RESTA EL VALOR 0xFF  
              
           btfsc  STATUS,2      ;¿SE DEBE ACTIVAR EL CALENTADO DE SECADO?    
           goto   ACT_SAL_SEC   ;SI

           call   RET_800_uSE   ;NO, SE GENERA UN RETARDO DE 800 MICOSEGUNDOS, DE ESTA FORMA, 
                                ;SE SOBREPASA EL ESTADO ALTO DE LA SEÑAL DE REFERENCIA DE LÍNEA 
           return               


ACT_SAL_SEC call  RET_300_uSE 

           bsf    PORTB,6       ;SE ENCIENDE EL CALENTADOR DE SECADO

           movf   NVL_SEC,W     ;SE MUEVE EL VALOR ACTUAL DE NVL_SEC A W
           movwf  CON_RET_SEC   ;SE LO COPIA A CON_RET_SEC  

REP_RET_SEC call  RET_PAT       ;SE GENERA EL RETARDO PATRÓN DE 100 MICROSEGUNDOS      
                 
           decfsz CON_RET_SEC,1 ;SE DECREMENTA CON_RET_SEC ¿LLEGÓ A 0?    
           goto   REP_RET_SEC   ;NO

           bcf    PORTB,6       ;SI, SE DESCONECTA EL CALENTADOR DE SECADO
           return

;**********************************************************************************************        