Ejemplos de Programacion Asm
Ejemplos de Programacion Asm
Ejemplos de Programacion Asm
; ===================================================================
; ===================================================================
CBLOCK
ENDC
Arit_VisualizaBinario
movlw .8
Arit_VisualizaBit
return
; Lo hace en complemento a 2 por el método clásico, es decir, primero invierte todos los bits
; Se utiliza la instrucción "addwf __", en lugar de "incf ___", porque ésta no posiciona
; el flag de Carry.
; 16 bits a negar.
Arit_Negar
comf Arit_Operando_1L,F
movlw .1 ; Le suma 1.
addwf Arit_Operando_1L,F
incf Arit_Operando_1H,F
return
; (Arit_Operando_2H, Arit_Operando_2L).
Arit_Resta_16Bit
movf Arit_Operando_1H,W
return
; manualmente con lápiz y papel. En este método, la multiplicación se lleva a cabo tomando
; Previo a la llamada de esta subrutinas los números a multiplicar se almacenan en los registros
; Se utilizan posiciones de memoria definidas anteriormente, a las que se les cambia el nombre
Arit_Multiplica_8Bit
clrf Arit_Producto_L
movwf Arit_ContadorBits
Arit_MultiplicaBit8
return
; Previo a la llamada de esta subrutinas los números a multiplicar se almacenan en los registros
; Se utilizan posiciones de memoria definidas anteriormente, a las que se les cambia el nombre
Arit_Multiplica_16Bit
clrf Arit_Producto_2H
clrf Arit_Producto_2L
movwf Arit_ContadorBits
Arit_Multiplica16Bit
rrf Arit_Multiplicador_L,F
btfss STATUS,C
goto Arit_Multiplicador_BitCero
btfsc STATUS,C
incf Arit_Producto_2H,F
movf Arit_Multiplicando_H,W
addwf Arit_Producto_2H,F
Arit_Multiplicador_BitCero
rrf Arit_Producto_1H,F
rrf Arit_Producto_1L,F
return
; Realiza la división del contenido del dividendo de 8 bits entre un divisor de 8 bits.
;
; El algoritmo utilizado se basa en el método empleado para resolver una división de
; números binarios con lápiz y papel. En este método se van tomando los bits del dividendo
; uno a uno, comenzando por el más significativo: por cada bit del dividendo se genera un
; bit en el cociente. Los bits separados constituyen el dividendo parcial. Cada vez que se
; toma un nuevo bit del dividendo, el valor conjunto de los bits en el dividendo parcial se
; compara con el divisor. El el primero resulta ser mayor o igual al segundo, entonces al
; dividendo parcial se le resta el valor del divisor, el bit respectivo del cociente se pone
; a "1" y el resultado de la resta se convierte en el nuevo dividendo parcial, una vez que
; indica que éste último es mayor, entonces el bit del cociente se pone a "0" y al dividendo
; parcial anterior se le añade el siguiente bit del dividendo para formar el nuevo dividendo
; parcial. El proceso termina cuando se agotan los bits del dividendo; el contenido del
; división.
; Entradas:
; Salidas:
; - (Arit_Cociente).
; - (Resto).
; La división se hará sin signo y el programa que le llame deberá detectar que el divisor no
; es cero.
; Se utilizan posiciones de memoria definidas anteriormente, a las que se les cambia el nombre
Arit_Divide_8Bit
clrf Arit_Resto
movwf Arit_ContadorBits
Arit_DivideBit8
rlf Arit_Dividendo,F
movf Arit_Divisor,W
decfsz Arit_ContadorBits,F
goto Arit_DivideBit8
return
; Realiza la división del contenido del dividendo de 16 bits entre un divisor de 7 bits.
; Entradas:
; Salidas:
; - (Resto) de 8 bits.
; La división se hará sin signo y el programa que le llame deberá detectar que el divisor no
; b'01111111'=0x7F=d'127'.
; Se utilizan posiciones de memoria definidas anteriormente, a las que se les cambia el nombre
Arit_Divide_16Bit
clrf Arit_Cociente_L
clrf Arit_Resto
movwf Arit_ContadorBits
Arit_DivideBit16
rlf Arit_Dividendo_L,F
rlf Arit_Dividendo_H,F
movf Arit_Divisor,W
decfsz Arit_ContadorBits,F
goto Arit_DivideBit16
return
; El metodo usado para la conversión de un número BCD a binario natural, se basa en que
; cada dígito de un número codificado en BCD tiene un peso igual a la potencia de diez
; necesario multiplicar cada dígito BCD por su peso correspondiente y luego sumar todos
;
; 10^4 DecenasMillar + 10^3 Millares + 10^2 Centenas + 10 Decenas + Unidades =
; Previo a la llamada de esta subrutinas, cada digito del número decimal a convertir se
CBLOCK
Arit_Unidades
Arit_Decenas
Arit_Centenas
Arit_Millares
Arit_DecenasMillar
ENDC
Arit_BCD_Bin_16Bit
movf Arit_DecenasMillar,W
movf Arit_Millares,W
movf Arit_Centenas,W
call Arit_BCD_Operacion ; (10(10*DecenasMillar+Millares)+Centenas)
movf Arit_Decenas,W
movf Arit_Unidades,W
return
movf Arit_Resultado_1L,W
movf Arit_Resultado_1H,W
movwf Arit_Multiplicando_H
movlw .10
movwf Arit_Multiplicador_L
movf Arit_Auxiliar,W
addwf Arit_Resultado_1L,F
btfsc STATUS,C
return
; binario entre diez (0x0A). El resto generado después de la primera división proporciona el
; en decimal:
; 58 : 10 = 5 Resto = 8 (Millares)
CBLOCK
Arit_ContadorDigitos
Arit_Binario_H
Arit_Binario_L
ENDC
Arit_Bin_BCD_16Bit
movwf Arit_Dividendo_L
movwf Arit_ContadorDigitos
Arit_DigitoBCD
movwf Arit_Divisor
movf Arit_Cociente_L,W
movwf Arit_Dividendo_L
decfsz Arit_ContadorDigitos,F
goto Arit_DigitoBCD
return
; Visualiza en el LCD un número decimal de varios dígitos de manera tal que no se representan
ENDC ; Si (Arit_FlagVisual)=b'00000001' SI
escribe el
Arit_NumeroDigitos EQU .5
Arit_VisualizaBCD
Arit_VisualizaDigitoBCD
Arit_VisualizaDigito
Arit_PasaAlSiguiente
goto Arit_VisualizaDigitoBCD
movf Arit_Unidades,W ; Las unidades siempre se visualizan, aunque
sean
return
; ===================================================================
; ===================================================================
; ===================================================================
; ===================================================================
BCD_Unidades
ENDC
BIN_a_BCD
BCD_Resta10
BCD_IncrementaDecenas
BIN_BCD_Fin
; ===================================================================
; ===================================================================
; ===================================================================
; ===================================================================
; Estas subrutinas permiten realizar las tareas básicas de control del bus serie I2C,
CBLOCK
ENDC
#DEFINE I2C_UltimoByteLeer I2C_Flags,0
; La definición de las líneas SCL y SDA del bus I2C se puede cambiar según las
SDA_Bajo
bcf SDA
bcf STATUS,RP0
return
SDA_AltaImpedancia
return
;
SCL_Bajo
bsf STATUS,RP0
bcf STATUS,RP0
return
SCL_AltaImpedancia
SCL_EsperaNivelAlto
return
I2C_EnviaStart
call Retardo_4micros
return
I2C_EnviaStop
call SDA_Bajo
return
; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
I2C_EnviaByte
movwf I2C_ContadorBits
I2C_EnviaBit
btfsc STATUS,C
goto I2C_EnviaUno
I2C_EnviaCero
goto I2C_FlancoSCL
I2C_EnviaUno
I2C_FlancoSCL
goto I2C_EnviaBit
call SCL_Bajo
call Retardo_4micros
return
;
; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
I2C_LeeByte
movwf I2C_ContadorBits
I2C_LeeBit
goto I2C_LeeBit
; ACK en consecuencia.
call Retardo_4micros
return ; de trabajo W.
; ===================================================================
; ===================================================================
; ===================================================================
; ===================================================================
CBLOCK
; (posición de la etiqueta
"Mensajes").
LCD_ValorCaracter ; Código ASCII del carácter a
ENDC ; visualizar.
; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la
; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que
; addwf PCL,F
; Mensaje1
; ...
; ...
; FinMensajes
LCD_Mensaje
LCD_VisualizaOtroCaracter
movf LCD_ApuntaCaracter,W
LCD_NoUltimoCaracter
LCD_FinMensaje
; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse
CBLOCK
LCD_PrimeraPosicion
subwf LCD_CursorPosicion,W
btfss STATUS,Z
goto LCD_NoEsFinalLinea
LCD_EsFinalLinea
call Retardo_200ms
movf LCD_ApuntaCaracter,W
LCD_NoUltimoCaracter2
LCD_FinMovimiento ; de la línea.
; ===================================================================
; ===================================================================
; ML_CHIP_V1_1
;
(Salvamos en ML1_1_bk1.asm)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
;CONSTANTES
;DIRECCIONES DE RAM
;BANCO_0_BANCO_0_BANCO_0_BANCO_0_BANCO_0_BANCO_0_BANCO_0_BANCO_0_BANCO
_0_BANCO_0_
;de 1 segundo
(10 milisegundos)
;de 1 segundo
(100*10 mseg=1seg)
;puerto serie.
Aqui se almacena dirH de la
;direccion de la
trama.
;puerto serie.
Aqui se almacena dirL de la
;direccion de la
trama.
;puerto serie.
Aqui se almacena el comando
;de la trama.
;puerto serie.
Aqui se almacena el tamaño
;de datos utiles
de la trama.
;Bit1: 2AI: a 1 ya
se ha realizado un AD
;Bit2: 3AI: a 1 ya
se ha realizado un AD
;Bit3: 4AI: a 1 ya
se ha realizado un AD
;Bit4: 5AI: a 1 ya
se ha realizado un AD
;Bit5: 6AI: a 1 ya
se ha realizado un AD
;Bit6: 7AI: a 1 ya
se ha realizado un AD
;Bit7: 8AI: a 1 ya
se ha realizado un AD
;Bit2: 3AI: a 1 ya
se ha leido 3ªAI=AI4
;Bit3: 4AI: a 1 ya
se ha leido 4ªAI=AI5
;Bit4: 5AI: a 1 ya
se ha leido 5ªAI=AI7
;siguiente codigo
ladder que nos envien
;desde el PC
(BYTE ALTO)
;siguiente codigo
ladder que nos envien
;desde el PC
(BYTE BAJO)
;BANCO_1_BANCO_1_BANCO_1_BANCO_1_BANCO_1_BANCO_1_BANCO_1_BANCO_1_BANCO
_1_BANCO_1_
;acceso al LCD
;de timer1
#define B1_SetPoint_500mseg 0x55 ;Variable para calcular cuando llevamos 500
mseg
;de timer1
;las 4 palabras
para grabar en FLASH
;Zona de RD
;BANCO_3_BANCO_3_BANCO_3_BANCO_3_BANCO_3_BANCO_3_BANCO_3_BANCO_3_BANCO
_3_BANCO_3_
;AI2
;AI2,AI3,AI5
;AI2,AI3,AI4,AI5,
AI7
;en memoria
EEPROM (0..3)
;memoria
EEPROM (0..3)
TimControl_YaEnMarcha EQU 0
TimControl_TipoTimer_BitBajo EQU 1
TimControl_TipoTimer_BitAlto EQU 2
TimControl_BaseTiempo_BitBajo EQU 3
TimControl_BaseTiempo_BitAlto EQU 4
TimControl_SalidaTimer EQU 5
TimControl_SenalActivAnterior EQU 6
TimControl_ActivacionBT EQU 7
;BANCO COMUN
;...
#define ESTADO_LOGICO_DE_OL 0X7A,0 ;Valor lógico del bit obtenido por U,O,...
#define ESTADO_LOGICO_PARA_OL 0X7A,1 ;Valor lógico de la pila para =,SET,...
;LCD
;LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD_LCD
_LCD_LCD_
;+++++++++++++++++++++++++++++++++++++++MACROS++++++++++++++++++++++++++++++++++++++
+++++++++
;++++++++++++++++++++++++++MACROS++++++++++++++++++++++++++MACROS++++++++++++++++++
++++++++++
;+++++++++++++++++++++++MACROS++++++++++MACROS+++++++++++++++++++++++++++++++++++++
++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++MACROS++++++++++++++
+++++++++
;++++++++++++++++++++++++++++++++++++++++++++MACROS+++++++++++++++++++++++++++++++++
+++++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++MACROS+++++++++++++++++++++
+++++++++
;++++++MACROS+++++++++++++MACROS+++++++++++++++++++++++++++++++++++++MACROS+++++++
+++++++++++
pPagina0 macro
BCF PCLATH,3
BCF PCLATH,4
endm
pPagina1 macro
BSF PCLATH,3
BCF PCLATH,4
endm
pPagina2 macro
BCF PCLATH,3
BSF PCLATH,4
endm
pPagina3 macro
BSF PCLATH,3
BSF PCLATH,4
endm
sBanco0 macro
BCF STATUS,RP0
BCF STATUS,RP1
endm
sBanco1 macro
BSF STATUS,RP0
BCF STATUS,RP1
endm
sBanco2 macro
BCF STATUS,RP0
BSF STATUS,RP1
endm
sBanco3 macro
BSF STATUS,RP0
BSF STATUS,RP1
endm
salvar_W_STATUS macro
clrf STATUS
movwf SAVE_STATUS
movwf SAVE_FSR
movwf SAVE_PCLATH
endm
restaurar_W_STATUS macro
clrf STATUS
movwf PCLATH
movwf FSR
swapf SAVE_W,W
endm
clrf INTCON
clrf PCLATH
goto Inicio
;+++++++++++++++++++++++++++++++++++++++INTERRUPCIONES+++++++++++++++++++++++++++++++
++++++++
;++++++++++++++++++++++++++INTERRUPCIONES+++++++++++INTERRUPCIONES+++++++++++++++++++
++++++++
;+++++++++++++++++++++++INTERRUPCIONES++INTERRUPCIONES+++++++++++++++++++++++++++++++
++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++INTERRUPCIONES+++++++
++++++++
;++++++++++++++++++++++++++++++++++++++++++++INTERRUPCIONES++++++++++++++++++++++++++
++++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++INTERRUPCIONES++++++++++++++
++++++++
;++++++INTERRUPCIONES+++++INTERRUPCIONES+++++++++++++++++++++++++++++INTERRUPCIONES+
+++++++++
Inter
salvar_W_STATUS
clrwdt
;******************************************************************************
;******************************************************************************
inter_TMR1_
goto inter_TMR1
;******************************************************************************
;******************************************************************************
Inter_tx_usart_
sBanco1
btfss PIE1,4
goto Inter_rx_usart_
sBanco0
btfsc PIR1,4
goto Inter_tx_usart
;******************************************************************************
;******************************************************************************
Inter_rx_usart_
sBanco0
btfss PIR1,5
goto salir_inter
;Esto lo he cambiado de sitio el 21-12-2002
;******************************************************************************
;******************************************************************************
goto m_rx_2
goto m_rx_1
m_rx_1
goto salir_inter
m_rx_2
goto m_rx_3
m_rx_3
goto m_rx_1
goto m_rx_5
m_rx_4
clrf RX_232_BYTESenTRAMA
;****************************************************************************
;****************************************************************************
movwf FSR
bucle_m_rx_4
clrf INDF
;movlw 0x3F
movlw 0x61
goto m_rx_1
;*****************************************************************************
;*****************************************************************************
subwf RX_232_BYTESenTRAMA,W
m_rx_7
goto m_rx_1
m_rx_8
clrf RX_232_BYTESenTRAMA
;Ponemos a 0 el byte "Bytes en trama"
goto m_rx_1
m_rx_9
;******************************************************************************
;******************************************************************************
bcf STATUS,RP0
incf RX_232_BYTESenTRAMA,F
;almacenar en el buffer.
movf RX_232_BYTESenTRAMA,W
;Cargamos en el acumulador
addlw BUFFER_RX_MENOS_1
goto m_rx_1
;******************************************************************************
;******************************************************************************
Inter_tx_usart
btfss 0x23,7 ;Comprobamos si tenemos algo para enviar
goto salir_inter
;******************************************************************************
;******************************************************************************
sBanco0
movf BUFFER_TX_NEXT,W
subwf BUFFER_TX_LAST,W
btfsc STATUS,Z
goto Inter_tx_usart_Fin_Envio_Trama
movf BUFFER_TX_NEXT,W
movf INDF,W
movwf TXREG
incf BUFFER_TX_NEXT,F
goto salir_inter
Inter_tx_usart_Fin_Envio_Trama
sBanco1
sBanco0
bcf 0x23,7
goto salir_inter
;******************************************************************************
;* Interrupción del TMR1 cada 1 mseg.
;******************************************************************************
inter_TMR1
sBanco0
movwf TMR1H
movlw 0x86
movwf TMR1L
;movwf TMR1H
;movlw 0xA2
;movwf TMR1L
btfss RCSTA,OERR
Usart_Si_Bloqueada
bsf RCSTA,CREN
Usart_Fin_Bloqueo
sBanco1
btfss B1_bDelayIniLCD
goto LCD_Delay_End
incf B1_cDelayIniLCD,F
LCD_Delay_End
; btfss B1_bEsperandoBusyFlag
; goto LCD_noEsperaBusyFlag
; ;Estamos esperando respuesta del busy flag, pero antes vamos a asegurarnos de que
; sBanco0
; btfss B0_LCD_E
; goto LCD_noEsperaBusyFlag
; btfsc B0_LCD_RS
; goto LCD_noEsperaBusyFlag
; btfss B0_LCD_RW
; goto LCD_noEsperaBusyFlag
; btfss PORTB,7
; goto LCD_EsperaBusyFlag0
; goto LCD_noEsperaBusyFlag
;LCD_EsperaBusyFlag0
; sBanco0
; sBanco1
; bcf B1_bEsperandoBusyFlag
;
; ;bsf PCLATH,3
; ;Esto faltaba:
; bsf Bx_BEnviarSigCARACTER
; ;call EnviarSiguienteA_LCD
; ;bcf PCLATH,3
;LCD_noEsperaBusyFlag
sBanco0
goto todavia_no_cero
goto ya_es_cero
todavia_no_cero
goto salir_inter_TMR1
ya_es_cero
;**************************************************************************
;* 10 mseg.
;**************************************************************************
;**************************************************************************
;* Fin de la rutina que se ejecuta cada 10 mseg
;**************************************************************************
sBanco0
movlw .10
movwf TIMER_1S_L
sBanco1
HanPasado100mseg_
;sBanco1
decfsz B1_SetPoint_100mseg,F
goto HanPasado500mseg_
movlw .10
movwf B1_SetPoint_100mseg
sBanco0
btfss B0_Pre_SD_0_1s
goto Pre_SD000_6_es_cero
goto Pre_SD000_6_es_uno
Pre_SD000_6_es_cero
bsf B0_Pre_SD_0_1s
goto Pre_SD000_6_seguir
Pre_SD000_6_es_uno
bcf B0_Pre_SD_0_1s
Pre_SD000_6_seguir
HanPasado500mseg_
sBanco1
decfsz B1_SetPoint_500mseg,F
goto HanPasado1000mseg_
movlw .50
movwf B1_SetPoint_500mseg
sBanco0
btfss B0_Pre_SD_0_5s
goto Pre_SD000_5_es_cero
goto Pre_SD000_5_es_uno
Pre_SD000_5_es_cero
bsf B0_Pre_SD_0_5s
goto Pre_SD000_5_seguir
Pre_SD000_5_es_uno
bcf B0_Pre_SD_0_5s
Pre_SD000_5_seguir
HanPasado1000mseg_
sBanco0
decfsz TIMER_1S_H,F
goto salir_inter_TMR1
sBanco1
sBanco0
movlw .100
movwf TIMER_1S_H
btfss B0_Pre_SD_1s
goto Pre_SD000_4_es_cero
goto Pre_SD000_4_es_uno
Pre_SD000_4_es_cero
bsf B0_Pre_SD_1s
goto Pre_SD000_4_seguir
Pre_SD000_4_es_uno
bcf B0_Pre_SD_1s
Pre_SD000_4_seguir
salir_inter_TMR1
salir_inter
restaurar_W_STATUS
retfie
;+++++++++++++++++++++++++++++++++++++++INICIALIZACION_PIC+++++++++++++++++++++++++++++
++++++
;++++++++++++++++++++++++++INICIALIZACION_PIC+++++++INICIALIZACION_PIC+++++++++++++++++++
++++
;+++++++++++++++++++++++INICIALIZACION_PIC++INICIALIZACION_PIC+++++++++++++++++++++++++++
++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++INICIALIZACION_PIC+++++
++++++
;++++++++++++++++++++++++++++++++++++++++++++INICIALIZACION_PIC++++++++++++++++++++++++
++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++INICIALIZACION_PIC++++++++++++
++++++
;++++++INICIALIZACION_PIC+++INICIALIZACION_PIC+++++++++++++++++++++++INICIALIZACION_PIC+++
+++
Inicio
clrf STATUS
clrf PIR1
bsf B0_Pre_SD_1s
bsf B0_Pre_SD_0_5s
bsf B0_Pre_SD_0_1s
sBanco1
clrf PIE1
clrf PIE2
bsf CMCON,CM0
sBanco0
movwf ADCON0
;bcf bTodasADLeidas
clrf AI_YaRealizada1Vez
clrf AI_EntradaAnalogLeida
;clrf TIMER_1S_L
;clrf TIMER_1S_H
clrf 0x23
;salto correctamente.
bcf Bx_SD_2RUN
;bcf Bx_SD_1s
;bcf Bx_SD_0_5s
;bcf Bx_SD_0_1s
bsf Bx_SD_1s
bsf Bx_SD_0_5s
bsf Bx_SD_0_1s
bcf Bx_SD_CF
bcf Bx_SD_OFF
bsf Bx_SD_ON
bsf Bx_SD_1CYCLE
bsf Bx_SD_2RUN
bcf Bx_SD_MUL_OVF
bcf Bx_SD_EQ
bcf Bx_SD_NEQ
bcf Bx_SD_GE
bcf Bx_SD_GT
bcf Bx_SD_LE
bcf Bx_SD_LT
bcf Bx_SD_DIV_BY0
;bsf B0_Pre_SD_EE_FREE
bsf Bx_SD_EE_FREE
;bcf B0_Pre_SD_EE_WROK
bcf Bx_EE_EnMarcha
bcf Bx_SD_EE_WROK
;bcf B0_Pre_SD_EE_WRER
bcf Bx_SD_EE_WRER
bcf Bx_SD_EE_RDOK
movlw ByteAltoBeginLADDER
movwf PCaPIC_FLASH_H
movlw ByteBajoBeginLADDER
movwf PCaPIC_FLASH_L
;***************************************************************************
;***************************************************************************
sBanco0
movwf FSR
buclecillo
clrf INDF
movlw 0x47
; movlw RD000
; movwf FSR
;LimpiezaZonaRD
; clrf INDF
; movlw RD095
; addlw .1
; bcf STATUS,IRP
movlw RD000
iorlw 0x80
movwf FSR
LimpiezaZonaTimer
clrf INDF
addlw .1
iorlw 0x80
goto LimpiezaZonaTimer
bcf STATUS,IRP
movlw 0x20
iorlw 0x80
movwf FSR
LimpiezaZonaBanco1
clrf INDF
movlw 0x6F
addlw .1
iorlw 0x80
goto LimpiezaZonaBanco1
bcf STATUS,IRP
pPagina3
call Pg3_LimpiarZonaLCD
pPagina0
;****************************************************************************
;****************************************************************************
;*Hay que configurar las patas SCL y SDA como entradas, nosotros configuramos
;sBanco1
;movlw b'10000000'
;movlw .9
;sBanco0
;El bit 5 habilita el I2C y el 3 activado con los 2,1,0 desactivados hace que
;movlw b'00101000'
sBanco0
;movlw 0x0B
;movwf RX_232_DIRH
;movlw 0x0B
;movwf RX_232_DIRL
clrf RX_232_DIRH
clrf RX_232_DIRL
clrf PORTA
clrf PORTC
clrf PORTB
movwf TIMER_1S_L
movwf TIMER_1S_H
sBanco1
movlw .50
movwf B1_SetPoint_500mseg
movlw .10
movwf B1_SetPoint_100mseg
movlw b'10001110'
movlw b'00011111'
movlw b'10111111'
movwf TRISC ;RC7/Rx entrada, RC6/Tx salida,todo los demas entradas
movlw b'00100100'
movwf TXSTA ;TX en On, modo asíncrono con 8 bits y alta velocidad
movwf SPBRG
movlw 0x34
movwf 0x20
movlw 0x21
movwf 0x21
sBanco0
movlw b'10010000'
movwf TMR1H
movlw 0x86
movwf TMR1L
;movwf TMR1H
;movlw 0xA2
;movwf TMR1L
movwf T1CON
sBanco1
sBanco0
call CogeConfigIO_DeFLASH_ARAM
pPagina2
call Pg2_LimpiarTimers
pPagina0
sBanco3
goto IniLCD_End
sBanco1
IniLCD_End
;++++++++++++++++++++++++++++++++++++++BUCLE_INFINITO+++++++++++++++++++++++++++++++++
+++
;+++++++++++++++++++++++++BUCLE_INFINITO++++++++++++++++++BUCLE_INFINITO++++++++++++++
+++
;++++++++++++++++++++++BUCLE_INFINITO+++BUCLE_INFINITO++++++++++++++++++++++++++++++++
+++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BUCLE_INFINITO+++++++++
+++
;+++++++++++++++++++++++++++++++++++++++++++BUCLE_INFINITO++++++++++++++++++++++++++++
+++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++BUCLE_INFINITO++++++++++++++++
+++
;+++++BUCLE_INFINITO+++++BUCLE_INFINITO+++++++++++++++++++++++++++++BUCLE_INFINITO+++++
++
m_b_0
call Pg0_EEPROM
call Pg0_ActualizaTimers
sBanco3
goto NoInicializa_LCD_
bsf PCLATH,3
bcf PCLATH,3
;NoInicializa_LCD_
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sBanco1
btfss B1_bEsperandoBusyFlag
goto LCD_noEsperaBusyFlag
;Estamos esperando respuesta del busy flag, pero antes vamos a asegurarnos de que
sBanco0
btfss B0_LCD_E
goto LCD_noEsperaBusyFlag
btfsc B0_LCD_RS
goto LCD_noEsperaBusyFlag
btfss B0_LCD_RW
goto LCD_noEsperaBusyFlag
btfss PORTB,7
goto LCD_EsperaBusyFlag0
goto LCD_noEsperaBusyFlag
LCD_EsperaBusyFlag0
sBanco0
sBanco1
bcf B1_bEsperandoBusyFlag
bsf PCLATH,3
;bsf Bx_BEnviarSigCARACTER
call EnviarSiguienteA_LCD
bcf PCLATH,3
LCD_noEsperaBusyFlag
NoInicializa_LCD_
; btfss Bx_BEnviarSigCARACTER
; goto m_b_0_NoEnviarSigCaracterALCD
; bsf PCLATH,3
; call EnviarSiguienteA_LCD
; bcf PCLATH,3
; ;bcf Bx_BEnviarSigCARACTER
;m_b_0_NoEnviarSigCaracterALCD
sBanco0
bsf Bx_SD_0_1s
btfss B0_Pre_SD_0_1s
bcf Bx_SD_0_1s
bsf Bx_SD_0_5s
btfss B0_Pre_SD_0_5s
bcf Bx_SD_0_5s
bsf Bx_SD_1s
btfss B0_Pre_SD_1s
bcf Bx_SD_1s
;sBanco0
bsf PCLATH,3
call Pg1_EntradasSalidas
bcf PCLATH,3
sBanco0
goto m_b_0_RUN
m_b_0_RUN
sBanco0
pPagina3
call Pg3_ProgramaLadder
pPagina0
sBanco0
sublw 0x02
btfss STATUS,Z
goto m_b_0_NoPonerASTOP
pPagina3
call Pg3_PonerCPUaSTOP
pPagina0
sBanco0
;;Ponemos en STOP
;sBanco3
;clrf B3_ByteIO_P1_p8
;clrf B3_ByteIO_P9_p16
;clrf B3_ByteIO_P17_p24
;clrf B3_ByteIO_P25_p32
;clrf B3_ByteIO_P33_p40
;bsf PCLATH,3
;call Pg1_EntradasSalidas
;bcf PCLATH,3
;sBanco0
m_b_0_NoPonerASTOP
bcf Bx_SD_2RUN
bcf Bx_SD_EE_WROK
bcf Bx_SD_EE_WRER
m_ml_9999
;****************************************************************************
;* Comprobamos si la trama recibida tiene el formato y el checksum validos.
;****************************************************************************
btfss 0x23,0
goto m_b_1
goto m_b_2
m_b_1
btfss 0x23,3
goto m_b_0
goto m_b_13
m_b_2
btfss 0x23,2
goto m_b_3
goto m_b_1
m_b_3
movf RX_232_BYTESenTRAMA,W
movwf LOCAL_0
movlw .4
movwf LOCAL_1
call byte_mayorigual_que
btfss LOCAL_1,0
m_b_4
bcf 0x23,0
goto m_b_11
m_b_5
;****************************************************************************
;****************************************************************************
movlw 0x05
subwf RX_232_BYTESenTRAMA,W
m_b_6
;CALCULAMOS CHECKSUM
;****************************************************************************
;****************************************************************************
sBanco0
movf LOCAL_1,W
addlw BUFFER_RX_MENOS_1
addwf RX_232_BYTESenTRAMA,W
movwf LOCAL_1
movwf FSR
bucle_m_b_6
addwf INDF,W
movwf LOCAL_0
movf LOCAL_1,W
;en LOCAL_0
movwf LOCAL_1
call byte_mayor_que
btfss LOCAL_1,0
goto m_b_6_No_es_mayor_que_200
goto m_b_6_Si_es_mayor_que_200
m_b_6_Si_es_mayor_que_200
subwf LOCAL_0,F
goto m_b_6_seguir
m_b_6_No_es_mayor_que_200
movf LOCAL_0,W
m_b_6_seguir
;*****************************************************************************
;*****************************************************************************
;Vamos a poner en LOCAL_1 la direccion de donde esta el checksum que venia con la trama
sBanco0
movlw BUFFER_RX_MENOS_1
addwf RX_232_BYTESenTRAMA,W
movwf FSR
movf INDF,W
movwf LOCAL_1 ;Ya tenemos en LOCAL_1 el checksum que venia con la
trama
movf LOCAL_1,W
goto m_b_8
m_b_8
sBanco0
subwf BUFFER_RX_1,W
m_b_10
bsf 0x23,3
goto m_b_11
m_b_11
bsf 0x23,2
goto m_b_1
m_b_13
sBanco0
subwf BUFFER_RX_2,W
btfss STATUS,Z
goto m_b_47
; goto m_b_16
m_b_16
bcf 0x23,3
bcf 0x23,0
goto m_b_0
;
*************************************************************************************
*****
;* Hacemos las comparaciones para saber cual es el comando recibido por USART
;
*************************************************************************************
*****
m_b_47
subwf BUFFER_RX_2,W
btfsc STATUS,Z
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_51
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_53
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_55
subwf BUFFER_RX_2,W
btfsc STATUS,Z
;goto m_b_57 ;Vamos a la siguiente comparacion
m_b_57
subwf BUFFER_RX_2,W
btfsc STATUS,Z
;m_b_59
; subwf BUFFER_RX_2,W
; btfsc STATUS,Z
m_b_61
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_63
btfsc STATUS,Z
m_b_65
subwf BUFFER_RX_2,W
btfsc STATUS,Z
;goto m_b_67
m_b_67
subwf BUFFER_RX_2,W
btfsc STATUS,Z
;goto m_b_69
;m_b_69
; subwf BUFFER_RX_2,W
; btfss STATUS,Z
; goto m_b_71
m_b_71
;movlw .39 ;Es el comando .39: Nos pide el contenido de una
posicion RAM
subwf BUFFER_RX_2,W
btfsc STATUS,Z
;goto m_b_73
m_b_73
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_75
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_77
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_79
movlw .3 ;Es el comando .3: Escritura de la configuración de I/O en
FLASH
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_81
subwf BUFFER_RX_2,W
btfsc STATUS,Z
subwf BUFFER_RX_2,W
btfsc STATUS,Z
subwf BUFFER_RX_2,W
btfsc STATUS,Z
subwf BUFFER_RX_2,W
btfsc STATUS,Z
m_b_NO_SE_HA_RECIBIDO_NINGUN_COMANDO_VALIDO
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_50
pPagina3
call Pg3_PonerCPUaSTOP
pPagina0
sBanco0
;;Ponemos en STOP
;sBanco3
;clrf B3_ByteIO_P1_p8
;clrf B3_ByteIO_P9_p16
;clrf B3_ByteIO_P17_p24
;clrf B3_ByteIO_P25_p32
;clrf B3_ByteIO_P33_p40
;bsf PCLATH,3
;call Pg1_EntradasSalidas
;bcf PCLATH,3
;sBanco0
pPagina2
call Pg2_LimpiarTimers
pPagina0
movlw ByteAltoBeginLADDER
movwf PCaPIC_FLASH_H
movlw ByteBajoBeginLADDER
movwf PCaPIC_FLASH_L
movlw .4
;GRABAMOS EN FLASH
clrf GF_CONTADOR_UP
movlw .4
movwf GF_CONTADOR_DOWN
movlw 0x00
movwf LOCAL_0
movlw 0x00
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH
clrf BUFFER_RX_3 ;Tamaño de datos : 0
movwf BUFFER_RX_2
call mandar_trama_a_maestro
goto m_b_16
;******************************************************************************
**
;******************************************************************************
**
m_b_52
sBanco0
movlw 0x30
movwf LOCAL_0
movlw 0x01
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH
;Instruccion 'PILA_LOGICA'
movlw 0x00
movwf LOCAL_0
movlw 0xF8
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH
;Instruccion 'PILA_LOGICA_NIVEL'
movlw 0x00
movwf LOCAL_0
movlw 0xF9
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH
movwf BUFFER_RX_2
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
***
;
*************************************************************************************
***
WriteFD
sBanco0
goto WriteFD_end
movlw 0x17
movwf PCaPIC_FLASH_H
movlw 0x30
addwf 0x2E,W ;En la trama nos dice a partir de que FD escribimos.
movwf PCaPIC_FLASH_L
clrf GF_CONTADOR_UP
movlw .4
movwf GF_CONTADOR_DOWN
;movlw 0x00
;movwf LOCAL_0
;movlw 0x00
;movwf LOCAL_1
;call Mandar14Bits_A_BufferFLASH
;movlw 0x2E
movlw 0x2F
movwf FSR
movwf LOCAL_3
WriteFD_main
; movf INDF,W
sBanco0
movlw 0x34
movwf LOCAL_0
swapf INDF,W
movwf LOCAL_1
incf FSR,F
movf INDF,W
andlw 0x0F
iorwf LOCAL_1,F
;GRABAMOS EN FLASH
;Guardamos FSR
movf FSR,W
movwf LOCAL_2
call Mandar14Bits_A_BufferFLASH
;Restauramos FSR
movf LOCAL_2,W
movwf FSR
bcf STATUS,IRP
incf FSR,F
decfsz LOCAL_3
goto WriteFD_main
WriteFD_end
movwf BUFFER_RX_2
call mandar_trama_a_maestro
;;call CogeConfigIO_DeFLASH_ARAM
goto m_b_16
;
*************************************************************************************
***
;
*************************************************************************************
***
WriteED
;??
pPagina3
call Pg3_PonerCPUaSTOP
call Pg3_WriteED
pPagina0
goto m_b_16
;
*************************************************************************************
***
;
*************************************************************************************
***
ReadED
pPagina3
call Pg3_ReadED
pPagina0
goto m_b_16
;
*************************************************************************************
***
;* Hemos recibido por USART el comando .3: Escritura de la configuración de I/O en FLASH
;
*************************************************************************************
***
m_b_82
sBanco0
goto m_b_82_end
; movlw 0x0E
; movwf PCaPIC_FLASH_H
; movlw 0xF8
; movwf PCaPIC_FLASH_L
movlw 0x17
movwf PCaPIC_FLASH_H
movlw 0xF8
movwf PCaPIC_FLASH_L
clrf GF_CONTADOR_UP
movlw .4
movwf GF_CONTADOR_DOWN
movlw 0x00
movwf LOCAL_0
movlw 0x00
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH
movlw 0x2E
movwf FSR
movwf LOCAL_3
m_b_82_main
; movf INDF,W
sBanco0
movlw 0x34
movwf LOCAL_0
swapf INDF,W
movwf LOCAL_1
incf FSR,F
movf INDF,W
andlw 0x0F
iorwf LOCAL_1,F
;GRABAMOS EN FLASH
;Guardamos FSR
movf FSR,W
movwf LOCAL_2
call Mandar14Bits_A_BufferFLASH
;Restauramos FSR
movf LOCAL_2,W
movwf FSR
bcf STATUS,IRP
incf FSR,F
decfsz LOCAL_3
goto m_b_82_main
m_b_82_end
movwf BUFFER_RX_2
call mandar_trama_a_maestro
call CogeConfigIO_DeFLASH_ARAM
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_54
;****************************************************************************
;****************************************************************************
sBanco0
movf BUFFER_RX_3,W
goto m_b_54_end
movlw 0x2E
movwf FSR
;El primer byte recibido es la secuencia de las tramas tenemos que comprobar
incf FSR,F
decf BUFFER_RX_3,F
goto m_b_54_end
m_b_54_main
movf INDF,W
;****************************************************************************
;* Aqui ponemos lo que queremos hacer con los nibble que recibimos
;****************************************************************************
movwf LOCAL_0
rlf LOCAL_0,F
rlf LOCAL_0,F
rlf LOCAL_0,F
rlf LOCAL_0,F
rlf LOCAL_0,F
rlf LOCAL_7,F
rlf LOCAL_6,F
rlf LOCAL_0,F
rlf LOCAL_7,F
rlf LOCAL_6,F
rlf LOCAL_0,F
rlf LOCAL_7,F
rlf LOCAL_6,F
rlf LOCAL_0,F
rlf LOCAL_7,F
rlf LOCAL_6,F
decfsz 0x6E,F
goto m_b_54_FIN_Nibbles
;****************************************************************************
;* Lo tenemos en B0:LOCAL_6,LOCAL_7
;****************************************************************************
;GRABAMOS EN FLASH
;Guardamos FSR
movf FSR,W
movwf LOCAL_2
sBanco0
movf LOCAL_6,W
movwf LOCAL_0
movf LOCAL_7,W
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH
;Restauramos FSR
movf LOCAL_2,W
movwf FSR
bcf STATUS,IRP
movlw .4
movwf 0x6E
m_b_54_FIN_Nibbles
incf FSR,F
decfsz BUFFER_RX_3,F
goto m_b_54_main
goto m_b_54_end
m_b_54_end
movwf BUFFER_RX_2
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
sBanco0
movwf BUFFER_RX_2
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_58
sBanco0
movlw 0x34
movwf LOCAL_0
movlw 0x7F
movwf LOCAL_1
call Mandar14Bits_A_BufferFLASH_Y_ForzarEscritura
movwf BUFFER_RX_2
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;* Hemos recibido por USART el comando .17: Monitorización de bits
;
*************************************************************************************
*****
m_b_60
sBanco0
btfsc STATUS,Z
goto m_b_60_Fin
movwf FSR
m_b_60_bucle
movf INDF,W
movwf LOCAL_2
incf FSR,F
movf INDF,W
swapf INDF,W
andlw 0xF0
movwf LOCAL_3
incf FSR,F
movf INDF,W
andlw 0x0F
iorwf LOCAL_3,F
;En LOCAL_3 Tenemos el byte del booleano, tenemos que comprobar si es RD250,RD251 para
;pasarlo a SD000,SD001
movlw .250
subwf LOCAL_3,W
btfsc STATUS,Z
goto m_b_60_Es_SD000
;m_b_60_Sera_SD001
movlw .251
subwf LOCAL_3,W
btfsc STATUS,Z
;goto m_b_60_Es_SD001
goto m_b_60_Es_SD001
;m_b_60_Sera_SD002
movlw .252
subwf LOCAL_3,W
btfss STATUS,Z
;goto m_b_60_Es_SD001
m_b_60_Es_SD002
movlw .2
movwf LOCAL_3
bsf LOCAL_2,4
goto m_b_60_NoEs_SD
m_b_60_Es_SD001
movlw .1
movwf LOCAL_3
bsf LOCAL_2,4
goto m_b_60_NoEs_SD
m_b_60_Es_SD000
movlw .0
movwf LOCAL_3
bsf LOCAL_2,4
goto m_b_60_NoEs_SD
m_b_60_NoEs_SD
movwf LOCAL_4
;Funcion DameBooleano
bsf PCLATH,3
call DameBooleano
bcf PCLATH,3
movwf FSR
decf FSR,F
decf FSR,F
btfss LOCAL_2,0
goto m_b_60_EsCero
goto m_b_60_EsUno
m_b_60_EsCero
bcf INDF,3
goto m_b_60_Seguir
m_b_60_EsUno
bsf INDF,3
m_b_60_Seguir
incf FSR,F
incf FSR,F
incf FSR,F
decfsz 0x2E,F
goto m_b_60_bucle
m_b_60_Fin
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;* Hemos recibido por USART el comando .2: Lectura de la configuración de I/O de FLASH
;
*************************************************************************************
*****
m_b_80
sBanco0
movlw 0x17
movwf LOCAL_4
movlw 0xF9
movwf LOCAL_5
;Primero tenemos que comprobar que no excede de un valor para no pasarnos del
movlw .7
movwf LOCAL_1
movwf FSR
m_b_80_Bucle_7_Posiciones
call LeerDeFlash ;Lee de la memoria FLASH apuntada en (LOCAL_4,LOCAL_5) y
deja
swapf LOCAL_6,W
andlw 0x0F
movwf INDF
incf FSR,F
movf LOCAL_6,W
andlw 0x0F
movwf INDF
incf FSR,F
swapf LOCAL_7,W
andlw 0x0F
movwf INDF
incf FSR,F
movf LOCAL_7,W
andlw 0x0F
movwf INDF
incf FSR,F
;Incrementamos la posicion a leer. (LOCAL_4,LOCAL_5)
movf LOCAL_5,W
addlw 1
movwf LOCAL_5
btfsc STATUS,C
incf LOCAL_4,F
decfsz LOCAL_1
goto m_b_80_Bucle_7_Posiciones
movlw .2
movlw .28
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_78
sBanco0
;Vamos a enviar 40 nibbles en la trama, que son 10 posiciones de memoria FLASH
movwf LOCAL_0
swapf LOCAL_0,F
iorwf LOCAL_0,W
movwf LOCAL_4
movwf LOCAL_0
swapf LOCAL_0,F
iorwf LOCAL_0,W
movwf LOCAL_5
;Primero tenemos que comprobar que no excede de un valor para no pasarnos del
movlw .10
movwf LOCAL_1
m_b_78_Bucle_10_Posiciones
swapf LOCAL_6,W
andlw 0x0F
movwf INDF
incf FSR,F
movf LOCAL_6,W
andlw 0x0F
movwf INDF
incf FSR,F
swapf LOCAL_7,W
andlw 0x0F
movwf INDF
incf FSR,F
movf LOCAL_7,W
andlw 0x0F
movwf INDF
incf FSR,F
movf LOCAL_5,W
addlw 1
movwf LOCAL_5
btfsc STATUS,C
incf LOCAL_4,F
decfsz LOCAL_1
goto m_b_78_Bucle_10_Posiciones
movlw .1
movlw .44
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;* Hemos recibido por USART el comando .4: Monitorización de todas las E/S
;
*************************************************************************************
*****
m_b_84
;;Vamos a tener que leer de memoria RAM en banco 3 y enviar por RS232
;;
sBanco0
movlw 0x17 ;En 0x17 tenemos el primer byte del banco 3 a leer
movwf LOCAL_0
movlw 0x2E ;En 0x2E pondremos la primera posicion del buffer Tx-232
movwf LOCAL_1
movwf LOCAL_2
m_b_84_Bucle_21_Posiciones
sBanco0
movf LOCAL_0,W
movwf FSR
movwf FSR
andlw 0x0F
movwf INDF
incf LOCAL_1,F
movwf FSR
andlw 0x0F
movwf INDF
incf LOCAL_1,F
decfsz LOCAL_2
goto m_b_84_Bucle_21_Posiciones
m_b_84_Fin
sBanco0
bcf STATUS,IRP ;Selecciona el banco 0-1 en direccionamiento indirecto
movlw .4
movlw .42
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_76
sBanco0
btfsc STATUS,Z
goto m_b_76_Fin
movwf FSR
m_b_76_bucle
movf INDF,W
movwf LOCAL_2
incf FSR,F
movf INDF,W
swapf INDF,W
andlw 0xF0
movwf LOCAL_3
incf FSR,F
movf INDF,W
andlw 0x0F
iorwf LOCAL_3,F
movwf LOCAL_4
;Funcion DameByte
bsf PCLATH,3
call DameByte
bcf PCLATH,3
movwf FSR
incf FSR,F
movf LOCAL_2,W
movwf LOCAL_0
swapf LOCAL_0,W
andlw 0x0F
movwf INDF
incf FSR,F
movf LOCAL_0,W
andlw 0x0F
movwf INDF
incf FSR,F
decfsz 0x2E,F
goto m_b_76_bucle
m_b_76_Fin
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_62
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
m_b_64
sBanco0
movf 0x2F,W
movwf LOCAL_2
btfss 0x2E,0
goto m_b_64_Poner0
goto m_b_64_Poner1
m_b_64_Poner0
bcf LOCAL_2,3
goto m_b_64_Salir
m_b_64_Poner1
bsf LOCAL_2,3
m_b_64_Salir
movf 0x30,W
andlw 0x0F
movwf LOCAL_3
swapf LOCAL_3,F
movf 0x31,W
andlw 0x0F
iorwf LOCAL_3,F
bsf PCLATH,3
call SetBooleano
bcf PCLATH,3
movlw .12
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;* Hemos recibido por USART el comando .13: Poner CPU a START
;
*************************************************************************************
*****
sBanco0
bsf Bx_SD_2RUN
bsf B0_bPLConRUN
movlw .13
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
pPagina3
call Pg3_PonerCPUaSTOP
pPagina0
sBanco0
;;Ponemos en STOP
;sBanco3
;clrf B3_ByteIO_P1_p8
;clrf B3_ByteIO_P9_p16
;clrf B3_ByteIO_P17_p24
;clrf B3_ByteIO_P25_p32
;clrf B3_ByteIO_P33_p40
;bsf PCLATH,3
;call Pg1_EntradasSalidas
;bcf PCLATH,3
;sBanco0
;bcf B0_bPLConRUN
pPagina2
call Pg2_LimpiarTimers
pPagina0
movlw .14
call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;
*************************************************************************************
*****
;m_b_70
; ;ping-pong
; sBanco0
; call mandar_trama_a_maestro
; goto m_b_16
m_b_70
pPagina3
call Pg3_RespondeTramaVersion
pPagina0
; ;ping-pong
; sBanco0
; movlw .2
; movlw .1
; call mandar_trama_a_maestro
goto m_b_16
;
*************************************************************************************
*****
;* Hemos recibido por USART el comando .12: Nos piden el contenido de una posicion FLASH
;
*************************************************************************************
*****
;m_b_72
; sBanco0
; goto m_b_16
;
*************************************************************************************
*****
;* Hemos recibido por USART el comando .39: Nos piden el contenido de una posicion RAM
;
*************************************************************************************
*****
m_b_74
sBanco0
goto m_b_16
;+++++++++++++++++++++++++++++++++++++++RUTINAS++++++++++++++++++++++++++++++++++++++
++++++++
;++++++++++++++++++++++++++RUTINAS++++++++++++++++++RUTINAS++++++++++++++++++++++++++
++++++++
;+++++++++++++++++++++++RUTINAS+++++RUTINAS++++++++++++++++++++++++++++++++++++++++++
++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RUTINAS++++++++++++++
++++++++
;++++++++++++++++++++++++++++++++++++++++++++RUTINAS+++++++++++++++++++++++++++++++++
++++++++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++RUTINAS+++++++++++++++++++++
++++++++
;++++++RUTINAS++++++RUTINAS++++++++++++++++++++++++++++++++++++++++++RUTINAS+++++++++
++++++++
Pg0_EEPROM
;Esta rutina se ejecuta siempre. (En RUN o STOP) y lo que hace es terminar el
goto Pg0_EEPROM_Salir
sBanco3
btfsc EECON1,WR ;Mientras este bit este a 1 el PIC esta escribiendo en EEPROM
goto Pg0_EEPROM_Salir
sBanco3
movf B3_PunteroUltEEPROM,W
subwf B3_PunteroSigEEPROM,W
btfsc STATUS,C
incf B3_PunteroSigEEPROM,F
;******************************************************************************
**************
; Parametro de entrada:
movf B3_PunteroSigEEPROM,W
addwf B3_DireccionEEPROM,W
sBanco0
movwf LOCAL_0
sBanco3
movf B3_SegundoByteEEPROM,W
sBanco0
movwf LOCAL_1
call Pg0_EscribirEnEEPROM
goto Pg0_EEPROM_Salir
Pg0_EEPROM_Terminar
;sBanco0
;bsf B0_Pre_SD_EE_FREE
bsf Bx_SD_EE_FREE
bcf Bx_EE_EnMarcha
sBanco3
movf B3_PunteroSigEEPROM,W
btfsc STATUS,Z
goto Pg0_EE_Term_1Byte
;goto int_EE_Term_2Byte
Pg0_EE_Term_2Byte
;******************************************************************************
**************
; Parametro de entrada:
movf B3_DireccionEEPROM,W
addlw .1
sBanco0
movwf LOCAL_0
call Pg0_LeerDeEEPROM
sBanco3
subwf B3_SegundoByteEEPROM,W
btfss STATUS,Z
goto Pg0_EE_TermERROR
Pg0_EE_Term_1Byte
;******************************************************************************
**************
; Parametro de entrada:
movf B3_DireccionEEPROM,W
sBanco0
movwf LOCAL_0
call Pg0_LeerDeEEPROM
sBanco3
subwf B3_PrimerByteEEPROM,W
btfss STATUS,Z
goto Pg0_EE_TermERROR
Pg0_EE_TermOK
;Sí es igual
;sBanco0
bsf Bx_SD_EE_WROK
bcf Bx_SD_EE_WRER
goto Pg0_EEPROM_Salir
;goto salir_inter
Pg0_EE_TermERROR
;No es igual
;sBanco0
bcf Bx_SD_EE_WROK
bsf Bx_SD_EE_WRER
Pg0_EEPROM_Salir
sBanco0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg0_ActualizaTimers
sBanco1
movf B1_BT_1,W
movwf B1_DEC_BT_1
movf B1_BT_10,W
movwf B1_DEC_BT_10
movf B1_BT_100,W
movwf B1_DEC_BT_100
movf B1_BT_1000,W
movwf B1_DEC_BT_1000
movwf FSR
Pg0_BucleTimers
btfss INDF,TimControl_ActivacionBT
goto Pg0_BucleTimers_SaltarEsteTimer
;... Ojo: Aqui hay que incrementar FSR una vez para acceder al valor del byte
; del timer
incf FSR,F
movf INDF,W
;btfsc STATUS,Z
;goto Pg0_BucleTimers_Seguir
;El valor del timer es distinto de cero. Vemos para descontar la base de tiempos.
movf INDF,W
btfsc STATUS,Z
goto Pg0_BucleTimers_BT_1mseg
movf INDF,W
andlw 0x18
btfsc STATUS,Z
goto Pg0_BucleTimers_BT_1000mseg
btfss INDF,TimControl_BaseTiempo_BitBajo
goto Pg0_BucleTimers_BT_100mseg
goto Pg0_BucleTimers_BT_10mseg
Pg0_BucleTimers_SaltarEsteTimer
incf FSR,F
goto Pg0_BucleTimers_Seguir
Pg0_BucleTimers_BT_1mseg
movf B1_DEC_BT_1,W
movwf B1_DEC_BT
goto Pg0_BucleTimers_Decrementar
Pg0_BucleTimers_BT_10mseg
movf B1_DEC_BT_10,W
movwf B1_DEC_BT
goto Pg0_BucleTimers_Decrementar
Pg0_BucleTimers_BT_100mseg
movf B1_DEC_BT_100,W
movwf B1_DEC_BT
goto Pg0_BucleTimers_Decrementar
Pg0_BucleTimers_BT_1000mseg
movf B1_DEC_BT_1000,W
movwf B1_DEC_BT
;goto Pg0_BucleTimers_Decrementar
Pg0_BucleTimers_Decrementar
btfsc STATUS,Z
goto Pg0_BucleTimers_ValorIgualQueDescontaje
btfsc STATUS,C
goto Pg0_BucleTimers_ValorMayorQueDescontaje
goto Pg0_BucleTimers_ValorMenorQueDescontaje
Pg0_BucleTimers_ValorMayorQueDescontaje
goto Pg0_BucleTimers_DescontajeHecho
Pg0_BucleTimers_ValorMenorQueDescontaje
Pg0_BucleTimers_ValorIgualQueDescontaje
clrf INDF
Pg0_BucleTimers_DescontajeHecho
movf INDF,W
btfss STATUS,Z
goto Pg0_BucleTimers_Seguir
decf FSR,F
movf INDF,W
btfsc STATUS,Z
goto Pg0_BucleTimers_Ton
movf INDF,W
andlw 0x06
btfsc STATUS,Z
goto Pg0_BucleTimers_TimeDn
btfss INDF,TimControl_TipoTimer_BitBajo
goto Pg0_BucleTimers_TimeUp
goto Pg0_BucleTimers_Toff
Pg0_BucleTimers_Ton
;bsf INDF,TimControl_SalidaTimer
goto Pg0_BucleTimers_FinAccion
Pg0_BucleTimers_Toff
; bcf INDF,TimControl_SalidaTimer
; bcf INDF,TimControl_ActivacionBT
goto Pg0_BucleTimers_FinAccion
Pg0_BucleTimers_TimeUp
Pg0_BucleTimers_TimeDn
bcf INDF,TimControl_SalidaTimer
bcf INDF,TimControl_ActivacionBT
bcf INDF,TimControl_YaEnMarcha
Pg0_BucleTimers_FinAccion
incf FSR,F
Pg0_BucleTimers_Seguir
movlw 0x6F
iorlw 0x80
subwf FSR,W
btfsc STATUS,Z
goto Pg0_BucleTimersEnd ;FSR es >= que 0x6F que es el valor del T24 el ultimo
incf FSR,F
goto Pg0_BucleTimers
Pg0_BucleTimersEnd
movf B1_DEC_BT_1,W
subwf B1_BT_1,F
movf B1_DEC_BT_10,W
subwf B1_BT_10,F
movf B1_DEC_BT_100,W
subwf B1_BT_100,F
movf B1_DEC_BT_1000,W
subwf B1_BT_1000,F
sBanco0
return
SaltoTimers
;
*************************************************************************************
****
;* CogeConfigIO_DeFLASH_ARAM
;
*************************************************************************************
****
CogeConfigIO_DeFLASH_ARAM
pPagina2
;bsf PCLATH,3
sBanco3
call Pg2_Byte_ConfiguracionIO_1
movwf Banco3Reg0x10
call Pg2_Byte_ConfiguracionIO_2
movwf Banco3Reg0x11
call Pg2_Byte_ConfiguracionIO_3
movwf Banco3Reg0x12
call Pg2_Byte_ConfiguracionIO_4
movwf Banco3Reg0x13
call Pg2_Byte_ConfiguracionIO_5
movwf Banco3Reg0x14
call Pg2_Byte_ConfiguracionIO_6
movwf Banco3Reg0x15
call Pg2_Byte_ConfiguracionIO_7
movwf Banco3Reg0x16
;bcf PCLATH,3
pPagina0
sBanco0
movlw 0xFF
movwf AI_YaRealizada1Vez
;bsf bTodasADLeidas
clrf AI_EntradaAnalogLeida
clrf COMUN_PORT_A
clrf COMUN_PORT_B
clrf COMUN_PORT_C
sBanco3
goto _0_EA_End
sBanco1
movlw b'10000110'
movwf ADCON1
goto _x_EA_End
_0_EA_End
goto _1_EA_End
sBanco1
movlw b'10001110'
movwf ADCON1
sBanco0
movwf AI_YaRealizada1Vez
;bcf bTodasADLeidas
goto _x_EA_End
_1_EA_End
sBanco1
movlw b'10000100'
movwf ADCON1
sBanco0
movwf AI_YaRealizada1Vez
;bcf bTodasADLeidas
goto _x_EA_End
_3_EA_End
goto _x_EA_End
sBanco1
movlw b'10000000'
movwf ADCON1
sBanco0
movwf AI_YaRealizada1Vez
;bcf bTodasADLeidas
_x_EA_End
sBanco3
Config_P2
goto P2_EsAnalogica
goto P2_EsAnalogica
goto P2_EsAnalogica
P2_EsDigital
bsf COMUN_PORT_A,0
bcf COMUN_PORT_A,0
goto Config_P3
P2_EsAnalogica
bsf COMUN_PORT_A,0
Config_P3
goto P3_EsAnalogica
goto P3_EsAnalogica
P3_EsDigital
bsf COMUN_PORT_A,1
bcf COMUN_PORT_A,1
goto Config_P4
P3_EsAnalogica
bsf COMUN_PORT_A,1
Config_P4
goto P4_EsAnalogica
P4_EsDigital
bsf COMUN_PORT_A,2
bcf COMUN_PORT_A,2
goto Config_P5
P4_EsAnalogica
bsf COMUN_PORT_A,2
Config_P5
goto P5_EsAnalogica
goto P5_EsAnalogica
P5_EsDigital
bsf COMUN_PORT_A,3
bcf COMUN_PORT_A,3
goto Config_P6
P5_EsAnalogica
bsf COMUN_PORT_A,3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Config_P6
goto P6_EsShutDown
P6_EsDigital
bsf COMUN_PORT_A,4
bcf COMUN_PORT_A,4
goto Config_P7
P6_EsShutDown
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Config_P7
; goto P7_EsAnalogica
P7_EsDigital
bsf COMUN_PORT_A,5
bcf COMUN_PORT_A,5
goto Config_P7_End
P7_EsAnalogica
bsf COMUN_PORT_A,5
Config_P7_End
bsf COMUN_PORT_C,0
bcf COMUN_PORT_C,0
bsf COMUN_PORT_C,1
bcf COMUN_PORT_C,1
bsf COMUN_PORT_C,2
bcf COMUN_PORT_C,2
bsf COMUN_PORT_C,3
bcf COMUN_PORT_C,3
bcf COMUN_PORT_C,4
bsf COMUN_PORT_C,5
bcf COMUN_PORT_C,5
;;TX-232
bcf COMUN_PORT_C,6
;;RX-232
bsf COMUN_PORT_C,7
bsf COMUN_PORT_B,0
bcf COMUN_PORT_B,0
bsf COMUN_PORT_B,1
bcf COMUN_PORT_B,1
bsf COMUN_PORT_B,2
bcf COMUN_PORT_B,2
bsf COMUN_PORT_B,3
bcf COMUN_PORT_B,3
bsf COMUN_PORT_B,4
bcf COMUN_PORT_B,4
bsf COMUN_PORT_B,5
bcf COMUN_PORT_B,5
bsf COMUN_PORT_B,6
bcf COMUN_PORT_B,6
bsf COMUN_PORT_B,7
bcf COMUN_PORT_B,7
sBanco1
movf COMUN_PORT_A,W
movwf TRISA
movf COMUN_PORT_B,W
movwf TRISB
movf COMUN_PORT_C,W
movwf TRISC
btfss bConfigLCD
goto CogeConfigIO_DeFLASH_ARAM_End
sBanco1
clrf TRISB
bcf B1_LCD_RS
bcf B1_LCD_RW
bcf B1_LCD_E
sBanco0
bcf B0_LCD_RS
bcf B0_LCD_RW
bcf B0_LCD_E
CogeConfigIO_DeFLASH_ARAM_End
sBanco0
return
;
*************************************************************************************
****
;
*************************************************************************************
****
byte_mayor_que
movf LOCAL_1,W
subwf LOCAL_0,W
btfsc STATUS,Z
goto m0123_i_no_es_mayor
btfss STATUS,C
goto m0123_i_no_es_mayor
m0123_i_es_mayor
bsf LOCAL_1,0
return
m0123_i_no_es_mayor
bcf LOCAL_1,0
return
;
*************************************************************************************
****
;
*************************************************************************************
****
byte_mayorigual_que
sBanco0
movf LOCAL_1,W
subwf LOCAL_0,W
;Primero comprobamos si son iguales
btfss STATUS,C
goto m123_i_no_es_mayor
m123_i_es_igual
m123_i_es_mayor
bsf LOCAL_1,0
return
m123_i_no_es_mayor
bcf LOCAL_1,0
return
;***************************************************************************
;* chr(3),dirL,dirH,Comando,long.Datos,Dn,Dn-1,...,D0,Checksum,chr(4)
;***************************************************************************
mandar_trama_a_maestro
sBanco0
; bcf STATUS,RP1
movwf LOCAL_4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movwf BUFFER_RX_0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movwf BUFFER_RX_1
movwf FSR
movf BUFFER_RX_3,W
goto m_trama_i2
;****************************************************************************
;****************************************************************************
movf LOCAL_1,W
addlw 0x2E ;Es la dirección de BufferTransmision[0]
movwf LOCAL_1
movwf FSR
m_trama_i1
;Sumamos a Checksum
addwf INDF,W
movwf LOCAL_5
movf LOCAL_1,W
;en LOCAL_5
;*****************************************************************************
;*****************************************************************************
m_trama_i2 ;datos variables ya enviados
;variable
addwf BUFFER_RX_0,W
addwf BUFFER_RX_1,W
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movwf LOCAL_0
movwf LOCAL_1
call byte_mayor_que
btfss LOCAL_1,0
goto m_b_10_No_es_mayor_que_200
movlw 0xC9
subwf LOCAL_5,F
m_b_10_No_es_mayor_que_200
movf LOCAL_5,W
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Enviamos el caracter de checksum
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movwf BUFFER_TX_LAST
; bcf STATUS,RP1
sBanco0
movwf FSR
movlw BUFFER_RX_0
movwf BUFFER_TX_NEXT
bsf 0x23,7
movlw .203
movwf TXREG
sBanco1
bsf PIE1,TXIE
sBanco0
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Mandar14Bits_A_BufferFLASH
; en flash.
; Parametro de entrada:
Mandar14Bits_A_BufferFLASH
sBanco1
movlw GF_0
addwf GF_CONTADOR_UP,W
iorlw 0x80
movwf FSR
bcf STATUS,RP0 ;Banco 0
movf LOCAL_0,W
movwf INDF
incf FSR,F
movf LOCAL_1,W
movwf INDF
incf GF_CONTADOR_UP,F
incf GF_CONTADOR_UP,F
decfsz GF_CONTADOR_DOWN,F
goto Mandar14Bits_A_BufferFLASH_seguir
movf PCaPIC_FLASH_H,W
movf PCaPIC_FLASH_L,W
call GrabarEnFlash
movlw .4
addwf PCaPIC_FLASH_L,F
btfsc STATUS,C
incf PCaPIC_FLASH_H,F
bsf STATUS,RP0 ;Banco 1
clrf GF_CONTADOR_UP
movlw .4
movwf GF_CONTADOR_DOWN
Mandar14Bits_A_BufferFLASH_seguir
sBanco0
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Mandar14Bits_A_BufferFLASH_Y_ForzarEscritura
; en flash.
; Parametro de entrada:
;
Mandar14Bits_A_BufferFLASH_Y_ForzarEscritura
sBanco1
; bcf STATUS,RP1
movlw GF_0
addwf GF_CONTADOR_UP,W
iorlw 0x80
movwf FSR
movf LOCAL_0,W
movwf INDF
incf FSR,F
movf LOCAL_1,W
movwf INDF
movf PCaPIC_FLASH_H,W
movf PCaPIC_FLASH_L,W
call GrabarEnFlash
movlw .4
addwf PCaPIC_FLASH_L,F
btfsc STATUS,C
incf PCaPIC_FLASH_H,F
clrf GF_CONTADOR_UP
movlw .4
movwf GF_CONTADOR_DOWN
sBanco0
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
GrabarEnFlash
;Para PIC16F876A
sBanco0
movf LOCAL_0,W
movwf EEADRH
bcf STATUS,RP1 ;Banco 0
movf LOCAL_1,W
movwf EEADR
bcf STATUS,IRP
iorlw 0x80
movwf FSR
GrabarEnFlash_Loop
movf INDF,W
movwf EEDATH
incf FSR,F
movf INDF,W
movwf EEDATA
incf FSR,F
bsf EECON1,EEPGD
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
nop
nop
bcf EECON1,WREN
bsf INTCON,GIE
movf EEADR,W
andlw 0x03
xorlw 0x03
btfsc STATUS,Z
goto GrabarEnFlash_Ssalir
incf EEADR,F
goto GrabarEnFlash_Loop
GrabarEnFlash_Ssalir
sBanco0
; bcf STATUS,RP0
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Saltamos al ciclo de SCAN
;CicloScan
; movlw ByteAltoBeginLADDER
; movwf PCLATH
; movlw ByteBajoBeginLADDER
; movwf PCL
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
; Banco 0:
; Parametro de salida:
; Banco 0:
LeerDeFlash
bcf STATUS,RP1
movf LOCAL_4,W
bsf STATUS,RP1
movwf EEADRH
bcf STATUS,RP1
movf LOCAL_5,W
bsf STATUS,RP1
movwf EEADR
bsf STATUS,RP1
nop
nop
bsf STATUS,RP1
movf EEDATH,W
bcf STATUS,RP1
movwf LOCAL_6
bsf STATUS,RP1
movf EEDATA,W
bcf STATUS,RP1
movwf LOCAL_7
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg0_EscribirEnEEPROM
sBanco3
btfsc EECON1,WR
sBanco0
movwf EEADR
movf LOCAL_1,W
movwf EEDATA
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
sBanco0
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg0_LeerDeEEPROM
sBanco0
movwf EEADR
movf EEDATA,W
;Para PIC16F876A
sBanco0
movf LOCAL_0,W
movwf EEADRH
movf LOCAL_1,W
movwf EEADR
bcf STATUS,IRP
iorlw 0x80
movwf FSR
GrabarEnEEPROM_Loop
movf INDF,W
movwf EEDATH
incf FSR,F
movf INDF,W
movwf EEDATA
incf FSR,F
bsf EECON1,EEPGD
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
nop
nop
bcf EECON1,WREN
bsf INTCON,GIE
movf EEADR,W
andlw 0x03
xorlw 0x03
btfsc STATUS,Z
goto GrabarEnFlash_Ssalir
incf EEADR,F
goto GrabarEnFlash_Loop
GrabarEnEEPROM_Ssalir
sBanco0
return
fDOWN
goto fDOWN_SO
PREPARA_OPER
goto PREPARA_OPER_SO
DIV_TD3
goto fDIV_INT8U_SO
DIV_TD4
bsf PCLATH,3 ;Nos vamos a la página FLASH 1
goto fDIV_INT8S_SO
DIV_TD5
goto fDIV_INT16U_SO
DIV_TD6
goto fDIV_INT16S_SO
;DIV_TD7
fPUT_EE
goto fPUT_EE_SO
;DIV_TD8
; goto default
fGET_EE
goto Pg2_fGET_EE_SO
;DIV_TD9
; goto default
fNOP
goto default
MUL_TD3
goto fMUL_INT8U_SO
MUL_TD4
goto fMUL_INT8S_SO
MUL_TD5
goto fMUL_INT16U_SO
MUL_TD6
goto fMUL_INT16S_SO
;MUL_TD7
fCONV_INT8U_2_INT16U
goto Pg2_Conv8U_16U_SO
;MUL_TD8
fCONV_INT8S_2_INT16S
goto Pg2_Conv8S_16S_SO
;MUL_TD9
; goto default
fCONV_INT16U_2_INT32U_Disponible
goto default
;ASIGNAR_TD0_DISPONIBLE
; goto default
fCONV_INT16S_2_INT32S_Disponible
goto default
;ASIGNAR_TD1_DISPONIBLE
; goto default
fGET_EE_BYTE_DISPONIBLE
goto default
fGET_EE_WORD_DISPONIBLE
goto default
;ASIGNAR_TD2_DISPONIBLE
; goto default
fINTLCD_TD3
goto Pg2_fINT8uLCD_SO
fINTLCD_TD4
goto Pg2_fINT8sLCD_SO
;;Primitiva del S.O.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fINTLCD_TD5
goto Pg2_fINT16uLCD_SO
fINTLCD_TD6
goto Pg2_fINT16sLCD_SO
fCHRLCD
goto Pg2_fCHRLCD_SO
fSTRLCD
goto Pg2_fSTRLCD_SO
fGET_EE_DWORD_DISPONIBLE
goto default
;ASIGNAR_TD9_DISPONIBLE
; goto default
;;Primitiva del S.O.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fGET_EE_INT8U_DISPONIBLE
goto default
;MOVER_TD0_DISPONIBLE
; goto default
fGET_EE_INT8S_DISPONIBLE
goto default
;MOVER_TD1_DISPONIBLE
; goto default
fGET_EE_INT16U_DISPONIBLE
goto default
;MOVER_TD2_DISPONIBLE
; goto default
fGET_EE_INT16S_DISPONIBLE
goto default
;MOVER_TD3_DISPONIBLE
; goto default
MOVER_TD4_DISPONIBLE
goto default
fSCL
goto Pg2_fSCL_SO
fFILL
goto fFILL_SO
fMOVI
goto fMOVI_SO
fMOV
goto fMOV_SO
fCOPY
goto fCOPY_SO
fUP
goto fUP_SO
fTOGGLE
goto fTOGGLE_SO
fRESETCF
goto fRESETCF_SO
fSETCF
goto fSETCF_SO
fRESET
bsf PCLATH,3 ;Nos vamos a la página FLASH 1
goto fRESET_SO
fSET
goto fSET_SO
ROR_TB4
goto ROR_TBx_SO
ROR_TB2
goto ROR_TBx_SO
ROR_TB1
goto ROR_TBx_SO
ROL_TB4
goto ROL_TBx_SO
;;Primitiva del S.O.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ROL_TB2
goto ROL_TBx_SO
ROL_TB1
goto ROL_TBx_SO
COMPL_TB4
goto COMPL_TBx_SO
COMPL_TB2
goto COMPL_TBx_SO
COMPL_TB1
goto COMPL_TBx_SO
goto MENOSMENOS_TDx_SO
MENOSMENOS_TD4
goto MENOSMENOS_TDx_SO
MENOSMENOS_TD5
goto MENOSMENOS_TDx_SO
MENOSMENOS_TD6
goto MENOSMENOS_TDx_SO
MENOSMENOS_TD7
goto MENOSMENOS_TDx_SO
MENOSMENOS_TD8
goto MENOSMENOS_TDx_SO
;MENOSMENOS_TD9
; goto default
fREFLCD
goto Pg2_fREFLCD_SO
MASMAS_TD3
goto MASMAS_TDx_SO
MASMAS_TD4
goto MASMAS_TDx_SO
MASMAS_TD5
goto MASMAS_TDx_SO
MASMAS_TD6
goto MASMAS_TDx_SO
MASMAS_TD7
goto MASMAS_TDx_SO
MASMAS_TD8
goto MASMAS_TDx_SO
;MASMAS_TD9
; goto MASMAS_TDx_SO
fTDN
goto Pg2_fTDN_SO
SUMA_TD3
goto SUMA_TB1_SO
SUMA_TD4
goto SUMA_TB1_SO
SUMA_TD5
goto SUMA_TB1_SO
SUMA_TD6
goto SUMA_TB1_SO
SUMA_TD7
goto SUMA_TB1_SO
SUMA_TD8
goto SUMA_TB1_SO
;SUMA_TD9
; goto default
fTUP
goto Pg2_fTUP_SO
RESTA_TD3
goto RESTA_TB1_SO
RESTA_TD4
goto RESTA_TB1_SO
RESTA_TD5
goto RESTA_TB1_SO
RESTA_TD6
goto RESTA_TB1_SO
RESTA_TD7
goto RESTA_TB1_SO
RESTA_TD8
goto RESTA_TB1_SO
;;Primitiva del S.O.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RESTA_TD9
; goto default
fTOFF
goto Pg2_fTOFF_SO
CMP_TD3
goto fCMP_INT8U_SO
CMP_TD4
goto fCMP_INT8S_SO
CMP_TD5
goto fCMP_INT16U_SO
CMP_TD6
goto fCMP_INT16S_SO
;;Primitiva del S.O.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CMP_TD7
goto fCMP_INT32U_SO
CMP_TD8
goto fCMP_INT32S_SO
;CMP_TD9
fTON
goto Pg2_fTON_SO
EQ_TB4
goto fEQUAL_SO
EQ_TB2
goto fEQUAL_SO
goto fEQUAL_SO
XOR_TB4
goto XOR_TBx_SO
XOR_TB2
goto XOR_TBx_SO
XOR_TB1
goto XOR_TBx_SO
OR_TB4
goto OR_TB4_SO
OR_TB2
OR_TB1
goto OR_TB1_SO
AND_TB4
goto AND_TBx_SO
AND_TB2
goto AND_TBx_SO
AND_TB1
goto AND_TBx_SO
CierraO
clrf STATUS ;Necesario porque vamos a acceder a
B0:LOCAL_O
movf PILA_LOGICA,W
andwf PILA_LOGICA_NIVEL,W
movwf LOCAL_0
bcf STATUS,C
rrf LOCAL_0,W
iorwf PILA_LOGICA,F
bcf STATUS,C
rrf PILA_LOGICA_NIVEL,F
movf PILA_LOGICA_NIVEL,W
andwf PILA_LOGICA,W
bcf ESTADO_LOGICO_PARA_OL
btfss STATUS,Z
bsf ESTADO_LOGICO_PARA_OL
return
CierraU
comf PILA_LOGICA_NIVEL,W
iorwf PILA_LOGICA,W
movwf LOCAL_0
bsf STATUS,C
rrf LOCAL_0,W
andwf PILA_LOGICA,F
bcf STATUS,C
rrf PILA_LOGICA_NIVEL,F
movf PILA_LOGICA_NIVEL,W
andwf PILA_LOGICA,W
bcf ESTADO_LOGICO_PARA_OL
btfss STATUS,Z
bsf ESTADO_LOGICO_PARA_OL
return
AbreU
AbreO
bcf STATUS,C
rlf PILA_LOGICA_NIVEL,F
movf PILA_LOGICA_NIVEL,W
iorwf PILA_LOGICA,F
return
btfss ESTADO_LOGICO_DE_OL
movf PILA_LOGICA_NIVEL,W
andwf PILA_LOGICA,W
bcf ESTADO_LOGICO_PARA_OL
btfss STATUS,Z
bsf ESTADO_LOGICO_PARA_OL
return
MasMasB
movwf FSR
incf INDF,F
return
btfsc ESTADO_LOGICO_DE_OL
movf PILA_LOGICA_NIVEL,W
andwf PILA_LOGICA,W
bcf ESTADO_LOGICO_PARA_OL
btfss STATUS,Z
bsf ESTADO_LOGICO_PARA_OL
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;FSR se utiliza como puntero para acceder a la RD, hay que asegurarse de que
;Utiliza B0:Local_0
;Utiliza B0:Local_1
Pg1_EsFSR_unRDValido
sBanco0
movf FSR,W
movwf LOCAL_0
movwf LOCAL_1
pPagina0
call byte_mayor_que
pPagina1
btfsc LOCAL_1,0
goto Pg1_EsFSR_unRDValido_INVALIDO
Pg1_EsFSR_unRDValido_VALIDO
bcf STATUS,Z
return
Pg1_EsFSR_unRDValido_INVALIDO
bsf STATUS,Z
return
LCD_DELAY:
sBanco1
clrwdt
movlw .10
movwf B1_LOCAL0_LCD
clrf B1_LOCAL1_LCD
;movwf LOCAL_1
;clrf LOCAL_2
LCD_DELAY_1:
decfsz B1_LOCAL1_LCD,F
goto LCD_DELAY_1
decfsz B1_LOCAL0_LCD,F
goto LCD_DELAY_1
sBanco0
return
Pg1_PedirBusyFlag
sBanco0
bcf B0_LCD_RS
bsf B0_LCD_RW
sBanco1
movlw H'FF'
sBanco0
bsf B0_LCD_E
sBanco1
bsf B1_bEsperandoBusyFlag
clrf B1_cEsperandoBusyFlag
sBanco0
nop
return
LCD_E
bsf B0_LCD_E
nop
bcf B0_LCD_E
movlw .14
;movwf LOCAL_1
sBanco1
movwf B1_LOCAL1_LCD
LCD_E_1
sBanco0
return
EnviarSiguienteA_LCD
sBanco1
btfss B1_bEnviandoIniLCD
goto EnviarSiguienteALCD_EndComando
btfsc B1_bIniLCDPaso1
goto IniLCDPaso1
btfsc B1_bIniLCDPaso2
goto IniLCDPaso2
btfsc B1_bIniLCDPaso3
goto IniLCDPaso3
btfsc B1_bIniLCDPaso4
goto IniLCDPaso4
goto EnviarSiguienteALCD_EndComando
IniLCDPaso1
bcf B1_bIniLCDPaso1
bsf B1_bIniLCDPaso2
call LCD_CMD
call Pg1_PedirBusyFlag
goto EnviarSiguienteALCD_EndComando
IniLCDPaso2
bcf B1_bIniLCDPaso2
bsf B1_bIniLCDPaso3
call Pg1_PedirBusyFlag
goto EnviarSiguienteALCD_EndComando
IniLCDPaso3
bcf B1_bIniLCDPaso3
bsf B1_bIniLCDPaso4
movlw 0x82
call LCD_CMD
call Pg1_PedirBusyFlag
goto EnviarSiguienteALCD_EndComando
IniLCDPaso4
bcf B1_bIniLCDPaso4
bcf B1_bEnviandoIniLCD
bcf B1_bBusyLCD
bsf B1_bIniLCDOK
; call LCD_CMD
;movlw '@'
call LCD_DATA
; call Pg1_PedirBusyFlag
goto EnviarSiguienteALCD_EndComando
EnviarSiguienteALCD_EndComando
sBanco1
btfss B1_bEnviandoDatosLCD
goto EnviarSiguienteALCD_EndDatos
btfss B1_bEnviar1LineaLCD
goto DatosLCDEnviar
DatosLCDLinea1
clrf B1_cCursorLCD
bcf B1_bEnviar1LineaLCD
movlw 0x80
call LCD_CMD
call Pg1_PedirBusyFlag
goto EnviarSiguienteALCD_EndDatos
DatosLCDEnviar
sBanco1
movf B1_cCursorLCD,W
;sublw .40
sublw .32
btfss STATUS,Z
goto cCursorNo40
bsf B1_bDatosLCDOK
bcf B1_bBusyLCD
bcf B1_bEnviandoDatosLCD
goto EnviarSiguienteALCD_EndDatos
cCursorNo40
movf B1_cCursorLCD,W
;sublw .20
sublw .16
btfss STATUS,Z
goto DatosLCDEnviarBuffer
btfss B1_bEnviar2LineaLCD
goto DatosLCDEnviarBuffer
Enviar2LineaLCDSi
bcf B1_bEnviar2LineaLCD
movlw 0xA8
call LCD_CMD
call Pg1_PedirBusyFlag
goto EnviarSiguienteALCD_EndDatos
DatosLCDEnviarBuffer
;principio y al final.
sBanco1
movf B1_cCursorLCD,W
addlw B1_IniBufferLCD
iorlw 0x80
movwf FSR
movf INDF,W
call LCD_DATA
sBanco1
incf B1_cCursorLCD,F
call Pg1_PedirBusyFlag
EnviarSiguienteALCD_EndDatos
EnviarSiguienteALCD_End
sBanco0
return
Pg1_Refresh_LCD
sBanco3
btfss bConfigLCD
goto Pg1_Refresh_LCD_End
sBanco1
btfsc B1_bBusyLCD
goto Pg1_Refresh_LCD_End
bsf B1_bBusyLCD
bsf B1_bEnviandoDatosLCD
call Pg1_PedirBusyFlag
sBanco1
bcf B1_bDatosLCDOK
bcf B1_bErrorLCD
bsf B1_bEnviar1LineaLCD
bsf B1_bEnviar2LineaLCD
Pg1_Refresh_LCD_End
sBanco0
return
LCD_DATA
sBanco1
clrf TRISB
sBanco0
bcf B0_LCD_E
bsf B0_LCD_RS
bcf B0_LCD_RW
;call DarleVueltaAByte
bsf B0_LCD_RS
LCD_CMD
sBanco1
clrf TRISB
sBanco0
bcf B0_LCD_E
bcf B0_LCD_RS
bcf B0_LCD_RW
;call DarleVueltaAByte
bcf B0_LCD_RS
Inicializa_LCD_
sBanco1
btfss B1_bEnviarIniLCD
goto Inicializa_LCD_End
bsf B1_bBusyLCD
bcf B1_bErrorLCD
bcf B1_bIniLCDOK
bcf B1_bEnviarIniLCD
bcf B1_bEnviandoDatosLCD
call IniLCDPaso0
call Pg1_PedirBusyFlag
sBanco1
bsf B1_bEnviandoIniLCD
bsf B1_bIniLCDPaso1
Inicializa_LCD_End
sBanco0
return
IniLCDPaso0
movlw .3
sBanco1
movwf B1_LOCAL1_LCD
IniLCDPaso0_Loop
sBanco1
sBanco0
bcf B0_LCD_E
bcf B0_LCD_RS
bcf B0_LCD_RW
movlw 0x38
;call DarleVueltaAByte
movwf PORTB
bsf B0_LCD_E
nop
nop
nop
nop
bcf B0_LCD_E
nop
nop
nop
nop
sBanco1
clrf B1_cDelayIniLCD
IniLCDPaso0_Espera
movf B1_cDelayIniLCD,W
btfsc STATUS,C
goto IniLCDPaso0_Espera
decfsz B1_LOCAL1_LCD,F
goto IniLCDPaso0_Loop
sBanco0
return
ActivaAD
call Espera
call Espera
call Espera
call Espera
call Espera
bsf ADCON0,2
return
Espera
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
return
;
*************************************************************************************
****
;* EntradasSalidas
;
*************************************************************************************
****
Pg1_EntradasSalidas
sBanco0
movf PORTA,W
movwf COMUN_PORT_A
movf PORTB,W
movwf COMUN_PORT_B
movf PORTC,W
movwf COMUN_PORT_C
sBanco3
goto P2_Salir
goto P2_Salir
goto P2_Salir
P2_ComoDIO2
goto P2_ComoDO
P2_ComoDI
bsf P2_Valor
btfss COMUN_PORT_A,0
bcf P2_Valor
goto P2_Salir
P2_ComoDO
bsf COMUN_PORT_A,0
btfss P2_Valor
bcf COMUN_PORT_A,0
sBanco0
btfss COMUN_PORT_A,0
goto PORTA0_a0
PORTA0_a1
bsf PORTA,0
goto PORTA0_end
PORTA0_a0
bcf PORTA,0
PORTA0_end
P2_Salir
sBanco3
goto P3_Salir
goto P3_Salir
P3_ComoDIO3
goto P3_ComoDO
P3_ComoDI
bsf P3_Valor
btfss COMUN_PORT_A,1
bcf P3_Valor
goto P3_Salir
P3_ComoDO
bsf COMUN_PORT_A,1
btfss P3_Valor
bcf COMUN_PORT_A,1
sBanco0
btfss COMUN_PORT_A,1
goto PORTA1_a0
PORTA1_a1
bsf PORTA,1
goto PORTA1_end
PORTA1_a0
bcf PORTA,1
PORTA1_end
P3_Salir
sBanco3
goto P4_Salir
P4_ComoDIO4
goto P4_ComoDO
P4_ComoDI
bsf P4_Valor
btfss COMUN_PORT_A,2
bcf P4_Valor
goto P4_Salir
P4_ComoDO
bsf COMUN_PORT_A,2
btfss P4_Valor
bcf COMUN_PORT_A,2
sBanco0
btfss COMUN_PORT_A,2
goto PORTA2_a0
PORTA2_a1
bsf PORTA,2
goto PORTA2_end
PORTA2_a0
bcf PORTA,2
PORTA2_end
P4_Salir
sBanco3
goto P5_Salir
goto P5_Salir
P5_ComoDIO5
goto P5_ComoDO
P5_ComoDI
bsf P5_Valor
btfss COMUN_PORT_A,3
bcf P5_Valor
goto P5_Salir
P5_ComoDO
bsf COMUN_PORT_A,3
btfss P5_Valor
bcf COMUN_PORT_A,3
sBanco0
btfss COMUN_PORT_A,3
goto PORTA3_a0
PORTA3_a1
bsf PORTA,3
goto PORTA3_end
PORTA3_a0
bcf PORTA,3
PORTA3_end
P5_Salir
sBanco3
goto P6_ComoDO
P6_ComoDI
bsf P6_Valor
btfss COMUN_PORT_A,4
bcf P6_Valor
goto P6_Salir
P6_ComoDO
bsf COMUN_PORT_A,4
btfss P6_Valor
bcf COMUN_PORT_A,4
sBanco0
btfss COMUN_PORT_A,4
goto PORTA4_a0
PORTA4_a1
bsf PORTA,4
goto PORTA4_end
PORTA4_a0
bcf PORTA,4
PORTA4_end
P6_Salir
sBanco3
;goto P7_Salir
goto P7_Salir
P7_ComoDIO7
P7_ComoDI
bsf P7_Valor
btfss COMUN_PORT_A,5
bcf P7_Valor
goto P7_Salir
P7_ComoDO
bsf COMUN_PORT_A,5
btfss P7_Valor
bcf COMUN_PORT_A,5
sBanco0
btfss COMUN_PORT_A,5
goto PORTA5_a0
PORTA5_a1
bsf PORTA,5
goto PORTA5_end
PORTA5_a0
bcf PORTA,5
PORTA5_end
P7_Salir
sBanco3
goto P11_ComoDO
P11_ComoDI
bsf P11_Valor
btfss COMUN_PORT_C,0
bcf P11_Valor
goto P11_Salir
P11_ComoDO
bsf COMUN_PORT_C,0
btfss P11_Valor
bcf COMUN_PORT_C,0
sBanco0
btfss COMUN_PORT_C,0
goto PORTC0_a0
PORTC0_a1
bsf PORTC,0
goto PORTC0_end
PORTC0_a0
bcf PORTC,0
PORTC0_end
P11_Salir
sBanco3
goto P12_Salir
goto P12_ComoDO
P12_ComoDI
bsf P12_Valor
btfss COMUN_PORT_C,1
bcf P12_Valor
goto P12_Salir
P12_ComoDO
bsf COMUN_PORT_C,1
btfss P12_Valor
bcf COMUN_PORT_C,1
sBanco0
btfss COMUN_PORT_C,1
goto PORTC1_a0
PORTC1_a1
bsf PORTC,1
goto PORTC1_end
PORTC1_a0
bcf PORTC,1
PORTC1_end
P12_Salir
sBanco3
goto P13_Salir
goto P13_ComoDO
P13_ComoDI
bsf P13_Valor
btfss COMUN_PORT_C,2
bcf P13_Valor
goto P13_Salir
P13_ComoDO
bsf COMUN_PORT_C,2
btfss P13_Valor
bcf COMUN_PORT_C,2
sBanco0
btfss COMUN_PORT_C,2
goto PORTC2_a0
PORTC2_a1
bsf PORTC,2
goto PORTC2_end
PORTC2_a0
bcf PORTC,2
PORTC2_end
P13_Salir
sBanco3
goto P14_Salir
P14_ComoDIO14
goto P14_ComoDO
P14_ComoDI
bsf P14_Valor
btfss COMUN_PORT_C,3
bcf P14_Valor
goto P14_Salir
P14_ComoDO
bsf COMUN_PORT_C,3
btfss P14_Valor
bcf COMUN_PORT_C,3
sBanco0
btfss COMUN_PORT_C,3
goto PORTC3_a0
PORTC3_a1
bsf PORTC,3
goto PORTC3_end
PORTC3_a0
bcf PORTC,3
PORTC3_end
P14_Salir
sBanco3
goto P15_Salir
P15_ComoDIO15
goto P15_ComoDO
P15_ComoDI
bsf P15_Valor
btfss COMUN_PORT_C,4
bcf P15_Valor
goto P15_Salir
P15_ComoDO
bsf COMUN_PORT_C,4
btfss P15_Valor
bcf COMUN_PORT_C,4
sBanco0
btfss COMUN_PORT_C,4
goto PORTC4_a0
PORTC4_a1
bsf PORTC,4
goto PORTC4_end
PORTC4_a0
bcf PORTC,4
PORTC4_end
P15_Salir
sBanco3
goto P16_Salir
goto P16_ComoDO
P16_ComoDI
bsf P16_Valor
btfss COMUN_PORT_C,5
bcf P16_Valor
goto P16_Salir
P16_ComoDO
bsf COMUN_PORT_C,5
btfss P16_Valor
bcf COMUN_PORT_C,5
sBanco0
btfss COMUN_PORT_C,5
goto PORTC5_a0
PORTC5_a1
bsf PORTC,5
goto PORTC5_end
PORTC5_a0
bcf PORTC,5
PORTC5_end
P16_Salir
sBanco3
goto P21_Salir
P21_ComoDIO21
goto P21_ComoDO
P21_ComoDI
bsf P21_Valor
btfss COMUN_PORT_B,0
bcf P21_Valor
goto P21_Salir
P21_ComoDO
bsf COMUN_PORT_B,0
btfss P21_Valor
bcf COMUN_PORT_B,0
sBanco0
btfss COMUN_PORT_B,0
goto PORTB0_a0
PORTB0_a1
bsf PORTB,0
goto PORTB0_end
PORTB0_a0
bcf PORTB,0
PORTB0_end
P21_Salir
sBanco3
goto P22_Salir
P22_ComoDIO22
goto P22_ComoDO
P22_ComoDI
bsf P22_Valor
btfss COMUN_PORT_B,1
bcf P22_Valor
goto P22_Salir
P22_ComoDO
bsf COMUN_PORT_B,1
btfss P22_Valor
bcf COMUN_PORT_B,1
sBanco0
btfss COMUN_PORT_B,1
goto PORTB1_a0
PORTB1_a1
bsf PORTB,1
goto PORTB1_end
PORTB1_a0
bcf PORTB,1
PORTB1_end
P22_Salir
sBanco3
goto P23_Salir
P23_ComoDIO23
goto P23_ComoDO
P23_ComoDI
bsf P23_Valor
btfss COMUN_PORT_B,2
bcf P23_Valor
goto P23_Salir
P23_ComoDO
bsf COMUN_PORT_B,2
btfss P23_Valor
bcf COMUN_PORT_B,2
sBanco0
btfss COMUN_PORT_B,2
goto PORTB2_a0
PORTB2_a1
bsf PORTB,2
goto PORTB2_end
PORTB2_a0
bcf PORTB,2
PORTB2_end
P23_Salir
sBanco3
goto P24_Salir
P24_ComoDIO24
goto P24_ComoDO
P24_ComoDI
bsf P24_Valor
btfss COMUN_PORT_B,3
bcf P24_Valor
goto P24_Salir
P24_ComoDO
bsf COMUN_PORT_B,3
btfss P24_Valor
bcf COMUN_PORT_B,3
sBanco0
btfss COMUN_PORT_B,3
goto PORTB3_a0
PORTB3_a1
bsf PORTB,3
goto PORTB3_end
PORTB3_a0
bcf PORTB,3
PORTB3_end
P24_Salir
sBanco3
goto P25_Salir
P25_ComoDIO25
goto P25_ComoDO
P25_ComoDI
bsf P25_Valor
btfss COMUN_PORT_B,4
bcf P25_Valor
goto P25_Salir
P25_ComoDO
bsf COMUN_PORT_B,4
btfss P25_Valor
bcf COMUN_PORT_B,4
sBanco0
btfss COMUN_PORT_B,4
goto PORTB4_a0
PORTB4_a1
bsf PORTB,4
goto PORTB4_end
PORTB4_a0
bcf PORTB,4
PORTB4_end
P25_Salir
sBanco3
goto P26_Salir
P26_ComoDIO26
goto P26_ComoDO
P26_ComoDI
bsf P26_Valor
btfss COMUN_PORT_B,5
bcf P26_Valor
goto P26_Salir
P26_ComoDO
bsf COMUN_PORT_B,5
btfss P26_Valor
bcf COMUN_PORT_B,5
sBanco0
btfss COMUN_PORT_B,5
goto PORTB5_a0
PORTB5_a1
bsf PORTB,5
goto PORTB5_end
PORTB5_a0
bcf PORTB,5
PORTB5_end
P26_Salir
sBanco3
goto P27_Salir
P27_ComoDIO27
goto P27_ComoDO
P27_ComoDI
bsf P27_Valor
btfss COMUN_PORT_B,6
bcf P27_Valor
goto P27_Salir
P27_ComoDO
bsf COMUN_PORT_B,6
btfss P27_Valor
bcf COMUN_PORT_B,6
sBanco0
btfss COMUN_PORT_B,6
goto PORTB6_a0
PORTB6_a1
bsf PORTB,6
goto PORTB6_end
PORTB6_a0
bcf PORTB,6
PORTB6_end
P27_Salir
sBanco3
goto P28_Salir
P28_ComoDIO28
goto P28_ComoDO
P28_ComoDI
bsf P28_Valor
btfss COMUN_PORT_B,7
bcf P28_Valor
goto P28_Salir
P28_ComoDO
bsf COMUN_PORT_B,7
btfss P28_Valor
bcf COMUN_PORT_B,7
sBanco0
btfss COMUN_PORT_B,7
goto PORTB7_a0
PORTB7_a1
bsf PORTB,7
goto PORTB7_end
PORTB7_a0
bcf PORTB,7
PORTB7_end
P28_Salir
LeyendoEA
sBanco3
goto LeyendoEA_End
sBanco0
btfsc ADCON0,2
goto LeyendoEA_End
call OrdenProximoAD
LeyendoEA_End
sBanco0
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;+ RUTINA: OrdenProximoAD
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
OrdenProximoAD
sBanco3
goto OrdenProximoAD_End
sBanco0
movf AI_EntradaAnalogLeida,W
btfsc STATUS,Z
goto OrdenProximoAD_Launch1AI
OrdenProximoAD_Config1_
sBanco3
goto OrdenProximoAD_Config3_
goto OrdenProximoAD_Launch1AI
OrdenProximoAD_Config3_
sBanco3
goto OrdenProximoAD_Config5_
;;;;;
;;;;;
sBanco0
btfsc AI_EntradaAnalogLeida,0
goto OrdenProximoAD_Launch2AI
btfsc AI_EntradaAnalogLeida,1
goto OrdenProximoAD_Launch4AI
btfsc AI_EntradaAnalogLeida,3
goto OrdenProximoAD_Launch1AI
goto OrdenProximoAD_Launch1AI
OrdenProximoAD_Config5_
sBanco3
goto OrdenProximoAD_End
;;;;;
;;;;;
sBanco0
btfsc AI_EntradaAnalogLeida,0
goto OrdenProximoAD_Launch2AI
btfsc AI_EntradaAnalogLeida,1
goto OrdenProximoAD_Launch3AI
btfsc AI_EntradaAnalogLeida,2
goto OrdenProximoAD_Launch4AI
btfsc AI_EntradaAnalogLeida,3
goto OrdenProximoAD_Launch5AI
btfsc AI_EntradaAnalogLeida,4
goto OrdenProximoAD_Launch1AI
OrdenProximoAD_Launch1AI
sBanco0
clrf AI_EntradaAnalogLeida
bsf AI_EntradaAnalogLeida,0
movwf ADCON0
call ActivaAD
goto OrdenProximoAD_End
OrdenProximoAD_Launch2AI
sBanco0
clrf AI_EntradaAnalogLeida
bsf AI_EntradaAnalogLeida,1
movwf ADCON0
call ActivaAD
OrdenProximoAD_Launch3AI
sBanco0
clrf AI_EntradaAnalogLeida
bsf AI_EntradaAnalogLeida,2
movwf ADCON0
call ActivaAD
goto OrdenProximoAD_End
OrdenProximoAD_Launch4AI
sBanco0
clrf AI_EntradaAnalogLeida
bsf AI_EntradaAnalogLeida,3
movwf ADCON0
call ActivaAD
goto OrdenProximoAD_End
OrdenProximoAD_Launch5AI
sBanco0
clrf AI_EntradaAnalogLeida
bsf AI_EntradaAnalogLeida,4
movwf ADCON0
call ActivaAD
goto OrdenProximoAD_End
OrdenProximoAD_End
sBanco0
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
LeoUltimaAD
sBanco0
movf AI_EntradaAnalogLeida,W
btfsc STATUS,Z
return
;¿Cual es?
LeoUltimaAD_EsLa1_
;¿Es la Primera-AI?
btfss AI_EntradaAnalogLeida,0
goto LeoUltimaAD_EsLa2_
sBanco0
movf ADRESH,W
sBanco3
movwf ByteAlto1AI
sBanco1
movf ADRESL,W
sBanco3
movwf ByteBajo1AI
goto LeoUltimaAD_End
LeoUltimaAD_EsLa2_
;¿Es la Segunda-AI?
btfss AI_EntradaAnalogLeida,1
goto LeoUltimaAD_EsLa3_
sBanco0
movf ADRESH,W
sBanco3
movwf ByteAlto2AI
sBanco1
movf ADRESL,W
sBanco3
movwf ByteBajo2AI
goto LeoUltimaAD_End
LeoUltimaAD_EsLa3_
;¿Es la Tercera-AI?
btfss AI_EntradaAnalogLeida,2
goto LeoUltimaAD_EsLa4_
sBanco0
movf ADRESH,W
sBanco3
movwf ByteAlto3AI
sBanco1
movf ADRESL,W
sBanco3
movwf ByteBajo3AI
goto LeoUltimaAD_End
LeoUltimaAD_EsLa4_
;¿Es la Cuarta-AI?
btfss AI_EntradaAnalogLeida,3
goto LeoUltimaAD_EsLa5_
sBanco0
movf ADRESH,W
sBanco3
movwf ByteAlto4AI
sBanco1
movf ADRESL,W
sBanco3
movwf ByteBajo4AI
goto LeoUltimaAD_End
LeoUltimaAD_EsLa5_
;¿Es la Quinta-AI?
btfss AI_EntradaAnalogLeida,4
goto LeoUltimaAD_End
sBanco0
movf ADRESH,W
sBanco3
movwf ByteAlto5AI
sBanco1
movf ADRESL,W
sBanco3
movwf ByteBajo5AI
LeoUltimaAD_End
sBanco0
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
SetBooleano
;Funcion SetBooleano
; Operando I1 Operando I0
; +------------+-------------+
; | 8 bits | 8 bits |
; +------------+-------------+
; B0:LOCAL_2 B0:LOCAL_3
; Ejemplo RD23.4
; +------+------+-------------+
; +------+------+-------------+
; | | +------+------+
; | | 23
; | 4 (Indica el bit) (El bit mas alto indica a el valor que hay que poner)
sBanco0
swapf LOCAL_2,W
andlw 0x0F
btfss STATUS,Z
goto SBool_EsRD
SBool_1
movlw .1
subwf LOCAL_0,W
btfss STATUS,Z
goto SBool_EsSD
SBool_EsRD
addlw 0x10 ;Le sumamos 0x10 para que empiece por los registros libres
;del banco 2
movwf FSR
goto SBool_Seguir
SBool_EsSD
addlw 0x74 ;Le sumamos 0x20 para que empiece por los registros libres
;del banco
movwf FSR
SBool_Seguir
;Este codigo hay que optimizarlo en una subrutina que use tablas:
;Entrada Salida
;0 0000 0001
;1 0000 0010
;2 0000 0100
;3 0000 1000
;4 0001 0000
;5 0010 0000
;6 0100 0000
;7 1000 0000
movf LOCAL_2,W
movwf LOCAL_0
movlw 0x01
movwf LOCAL_1
movf LOCAL_0,W
btfsc STATUS,Z
goto sb_reg0x63_Completo
sb_reg0x63_NoCompleto
bcf STATUS,C
rlf LOCAL_1,F
decfsz LOCAL_0,F
goto sb_reg0x63_NoCompleto
sb_reg0x63_Completo
btfss LOCAL_2,3
goto SetA0
goto SetA1
SetA0
comf LOCAL_1,W
andwf INDF,F
bcf STATUS,IRP ;Selecciona el banco 2-3 en direccionamiento indirecto
return
SetA1
movf LOCAL_1,W
iorwf INDF,F
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
DameByte
;Funcion DameByte
;Parametros:
; En B0:LOCAL_3 el byte
; Operando I1 Operando I0
; +------------+-------------+
; +------------+-------------+
; B0:LOCAL_2 B0:LOCAL_3
;
; Ejemplo RD23
; +------+------+-------------+
; +------+------+-------------+
; | +------+------+
; | |
; | 23
sBanco0
;Ahora para pruebas vamos a suponer que todos los operandos estan en zona RD.
addlw 0x10 ;Le sumamos 0x10 para que empiece por los registros libres
;del banco 2
movwf FSR
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
SetByte
;Funcion SetByte
;Parametros:
; En B0:LOCAL_3 el byte
; En B0:LOCAL_4 el valor
; Operando I1 Operando I0
; +------------+-------------+
; +------------+-------------+
; B0:LOCAL_2 B0:LOCAL_3
; Ejemplo RD23
; +------+------+-------------+
; +------+------+-------------+
; | +------+------+
; | |
; | 23
;Ahora para pruebas vamos a suponer que todos los operandos estan en zona RD.
addlw 0x10 ;Le sumamos 0x10 para que empiece por los registros libres
;del banco 2
movwf FSR
movf LOCAL_4,W
movwf INDF
return
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
DameBooleano
;Funcion DameBooleano
;
;Parametros: B0:LOCAL_2, B0:LOCAL_3
; Operando I1 Operando I0
; +------------+-------------+
; +------------+-------------+
; B0:LOCAL_2 B0:LOCAL_3
; Ejemplo RD23.4
; +------+------+-------------+
; +------+------+-------------+
; | | +------+------+
; | | |
; | | 23
; | 4 (Indica el bit) (El bit mas alto indica a 1 que es referencia de bit)
sBanco0
swapf LOCAL_2,W
andlw 0x0F
btfss STATUS,Z
goto DBool_EsRD
DBool_1
movlw .1
subwf LOCAL_0,W
btfss STATUS,Z
goto DBool_EsSD
DBool_EsRD
;Ahora para pruebas vamos a suponer que todos los operandos estan en zona RD.
addlw 0x10 ;Le sumamos 0x10 para que empiece por los registros libres
;del banco 2
movwf FSR
goto DBool_Seguir
DBool_EsSD
;Ahora para pruebas vamos a suponer que todos los operandos estan en zona RD.
movwf FSR
DBool_Seguir
;Este codigo hay que optimizarlo en una subrutina que use tablas:
;Entrada Salida
;0 0000 0001
;1 0000 0010
;2 0000 0100
;3 0000 1000
;4 0001 0000
;5 0010 0000
;6 0100 0000
;7 1000 0000
movf LOCAL_2,W
movwf LOCAL_0
movlw 0x01
movwf LOCAL_1
movf LOCAL_0,W
btfsc STATUS,Z
goto reg0x63_Completo
reg0x63NoCompleto
bcf STATUS,C
rlf LOCAL_1,F
decfsz LOCAL_0,F
goto reg0x63NoCompleto
reg0x63_Completo
btfss STATUS,Z
retlw 0xFF
retlw 0x00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
;Función: DebemosEjecutar_
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
;Esta funcion es muy importante, la llaman las funciones que anteriormente no han
;llamado a PREPARA_OPER
Pg1_DebemosEjecutar_
goto Pg1_DebemosEjecutar_Flanco_Up
Pg1_DebemosEjecutar_Flanco_No
Pg1_DebemosEjecutar_Flanco_Up
retlw 0xFF
retlw 0x00
Pg1_DebemosEjecutar_Flanco_Down
retlw 0x00
retlw 0xFF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PREPARA_OPER_SO
goto Flanco_Up
goto Flanco_Down
Flanco_No
Flanco_Up
btfsc bPilaLogica ;Evaluamos si la pila lógica vale 1 ó 0
goto Flanco_End
goto PREPARA_OPER_SO_Salir
Flanco_Down
goto PREPARA_OPER_SO_Salir
Flanco_End
sBanco1
;Reg0x70->BARGB
;por Reg0x70
goto Reg0x70_End
movf 0x70,W
movwf FSR
goto Reg0x70_Tamano_2B
goto Reg0x70_Tamano_4B
goto Reg0x70_Tamano_1B
Reg0x70_Tamano_4B
movf INDF,W
movwf BARGB3
incf FSR,F
movf INDF,W
movwf BARGB2
incf FSR,F
Reg0x70_Tamano_2B
movf INDF,W
movwf BARGB1
incf FSR,F
Reg0x70_Tamano_1B
movf INDF,W
movwf BARGB0
Reg0x70_End
;Reg0x71->AARGB
;por Reg0x70
goto Reg0x71_End
movf 0x71,W
movwf FSR
goto Reg0x71_Tamano_2B
goto Reg0x71_Tamano_4B
goto Reg0x71_Tamano_1B
Reg0x71_Tamano_4B
movf INDF,W
movwf AARGB3
incf FSR,F
movf INDF,W
movwf AARGB2
incf FSR,F
Reg0x71_Tamano_2B
movf INDF,W
movwf AARGB1
incf FSR,F
Reg0x71_Tamano_1B
movf INDF,W
movwf AARGB0
Reg0x71_End
PREPARA_OPER_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OR_TB4_SO
goto OR_TB4_SO_Salir
bsf STATUS,RP0 ;Banco 1 en direccionamiento directo
bcf STATUS,RP1
movf 0x72,W
movwf FSR
movf BARGB3,W
iorwf AARGB3,W
movwf INDF
incf FSR,F
movf BARGB2,W
iorwf AARGB2,W
movwf INDF
incf FSR,F
movf BARGB1,W
iorwf AARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
iorwf AARGB0,W
movwf INDF
OR_TB4_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OR_TB2_SO
goto OR_TB2_SO_Salir
bcf STATUS,RP1
movf 0x72,W
movwf FSR
movf BARGB1,W
iorwf AARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
iorwf AARGB0,W
movwf INDF
OR_TB2_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OR_TB1_SO
goto OR_TB1_SO_Salir
bcf STATUS,RP1
movf 0x72,W
movwf FSR
movf BARGB0,W
iorwf AARGB0,W
movwf INDF
OR_TB1_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AND_TBx_SO
goto xxx_TBx_SO_Salir
bcf STATUS,RP1
movf 0x72,W
movwf FSR
goto AND_TBx_SO_2B
goto AND_TBx_SO_4B
goto AND_TBx_SO_1B
AND_TBx_SO_4B
movf BARGB3,W
andwf AARGB3,W
movwf INDF
incf FSR,F
movf BARGB2,W
andwf AARGB2,W
movwf INDF
incf FSR,F
AND_TBx_SO_2B
movf BARGB1,W
andwf AARGB1,W
movwf INDF
incf FSR,F
AND_TBx_SO_1B
movf BARGB0,W
andwf AARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
fEQUAL_SO
goto fEQUAL_SO_Salir
sBanco1
goto fEQUAL_SO_2B
goto fEQUAL_SO_4B
goto fEQUAL_SO_1B
fEQUAL_SO_4B
movf BARGB3,W
subwf AARGB3,W
btfss STATUS,Z
goto fEQUAL_SO_NoSonIguales
movf BARGB2,W
subwf AARGB2,W
btfss STATUS,Z
goto fEQUAL_SO_NoSonIguales
fEQUAL_SO_2B
movf BARGB1,W
subwf AARGB1,W
btfss STATUS,Z
goto fEQUAL_SO_NoSonIguales
fEQUAL_SO_1B
movf BARGB0,W
subwf AARGB0,W
btfss STATUS,Z
goto fEQUAL_SO_NoSonIguales
fEQUAL_SO_SonIguales
bsf Bx_SD_EQ
bcf Bx_SD_NEQ
goto fEQUAL_SO_Salir
fEQUAL_SO_NoSonIguales
bcf Bx_SD_EQ
bsf Bx_SD_NEQ
fEQUAL_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOR_TBx_SO
goto xxx_TBx_SO_Salir
bcf STATUS,RP1
movf 0x72,W
movwf FSR
goto XOR_TBx_SO_2B
goto XOR_TBx_SO_4B
goto XOR_TBx_SO_1B
XOR_TBx_SO_4B
movf BARGB3,W
xorwf AARGB3,W
movwf INDF
incf FSR,F
movf BARGB2,W
xorwf AARGB2,W
movwf INDF
incf FSR,F
XOR_TBx_SO_2B
movf BARGB1,W
xorwf AARGB1,W
movwf INDF
incf FSR,F
XOR_TBx_SO_1B
movf BARGB0,W
xorwf AARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MENOSMENOS_TDx_SO
call Pg1_DebemosEjecutar_
;Nos devuelve 0xFF en W si debemos ejecutar la
función
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto xxx_TBx_SO_Salir
movf 0x70,W
movwf FSR
movlw .1
subwf INDF,F
goto MENOSMENOS_TDx_SO_4B
incf FSR,F
btfss STATUS,C
decf INDF,F
goto xxx_TBx_SO_Salir
MENOSMENOS_TDx_SO_4B
goto xxx_TBx_SO_Salir
btfsc STATUS,C
goto xxx_TBx_SO_Salir
incf FSR,F
movlw .1
subwf INDF,F
btfsc STATUS,C
goto xxx_TBx_SO_Salir
incf FSR,F
movlw .1
subwf INDF,F
btfsc STATUS,C
goto xxx_TBx_SO_Salir
incf FSR,F
movlw .1
subwf INDF,F
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MASMAS_TDx_SO
call Pg1_DebemosEjecutar_
;Nos devuelve 0xFF en W si debemos ejecutar la
función
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto xxx_TBx_SO_Salir
movf 0x70,W
movwf FSR
movf INDF,W
addlw .1
movwf INDF
goto MASMAS_TDx_SO_4B
incf FSR,F
btfsc STATUS,C
incf INDF,F
goto xxx_TBx_SO_Salir
MASMAS_TDx_SO_4B
goto xxx_TBx_SO_Salir
btfss STATUS,C
goto xxx_TBx_SO_Salir
incf FSR,F
movf INDF,W
addlw .1
movwf INDF
btfss STATUS,C
goto xxx_TBx_SO_Salir
incf FSR,F
movf INDF,W
addlw .1
movwf INDF
btfss STATUS,C
goto xxx_TBx_SO_Salir
incf FSR,F
movf INDF,W
addlw .1
movwf INDF
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMPL_TBx_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto xxx_TBx_SO_Salir
movf 0x70,W
movwf FSR
comf INDF,F
goto COMPL_TBx_SO_4B
incf FSR,F
comf INDF,F
goto xxx_TBx_SO_Salir
COMPL_TBx_SO_4B
goto xxx_TBx_SO_Salir
incf FSR,F
comf INDF,F
incf FSR,F
comf INDF,F
incf FSR,F
comf INDF,F
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ROL_TBx_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto xxx_TBx_SO_Salir
movf 0x70,W
movwf FSR
btfss Bx_SD_CF
bcf STATUS,C
goto ROL_TBx_SO_4B
incf FSR,F
rlf INDF,F
goto ROL_TBx_SO_Salir
ROL_TBx_SO_4B
goto ROL_TBx_SO_Salir
incf FSR,F
rlf INDF,F
incf FSR,F
rlf INDF,F
incf FSR,F
rlf INDF,F
goto ROL_TBx_SO_Salir
ROL_TBx_SO_Salir
bsf Bx_SD_CF
btfss STATUS,C
bcf Bx_SD_CF
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fRESET_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto fRESET_SO_Salir
;A lo que tenemos en INDF tenemos que hacerle un OR con un byte que representa
;En B1:AARGB0 tendremos el bit que hay que poner a 1, en este caso tendremos
;el valor 2
;Primero tendremos que poner, por ejemplo en AARGB1 el byte con el bit correcto
sBanco1
movlw .1
movwf AARGB1
movf AARGB0,W
btfsc STATUS,Z
goto fRESET_YaTenemosAARGB1
fResetComienzoAARGB1
bcf STATUS,C
rlf AARGB1,F
decfsz AARGB0,F
goto fResetComienzoAARGB1
fRESET_YaTenemosAARGB1
comf AARGB1,F
movf 0x70,W
movwf FSR
movf AARGB1,W
andwf INDF,F
fRESET_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fSET_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto fSET_SO_Salir
;A lo que tenemos en INDF tenemos que hacerle un OR con un byte que representa
;En B1:AARGB0 tendremos el bit que hay que poner a 1, en este caso tendremos
;el valor 2
;Primero tendremos que poner, por ejemplo en AARGB1 el byte con el bit correcto
;para hacer el OR.
sBanco1
movlw .1
movwf AARGB1
movf AARGB0,W
btfsc STATUS,Z
goto fSET_YaTenemosAARGB1
fSetComienzoAARGB1
bcf STATUS,C
rlf AARGB1,F
decfsz AARGB0,F
goto fSetComienzoAARGB1
fSET_YaTenemosAARGB1
movf 0x70,W
movwf FSR
movf AARGB1,W
iorwf INDF,F
fSET_SO_Salir
goto xxx_TBx_SO_Salir
;Implementacion de SET: 01-05-2003 (End)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fUP_SO
goto fUP_SO_Salir
goto fUP_SO_Seguir
fDOWN_SO
goto fUP_SO_Salir
goto fUP_SO_Seguir
;A lo que tenemos en INDF tenemos que hacerle un OR con un byte que representa
;En B1:AARGB0 tendremos el bit que hay que poner a 1, en este caso tendremos
;el valor 2
;Primero tendremos que poner, por ejemplo en AARGB1 el byte con el bit correcto
fUP_SO_Seguir
sBanco1
movlw .1
movwf AARGB1
movf AARGB0,W
btfsc STATUS,Z
goto fUP_YaTenemosAARGB1
fUpComienzoAARGB1
bcf STATUS,C
rlf AARGB1,F
decfsz AARGB0,F
goto fUpComienzoAARGB1
fUP_YaTenemosAARGB1
movf 0x70,W
movwf FSR
movf AARGB1,W
iorwf INDF,F
fUP_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fSETCF_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto fSETCF_SO_Salir
bsf Bx_SD_CF
fSETCF_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fRESETCF_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto fRESETCF_SO_Salir
bcf Bx_SD_CF
fRESETCF_SO_Salir
goto xxx_TBx_SO_Salir
fTOGGLE_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto fTOGGLE_SO_Salir
;A lo que tenemos en INDF tenemos que hacerle un XOR con un byte que representa
;En B1:AARGB0 tendremos el bit que hay que poner a 1, en este caso tendremos
;el valor 2
;Primero tendremos que poner, por ejemplo en AARGB1 el byte con el bit correcto
sBanco1
movlw .1
movwf AARGB1
movf AARGB0,W
btfsc STATUS,Z
goto fTOGGLE_YaTenemosAARGB1
fTOGGLEComienzoAARGB1
bcf STATUS,C
rlf AARGB1,F
decfsz AARGB0,F
goto fTOGGLEComienzoAARGB1
fTOGGLE_YaTenemosAARGB1
movf 0x70,W
movwf FSR
movf AARGB1,W
xorwf INDF,F
fTOGGLE_SO_Salir
goto xxx_TBx_SO_Salir
fMOV_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto fMOV_SO_Salir
movf 0x70,W
movwf FSR
movf INDF,W
movwf 0x70
movf 0x71,W
movwf FSR
movf 0x70,W
movwf INDF
fMOV_SO_Salir
goto xxx_TBx_SO_Salir
fCMP_INT8U_SO
goto fCMP_INT8U_SO_Salir
;******************************************************************************
**************
; Parametro de entrada:
pPagina2
call Pg2_COMP_U8
pPagina1
fCMP_INT8U_SO_Salir
goto xxx_TBx_SO_Salir
fCMP_INT16U_SO
goto fCMP_INT16U_SO_Salir
pPagina2
call Pg2_COMP_U16
pPagina1
fCMP_INT16U_SO_Salir
goto xxx_TBx_SO_Salir
fCMP_INT16S_SO
goto fCMP_INT16S_SO_Salir
pPagina2
call Pg2_COMP_S16
pPagina1
fCMP_INT16S_SO_Salir
goto xxx_TBx_SO_Salir
fCMP_INT32U_SO
goto fCMP_INT32U_SO_Salir
pPagina2
call Pg2_COMP_U32
pPagina1
fCMP_INT32U_SO_Salir
goto xxx_TBx_SO_Salir
fCMP_INT32S_SO
goto fCMP_INT32S_SO_Salir
pPagina2
call Pg2_COMP_S32
pPagina1
fCMP_INT32S_SO_Salir
goto xxx_TBx_SO_Salir
fCMP_INT8S_SO
goto fCMP_INT8S_SO_Salir
;******************************************************************************
**************
; Parametro de entrada:
pPagina2
call Pg2_COMP_S8
pPagina1
fCMP_INT8S_SO_Salir
goto xxx_TBx_SO_Salir
fMOVI_SO
call Pg1_DebemosEjecutar_
btfsc STATUS,Z
goto fMOVI_SO_Salir
movf 0x70,W
movwf FSR
movf INDF,W
addlw 0x10
movwf FSR
movf INDF,W
movwf 0x70
movf 0x71,W
movwf FSR
movf 0x70,W
movwf INDF
fMOVI_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg1_MueveResultadosMul_TB2
movf 0x72,W
movwf FSR
;..............
incf FSR,F
goto Pg1_MueveResultadosMul_TB2_Salir
sBanco1
decf FSR,F
movf AARGB3,W
movwf INDF
incf FSR,F
movf AARGB2,W
movwf INDF
movf 0x73,W
movwf FSR
;..............
incf FSR,F
goto Pg1_MueveResultadosMul_TB2_Salir
sBanco1
decf FSR,F
movf AARGB1,W
movwf INDF
incf FSR,F
movf AARGB0,W
movwf INDF
Pg1_MueveResultadosMul_TB2_Salir
bcf STATUS,IRP
sBanco0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg1_MueveResultadosMul_TB1
movf 0x72,W
movwf FSR
goto Pg1_MueveResultadosMul_TB1_Salir
sBanco1
movf AARGB1,W
movwf INDF
movf 0x73,W
movwf FSR
goto Pg1_MueveResultadosMul_TB1_Salir
sBanco1
movf AARGB0,W
movwf INDF
Pg1_MueveResultadosMul_TB1_Salir
bcf STATUS,IRP
sBanco0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg1_MueveResultadosDiv_TB1
movf 0x72,W
movwf FSR
goto Pg1_MueveResultadosDiv_TB1_Salir
sBanco1
movf AARGB0,W
movwf INDF
movf 0x73,W
movwf FSR
goto Pg1_MueveResultadosDiv_TB1_Salir
sBanco1
movf REMB0,W
movwf INDF
Pg1_MueveResultadosDiv_TB1_Salir
bcf STATUS,IRP
sBanco0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg1_MueveResultadosDiv_TB2
movf 0x72,W
movwf FSR
;..............
incf FSR,F
;Comprobamos que lo vamos a poner en un RD correcto
goto Pg1_MueveResultadosDiv_TB2_Salir
sBanco1
decf FSR,F
movf AARGB1,W
movwf INDF
incf FSR,F
movf AARGB0,W
movwf INDF
movf 0x73,W
movwf FSR
;..............
incf FSR,F
goto Pg1_MueveResultadosDiv_TB2_Salir
sBanco1
decf FSR,F
movf REMB1,W
movwf INDF
incf FSR,F
movf REMB0,W
movwf INDF
Pg1_MueveResultadosDiv_TB2_Salir
bcf STATUS,IRP
sBanco0
return
fDIV_INT8U_SO
goto fDIV_INT8U_SO_Salir
pPagina2
call Pg2_IntercambiaAARGByBARGB
pPagina1
;******************************************************************************
**************
;Comprobamos si el divisor es 0
sBanco1
movf BARGB0,W
btfss STATUS,Z
goto fDIV_INT8U_SO_DivisorNoNulo
bsf Bx_SD_DIV_BY0
clrf AARGB0
clrf REMB0
goto fDIV_INT8U_SO_Seguir
fDIV_INT8U_SO_DivisorNoNulo
bcf Bx_SD_DIV_BY0
pPagina2
call Pg2_UDIV_8x8
pPagina1
fDIV_INT8U_SO_Seguir
call Pg1_MueveResultadosDiv_TB1
fDIV_INT8U_SO_Salir
goto xxx_TBx_SO_Salir
fDIV_INT16U_SO
goto fDIV_INT16U_SO_Salir
pPagina2
call Pg2_IntercambiaAARGByBARGB
pPagina1
;Comprobamos si el divisor es 0
sBanco1
movf BARGB0,W
btfss STATUS,Z
goto fDIV_INT16U_SO_DivisorNoNulo
movf BARGB1,W
btfss STATUS,Z
goto fDIV_INT16U_SO_DivisorNoNulo
bsf Bx_SD_DIV_BY0
clrf AARGB0
clrf AARGB1
clrf REMB0
clrf REMB1
goto fDIV_INT16U_SO_Seguir
fDIV_INT16U_SO_DivisorNoNulo
bcf Bx_SD_DIV_BY0
pPagina2
call Pg2_UDIV_16x16
pPagina1
fDIV_INT16U_SO_Seguir
call Pg1_MueveResultadosDiv_TB2
fDIV_INT16U_SO_Salir
goto xxx_TBx_SO_Salir
goto fDIV_INT16S_SO_Salir
pPagina2
call Pg2_IntercambiaAARGByBARGB
pPagina1
;Comprobamos si el divisor es 0
sBanco1
movf BARGB0,W
btfss STATUS,Z
goto fDIV_INT16S_SO_DivisorNoNulo
movf BARGB1,W
btfss STATUS,Z
goto fDIV_INT16S_SO_DivisorNoNulo
bsf Bx_SD_DIV_BY0
clrf AARGB0
clrf AARGB1
clrf REMB0
clrf REMB1
goto fDIV_INT16S_SO_Seguir
fDIV_INT16S_SO_DivisorNoNulo
bcf Bx_SD_DIV_BY0
pPagina2
call Pg2_SDIV_16x16
pPagina1
fDIV_INT16S_SO_Seguir
call Pg1_MueveResultadosDiv_TB2
fDIV_INT16S_SO_Salir
goto xxx_TBx_SO_Salir
fDIV_INT8S_SO
goto fDIV_INT8S_SO_Salir
pPagina2
call Pg2_IntercambiaAARGByBARGB
pPagina1
;******************************************************************************
**************
;Comprobamos si el divisor es 0
sBanco1
movf BARGB0,W
btfss STATUS,Z
goto fDIV_INT8S_SO_DivisorNoNulo
bsf Bx_SD_DIV_BY0
clrf AARGB0
clrf REMB0
goto fDIV_INT8S_SO_Seguir
fDIV_INT8S_SO_DivisorNoNulo
bcf Bx_SD_DIV_BY0
pPagina2
call Pg2_SDIV_8x8
pPagina1
fDIV_INT8S_SO_Seguir
call Pg1_MueveResultadosDiv_TB1
fDIV_INT8S_SO_Salir
goto xxx_TBx_SO_Salir
fMUL_INT8U_SO
goto fMUL_INT8U_SO_Salir
sBanco1
; Parametro de entrada:
pPagina2
call Pg2_UMUL_8x8
pPagina1
call Pg1_MueveResultadosMul_TB1
;Calculo Overflow
sBanco1
bcf Bx_SD_MUL_OVF
movf AARGB0,W
btfss STATUS,Z
bsf Bx_SD_MUL_OVF
fMUL_INT8U_SO_Salir
goto xxx_TBx_SO_Salir
fMUL_INT8S_SO
goto fMUL_INT8S_SO_Salir
sBanco1
; Parametro de entrada:
pPagina2
call Pg2_SMUL_8x8
pPagina1
call Pg1_MueveResultadosMul_TB1
;Calculo Overflow
; sBanco1
; bcf Bx_SD_MUL_OVF
; comf AARGB0,W
; btfss STATUS,Z
; bsf Bx_SD_MUL_OVF
fMUL_INT8S_SO_Salir
goto xxx_TBx_SO_Salir
fMUL_INT16U_SO
goto fMUL_INT16U_SO_Salir
sBanco1
pPagina2
call Pg2_UMUL_16x16
pPagina1
call Pg1_MueveResultadosMul_TB2
;Calculo Overflow
sBanco1
bcf Bx_SD_MUL_OVF
movf AARGB1,W
btfss STATUS,Z
goto fMUL_INT16U_SO_OVF_A1
movf AARGB0,W
btfsc STATUS,Z
goto fMUL_INT16U_SO_Salir
fMUL_INT16U_SO_OVF_A1
bsf Bx_SD_MUL_OVF
fMUL_INT16U_SO_Salir
goto xxx_TBx_SO_Salir
fMUL_INT16S_SO
goto fMUL_INT16S_SO_Salir
sBanco1
;******************************************************************************
**************
; Parametro de entrada:
pPagina2
call Pg2_SMUL_16x16
pPagina1
call Pg1_MueveResultadosMul_TB2
;Calculo Overflow
; sBanco1
; bcf Bx_SD_MUL_OVF
; movf AARGB1,W
; btfss STATUS,Z
; goto fMUL_INT16U_SO_OVF_A1
; movf AARGB0,W
; btfsc STATUS,Z
; goto fMUL_INT16U_SO_Salir
;fMUL_INT16U_SO_OVF_A1
; bsf Bx_SD_MUL_OVF
fMUL_INT16S_SO_Salir
goto xxx_TBx_SO_Salir
fCOPY_SO
goto fCOPY_SO_Salir
sBanco1
goto fCOPY_SO_2B
goto fCOPY_SO_4B
fCOPY_SO_1B
movf BARGB0,W
movwf INDF
goto fCOPY_SO_Salir
fCOPY_SO_2B
movwf FSR
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
goto fCOPY_SO_Salir
fCOPY_SO_4B
movwf FSR
movf BARGB3,W
movwf INDF
incf FSR,F
movf BARGB2,W
movwf INDF
incf FSR,F
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
goto fCOPY_SO_Salir
fCOPY_SO_Salir
goto xxx_TBx_SO_Salir
fPUT_EE_SO
goto fPUT_EE_SO_Salir
goto fPUT_EE_SO_Salir
;sBanco0
;bcf B0_Pre_SD_EE_FREE
bcf Bx_SD_EE_FREE
;
sBanco1
goto fPUT_EE_SO_2B
goto fPUT_EE_SO_Salir
fPUT_EE_SO_1B
movf BARGB0,W
movwf B3_PrimerByteEEPROM
clrf B3_SegundoByteEEPROM
movf 0x71,W
movwf B3_DireccionEEPROM
clrf B3_PunteroSigEEPROM
clrf B3_PunteroUltEEPROM
goto fPUT_EE_SO_Lanzar
fPUT_EE_SO_2B
movf BARGB1,W
movwf B3_PrimerByteEEPROM
movf BARGB0,W
movwf B3_SegundoByteEEPROM
movf 0x71,W
movwf B3_DireccionEEPROM
clrf B3_PunteroSigEEPROM
movlw .1
movwf B3_PunteroUltEEPROM
fPUT_EE_SO_Lanzar
;******************************************************************************
**************
;******************************************************************************
**************
; Parametro de entrada:
sBanco0
movf 0x71,W
movwf LOCAL_0
sBanco3
movf B3_PrimerByteEEPROM,W
sBanco0
movwf LOCAL_1
; bcf PIR2,EEIF
; bsf PIE2,EEIE
bsf Bx_EE_EnMarcha
pPagina0
call Pg0_EscribirEnEEPROM
pPagina1
fPUT_EE_SO_Salir
goto xxx_TBx_SO_Salir
fFILL_SO
goto fFILL_SO_Salir
;sBanco1
movf 0x71,W
movwf FSR
;Funcion a usar:
; byte_mayor_que
fFILL_LOOP
goto fFILL_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movf 0x72,W
movwf LOCAL_1
bcf PCLATH,4
call byte_mayor_que
sBanco0
btfsc LOCAL_1,0
sBanco1
movf BARGB0,W
movwf INDF
incf FSR,F
goto fFILL_LOOP
fFILL_SO_Salir
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ROR_TBx_SO
call Pg1_DebemosEjecutar_
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto xxx_TBx_SO_Salir
bsf STATUS,IRP ;Banco 2-3 en direccionamiento indirecto
movf 0x70,W
movwf FSR
btfss Bx_SD_CF
bcf STATUS,C
goto ROR_TBx_SO_2B
goto ROR_TBx_SO_4B
ROR_TBx_SO_1B
goto ROR_TBx_SO_Salir
ROR_TBx_SO_2B
incf FSR,F
rrf INDF,F
decf FSR,F
rrf INDF,F
goto ROR_TBx_SO_Salir
ROR_TBx_SO_4B
incf FSR,F
incf FSR,F
incf FSR,F
rrf INDF,F
decf FSR,F
rrf INDF,F
decf FSR,F
rrf INDF,F
decf FSR,F
rrf INDF,F
goto ROR_TBx_SO_Salir
ROR_TBx_SO_Salir
bsf Bx_SD_CF
btfss STATUS,C
bcf Bx_SD_CF
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESTA_TB1_SO
goto xxx_TBx_SO_Salir
bcf STATUS,RP1
goto RESTA_TBx_SO_2B
goto RESTA_TBx_SO_1B
RESTA_TBx_SO_4B
pPagina2
pPagina1
movf 0x72,W
movwf FSR
movf BARGB3,W
movwf INDF
incf FSR,F
movf BARGB2,W
movwf INDF
incf FSR,F
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
RESTA_TBx_SO_2B
pPagina2
pPagina1
movf 0x72,W
movwf FSR
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
RESTA_TBx_SO_1B
movf 0x72,W
movwf FSR
movf AARGB0,W
subwf BARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUMA_TB1_SO
goto xxx_TBx_SO_Salir
bcf STATUS,RP1
goto SUMA_TBx_SO_2B
goto SUMA_TBx_SO_4B
goto SUMA_TBx_SO_1B
SUMA_TBx_SO_4B
pPagina2
pPagina1
movf 0x72,W
movwf FSR
movf BARGB3,W
movwf INDF
incf FSR,F
movf BARGB2,W
movwf INDF
incf FSR,F
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
SUMA_TBx_SO_2B
pPagina2
pPagina1
movf 0x72,W
movwf FSR
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
SUMA_TBx_SO_1B
movf 0x72,W
movwf FSR
movf BARGB0,W
addwf AARGB0,W
movwf INDF
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
xxx_TBx_SO_Salir
bsf STATUS,RP1
clrf PCLATH
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
default
goto xxx_TBx_SO_Salir
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
Pg2_xxx_TBx_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
;Pg2_Conv16S_32S_SO
; pPagina1
; goto xxx_TBx_SO_Salir
;Pg2_Conv16U_32U_SO
; pPagina1
; goto xxx_TBx_SO_Salir
Pg2_Conv8U_16U_SO
sBanco0
bcf LOCAL_0,0
goto Pg2_Conv8X_16X_SO
Pg2_Conv8S_16S_SO
sBanco0
bsf LOCAL_0,0
goto Pg2_Conv8X_16X_SO
Pg2_Conv8X_16X_SO
goto Pg2_Conv8X_16X_SO_Salir
bsf STATUS,IRP
movf 0x71,W
movwf FSR
incf FSR,F
;Primero comprobamos si es mayor que RD095
pPagina1
pPagina2
goto Pg2_Conv8X_16X_SO_Salir
decf FSR,F
sBanco0
movf 0x70,W
movwf FSR
movf INDF,W
movwf LOCAL_1
movf 0x71,W
movwf FSR
movf LOCAL_1,W
movwf INDF
incf FSR,F
btfss LOCAL_0,0
goto Pg2_Conv8X_16X_SO_UUU
movlw 0xFF
movwf INDF
btfss LOCAL_1,7
Pg2_Conv8X_16X_SO_UUU
clrf INDF
Pg2_Conv8X_16X_SO_Salir
goto Pg2_xxx_TBx_SO_Salir
Pg2_fGET_EE_SO
goto Pg2_fGET_EE_SO_Salir
bcf Bx_SD_EE_RDOK
goto Pg2_fGET_EE_SO_Salir
sBanco0
goto Pg2_fGET_EE_SO_2B
goto Pg2_fGET_EE_SO_Salir
goto Pg2_fGET_EE_SO_1B
Pg2_fGET_EE_SO_2B
movf 0x71,W
movwf FSR
incf FSR,F
pPagina1
pPagina2
goto Pg2_fGET_EE_SO_Salir
decf FSR,F
;******************************************************************************
**************
; Parametro de entrada:
movf 0x70,W
movwf LOCAL_0
pPagina0
call Pg0_LeerDeEEPROM
pPagina1
movwf INDF
incf 0x70,F
incf 0x71,F
Pg2_fGET_EE_SO_1B
movf 0x71,W
movwf FSR
pPagina1
pPagina2
goto Pg2_fGET_EE_SO_Salir
;******************************************************************************
**************
; Parametro de entrada:
movf 0x70,W
movwf LOCAL_0
pPagina0
call Pg0_LeerDeEEPROM
pPagina2
movwf INDF
bsf Bx_SD_EE_RDOK
goto Pg2_fGET_EE_SO_Salir
Pg2_fGET_EE_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_WEsPunteroLCDValido'
Pg2_WEsPunteroLCDValido
sublw .31
btfss STATUS,C
goto Pg2_WEsPunteroLCDValido_INVALIDO
Pg2_WEsPunteroLCDValido_VALIDO
bsf STATUS,Z
return
Pg2_WEsPunteroLCDValido_INVALIDO
bcf STATUS,Z
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_PonPunteroLCD'
Pg2_PonPunteroLCD
sBanco1
movwf B1_PunteroLCD
call Pg2_WEsPunteroLCDValido
btfsc STATUS,Z ;Si Z==1 es valido
goto Pg2_PonPunteroLCD_Salir
;Es invalido
clrf B1_PunteroLCD
Pg2_PonPunteroLCD_Salir
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_CorrigePunteroLCD'
Pg2_CorrigePunteroLCD
sBanco1
movf B1_PunteroLCD,W
call Pg2_WEsPunteroLCDValido
goto Pg2_CorrigePunteroLCD_Salir
;Es invalido
clrf B1_PunteroLCD
Pg2_CorrigePunteroLCD_Salir
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_IncPunteroLCD'
Pg2_IncPunteroLCD
sBanco1
incf B1_PunteroLCD,F
movf B1_PunteroLCD,W
call Pg2_WEsPunteroLCDValido
btfsc STATUS,Z ;Si Z==1 es valido
goto Pg2_IncPunteroLCD_Salir
;Es invalido
clrf B1_PunteroLCD
Pg2_IncPunteroLCD_Salir
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_DecPunteroLCD'
Pg2_DecPunteroLCD
sBanco1
decf B1_PunteroLCD,F
movf B1_PunteroLCD,W
call Pg2_WEsPunteroLCDValido
goto Pg2_DecPunteroLCD_Salir
;Es invalido
movlw .31
movwf B1_PunteroLCD
Pg2_DecPunteroLCD_Salir
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
Pg2_Char2LCD
; movf LOCAL_1,W
; btfss STATUS,Z
; goto Pg2_Char2LCD_End
sBanco1
sBanco1
movf B1_PunteroLCD,W
addlw B1_IniBufferLCD
iorlw 0x80
movwf FSR
sBanco0
movf LOCAL_0,W
movwf INDF
decfsz LOCAL_1,F
goto Pg2_Char2LCD_SeguirBucle
goto Pg2_Char2LCD_Salir
Pg2_Char2LCD_SeguirBucle
call Pg2_IncPunteroLCD
goto Pg2_Char2LCD
Pg2_Char2LCD_Salir
; call Pg2_IncPunteroLCD
;Pg2_Char2LCD_End
return
Pg2_PreparaParametrosParafSTRLCD_SO
sBanco1
movlw .32
btfss STATUS,C
goto Pg2_fCHRLCD_SO_NoTruncarInicio
clrf BARGB0
Pg2_fCHRLCD_SO_NoTruncarInicio
movlw .32
btfss STATUS,C
goto Pg2_fCHRLCD_SO_NoTruncarTamano
movlw .32
movwf AARGB0
Pg2_fCHRLCD_SO_NoTruncarTamano
sBanco1
movf BARGB0,W
sBanco0
sBanco1
movlw .32
btfss STATUS,C
goto Pg2_fCHRLCD_SO_Seguir1
movlw .32
subwf BARGB0,F
Pg2_fCHRLCD_SO_Seguir1
movf BARGB0,W
call Pg2_PonPunteroLCD
sBanco1
movf AARGB0,W
sBanco0
return
;Implementacion de rutinas para fINTxxLCD_SO: 09-05-2003 (Begin)
Pg2_PreparaParametrosParafINTxxLCD_SO
; sBanco1
; movlw .32
; btfss STATUS,C
; goto Pg2_fINTxxLCD_SO_NoTruncarInicio
; clrf BARGB0
;Pg2_fINTxxLCD_SO_NoTruncarInicio
; movlw .32
; btfss STATUS,C
; goto Pg2_fINTxxLCD_SO_NoTruncarTamano
; movlw .32
; movwf AARGB0
;Pg2_fINTxxLCD_SO_NoTruncarTamano
; sBanco1
; movf BARGB0,W
; sBanco0
; sBanco1
; movlw .32
; btfss STATUS,C
; goto Pg2_fINTxxLCD_SO_Seguir1
; movlw .32
; subwf BARGB0,F
;Pg2_fINTxxLCD_SO_Seguir1
; movf BARGB0,W
; call Pg2_PonPunteroLCD
; sBanco1
; movf AARGB0,W
; sBanco0
;Cogemos el valor que queremos representar que lo tenemos apuntado por 0x72
sBanco1
movf 0x72,W
movwf FSR
goto Pg2_fINTxxLCD_SO_Tamano_2B
goto Pg2_fINTxxLCD_SO_Tamano_4B
goto Pg2_fINTxxLCD_SO_Tamano_1B
Pg2_fINTxxLCD_SO_Tamano_4B
movf INDF,W
movwf AARGB3
incf FSR,F
movf INDF,W
movwf AARGB2
incf FSR,F
Pg2_fINTxxLCD_SO_Tamano_2B
movf INDF,W
movwf AARGB1
incf FSR,F
Pg2_fINTxxLCD_SO_Tamano_1B
movf INDF,W
movwf AARGB0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg2_fINTxuLCD_SO_RellenamosParaINT
sBanco0
movf LOCAL_4,W
subwf LOCAL_3,W ;Comprobamos que cabe en el espacio que nos han dejado
btfsc STATUS,Z
return
;goto Pg2_fINTxuLCD_SO_Salir
btfss STATUS,C
goto PG2_fINTxuLCD_SO_NoCupio
;goto PG2_fINTxuLCD_SO_SiCupio
PG2_fINTxuLCD_SO_SiCupio
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
sBanco0
call Pg2_PonPunteroLCD
sBanco0
movwf LOCAL_0
movf LOCAL_4,W
subwf LOCAL_3,W
movwf LOCAL_1
call Pg2_Char2LCD
return
;goto Pg2_fINT8uLCD_SO_Salir
PG2_fINTxuLCD_SO_NoCupio
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
sBanco0
call Pg2_PonPunteroLCD
sBanco0
movlw '*'
movwf LOCAL_0
movf LOCAL_3,W
movwf LOCAL_1
call Pg2_Char2LCD
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg2_fINTxsLCD_SO_RellenamosParaINT
sBanco0
movf LOCAL_4,W
subwf LOCAL_3,W ;Comprobamos que cabe en el espacio que nos han dejado
btfsc STATUS,Z
goto PG2_fINTxuLCD_SO_NoCupio
btfss STATUS,C
goto PG2_fINTxuLCD_SO_NoCupio
PG2_fINTxsLCD_SO_SiCupio
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
sBanco0
call Pg2_PonPunteroLCD
sBanco0
movwf LOCAL_0
movf LOCAL_4,W
subwf LOCAL_3,W
movwf LOCAL_1
call Pg2_Char2LCD
movlw '-'
movwf LOCAL_0
PG2_fINTxsLCD_SO_SiCupio_MaMenos
movlw .1
movwf LOCAL_1
call Pg2_Char2LCD
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg2_fINTxxLCD_SO_ImprimeCaracter
;sBanco1
;movf REMB0,W
sBanco0
addlw '0'
movwf LOCAL_0
movlw .1
movwf LOCAL_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
call Pg2_Char2LCD
call Pg2_DecPunteroLCD
return
Pg2_fINT8uLCD_SO
goto Pg2_fINT8uLCD_SO_Salir
call Pg2_PreparaParametrosParafINTxxLCD_SO
sBanco0
btfsc STATUS,Z
goto Pg2_fINT8uLCD_SO_Salir
Pg2_fINT8uLCD_SO_BeginDivisionesPor10
sBanco0
incf LOCAL_4,F
movf LOCAL_4,W
subwf LOCAL_3,W ;Comprobamos que cabe en el espacio que nos han dejado
btfsc STATUS,Z
goto Pg2_fINT8uLCD_SO_SiCabe
btfss STATUS,C
goto Pg2_fINT8uLCD_SO_NoCabe
Pg2_fINT8uLCD_SO_SiCabe
sBanco1
movlw .10
movwf BARGB0
call Pg2_UDIV_8x8
sBanco1
movf REMB0,W
call Pg2_fINTxxLCD_SO_ImprimeCaracter
sBanco1
movf AARGB0,W
btfss STATUS,Z
goto Pg2_fINT8uLCD_SO_BeginDivisionesPor10
Pg2_fINT8uLCD_SO_NoCabe
call Pg2_fINTxuLCD_SO_RellenamosParaINT
Pg2_fINT8uLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fCHRLCD_SO
goto Pg2_fCHRLCD_SO_Salir
call Pg2_PreparaParametrosParafINTxxLCD_SO
btfsc STATUS,Z
goto Pg2_fCHRLCD_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
sBanco0
call Pg2_PonPunteroLCD
sBanco1
movf AARGB0,W
sBanco0
movwf LOCAL_0
movf LOCAL_3,W
movwf LOCAL_1
call Pg2_Char2LCD
Pg2_fCHRLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_DameFDValor
sBanco1
movlw ByteAltoBeginFD
movwf PCLATH
movf AARGB0,W
addlw ByteBajoBeginFD
movwf PCL
Pg2_fSTRLCD_SO
goto Pg2_fSTRLCD_SO_Salir
call Pg2_PreparaParametrosParafSTRLCD_SO
sBanco1
movf 0x72,W
movwf AARGB0
;Primero nos aseguramos de que AARGB0 (FD100) + LOCAL_3 (Tamaño) es <= 200
sBanco1
movf AARGB0,W
sBanco0
addwf LOCAL_3,W
sublw .200
btfss STATUS,C
goto Pg2_fSTRLCD_SO_Salir
sBanco0
call Pg2_PonPunteroLCD
Pg2_fSTRLCD_SO_BeginBucle
sBanco0
btfsc STATUS,Z
goto Pg2_fSTRLCD_SO_Salir
decf LOCAL_3,F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rutina 'Pg2_Char2LCD'
; sBanco1
; movlw ByteAltoBeginFD
; movwf PCLATH
; movf AARGB0,W
; addlw ByteBajoBeginFD
; movwf PCL
; pPagina2
call Pg2_DameFDValor
pPagina2
sBanco0
;movlw 'i'
movwf LOCAL_0
movlw .1
movwf LOCAL_1
call Pg2_Char2LCD
call Pg2_IncPunteroLCD
sBanco1
incf AARGB0,F
goto Pg2_fSTRLCD_SO_BeginBucle
Pg2_fSTRLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_RellenaLOCAL_5SegunAARGB0
;Veo si es negativo
sBanco1
btfss AARGB0,7
goto Pg2_fINT8sLCD_SO_NoEsNegativo
Pg2_fINT8sLCD_SO_SiEsNegativo
sBanco0
clrf LOCAL_5
goto Pg2_fINT8sLCD_SO_SiNoEsNegativo
Pg2_fINT8sLCD_SO_NoEsNegativo
sBanco0
movlw 0xFF
movwf LOCAL_5
Pg2_fINT8sLCD_SO_SiNoEsNegativo
return
Pg2_fINT8sLCD_SO
goto Pg2_fINT8sLCD_SO_Salir
call Pg2_PreparaParametrosParafINTxxLCD_SO
call Pg2_RellenaLOCAL_5SegunAARGB0
sBanco0
movf LOCAL_5,W
movwf LOCAL_6
sBanco0
clrf LOCAL_4 ;Ponemos en LOCAL_4 los digitos que estamos poniendo.
btfsc STATUS,Z
goto Pg2_fINT8sLCD_SO_Salir
Pg2_fINT8sLCD_SO_BeginDivisionesPor10
sBanco0
incf LOCAL_4,F
movf LOCAL_4,W
subwf LOCAL_3,W ;Comprobamos que cabe en el espacio que nos han dejado
btfsc STATUS,Z
goto Pg2_fINT8sLCD_SO_SiCabe
btfss STATUS,C
goto Pg2_fINT8sLCD_SO_NoCabe
Pg2_fINT8sLCD_SO_SiCabe
call Pg2_RellenaLOCAL_5SegunAARGB0
sBanco0
btfss LOCAL_5,0
goto Pg2_fINT8sLCD_SO_Neg
;;goto Pg2_fINT8sLCD_SO_Pos
Pg2_fINT8sLCD_SO_Pos
sBanco1
movlw .10
goto Pg2_fINT8sLCD_SO_PosNeg
Pg2_fINT8sLCD_SO_Neg
sBanco1
Pg2_fINT8sLCD_SO_PosNeg
movwf BARGB0
call Pg2_SDIV_8x8
sBanco1
movf REMB0,W
call Pg2_fINTxxLCD_SO_ImprimeCaracter
sBanco1
movf AARGB0,W
btfss STATUS,Z
goto Pg2_fINT8sLCD_SO_BeginDivisionesPor10
Pg2_fINT8sLCD_SO_NoCabe
sBanco0
btfss LOCAL_6,7
goto Pg2_fINT8sLCD_SO_NegativoRelleno
;goto Pg2_fINT8sLCD_SO_PositivoRelleno
Pg2_fINT8sLCD_SO_PositivoRelleno
call Pg2_fINTxuLCD_SO_RellenamosParaINT
goto Pg2_fINT8sLCD_SO_Salir
Pg2_fINT8sLCD_SO_NegativoRelleno
call Pg2_fINTxsLCD_SO_RellenamosParaINT
Pg2_fINT8sLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fINT16sLCD_SO
goto Pg2_fINT16sLCD_SO_Salir
call Pg2_PreparaParametrosParafINTxxLCD_SO
;Veo si es negativo
call Pg2_RellenaLOCAL_5SegunAARGB0
; sBanco1
; btfss AARGB0,7
; goto Pg2_fINT16sLCD_SO_NoEsNegativo
; ;goto Pg2_fINT8sLCD_SO_SiEsNegativo
;Pg2_fINT16sLCD_SO_SiEsNegativo
; decf AARGB0,F
; comf AARGB0,F
; sBanco0
; clrf LOCAL_5
; goto Pg2_fINT16sLCD_SO_SiNoEsNegativo
;Pg2_fINT16sLCD_SO_NoEsNegativo
; sBanco0
; movlw 0xFF
; movwf LOCAL_5
;Pg2_fINT16sLCD_SO_SiNoEsNegativo
sBanco0
movf LOCAL_5,W
movwf LOCAL_6
sBanco0
btfsc STATUS,Z
goto Pg2_fINT16sLCD_SO_Salir
Pg2_fINT16sLCD_SO_BeginDivisionesPor10
sBanco0
incf LOCAL_4,F
movf LOCAL_4,W
subwf LOCAL_3,W ;Comprobamos que cabe en el espacio que nos han dejado
btfsc STATUS,Z
goto Pg2_fINT16sLCD_SO_SiCabe
btfss STATUS,C
goto Pg2_fINT16sLCD_SO_NoCabe
Pg2_fINT16sLCD_SO_SiCabe
call Pg2_RellenaLOCAL_5SegunAARGB0
sBanco0
btfss LOCAL_5,0
goto Pg2_fINT16sLCD_SO_Neg
;;goto Pg2_fINT8sLCD_SO_Pos
Pg2_fINT16sLCD_SO_Pos
sBanco1
movlw .10
movwf BARGB1
clrf BARGB0
goto Pg2_fINT16sLCD_SO_PosNeg
Pg2_fINT16sLCD_SO_Neg
sBanco1
movwf BARGB1
movlw 0xFF
movwf BARGB0
Pg2_fINT16sLCD_SO_PosNeg
sBanco1
;movlw .10
; movwf BARGB1
; clrf BARGB0
call Pg2_SDIV_16x16
sBanco1
movf REMB1,W
call Pg2_fINTxxLCD_SO_ImprimeCaracter
sBanco1
movf AARGB0,W
btfss STATUS,Z
goto Pg2_fINT16sLCD_SO_BeginDivisionesPor10
movf AARGB1,W
btfss STATUS,Z
goto Pg2_fINT16sLCD_SO_BeginDivisionesPor10
Pg2_fINT16sLCD_SO_NoCabe
sBanco0
btfss LOCAL_6,7
goto Pg2_fINT16sLCD_SO_NegativoRelleno
Pg2_fINT16sLCD_SO_PositivoRelleno
call Pg2_fINTxuLCD_SO_RellenamosParaINT
goto Pg2_fINT8sLCD_SO_Salir
Pg2_fINT16sLCD_SO_NegativoRelleno
call Pg2_fINTxsLCD_SO_RellenamosParaINT
Pg2_fINT16sLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fINT16uLCD_SO
goto Pg2_fINT16uLCD_SO_Salir
call Pg2_PreparaParametrosParafINTxxLCD_SO
sBanco0
btfsc STATUS,Z
goto Pg2_fINT16uLCD_SO_Salir
Pg2_fINT16uLCD_SO_BeginDivisionesPor10
sBanco0
incf LOCAL_4,F
movf LOCAL_4,W
subwf LOCAL_3,W ;Comprobamos que cabe en el espacio que nos han dejado
btfsc STATUS,Z
goto Pg2_fINT16uLCD_SO_SiCabe
btfss STATUS,C
goto Pg2_fINT16uLCD_SO_NoCabe
Pg2_fINT16uLCD_SO_SiCabe
sBanco1
movlw .10
movwf BARGB1
clrf BARGB0
call Pg2_UDIV_16x16
sBanco1
movf REMB1,W
call Pg2_fINTxxLCD_SO_ImprimeCaracter
sBanco1
movf AARGB0,W
btfss STATUS,Z
goto Pg2_fINT16uLCD_SO_BeginDivisionesPor10
movf AARGB1,W
btfss STATUS,Z
goto Pg2_fINT16uLCD_SO_BeginDivisionesPor10
Pg2_fINT16uLCD_SO_NoCabe
call Pg2_fINTxuLCD_SO_RellenamosParaINT
Pg2_fINT16uLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fSCL_SO
goto Pg2_fSCL_SO_Salir
sBanco1
movf BARGB1,W
sBanco0
movwf LOCAL_1
sBanco1
movf BARGB0,W
sBanco0
movwf LOCAL_0
;pPagina2
;pPagina1
btfss STATUS,C
goto Pg2_fSCL_PendientePositiva
goto Pg2_fSCL_PendienteNegativa
Pg2_fSCL_PendientePositiva
sBanco0
bsf B0_PendienteSCL
call Pg2_IntercambiaAARGByBARGB
goto Pg2_fSCL_PendienteSeguir
Pg2_fSCL_PendienteNegativa
sBanco0
bcf B0_PendienteSCL
Pg2_fSCL_PendienteSeguir
call Pg2_RESTA_16
movf 0x72,W
movwf FSR
sBanco1
movf INDF,W
movwf AARGB1
incf FSR,F
movf INDF,W
movwf AARGB0
;pPagina2
call Pg2_UMUL_16x16
;pPagina1
sBanco1
movlw 0xFF
movwf BARGB1
movlw 0x03
movwf BARGB0
;pPagina2
call Pg2_UDIV_32x16
;pPagina1
;En (AARGB2,AARGB3) tenemos [x*(y1-y0)]/1023
;Restauramos y0
sBanco0
sBanco1
movwf BARGB1
sBanco0
sBanco1
movwf BARGB0
movf AARGB3,W
movwf AARGB1
movf AARGB2,W
movwf AARGB0
sBanco0
btfss B0_PendienteSCL
goto Pg2_fSCL_SO_Restar
goto Pg2_fSCL_SO_Sumar
Pg2_fSCL_SO_Restar
;pPagina2
call Pg2_RESTA_16
;pPagina1
goto Pg2_fSCL_SO_SumarRestarSalir
Pg2_fSCL_SO_Sumar
;pPagina2
call Pg2_SUMA_16
;pPagina1
Pg2_fSCL_SO_SumarRestarSalir
movf 0x73,W
movwf FSR
incf FSR,F
pPagina1
pPagina2
goto Pg2_fSCL_SO_Salir
decf FSR,F
movf BARGB1,W
movwf INDF
incf FSR,F
movf BARGB0,W
movwf INDF
Pg2_fSCL_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_LimpiarTimers
movwf FSR
Pg2_LimpiarTimers_Bucle
clrf INDF
incf FSR,F
clrf INDF
movlw 0x6F
iorlw 0x80
subwf FSR,W
btfsc STATUS,Z
goto Pg2_LimpiarTimers_Salir
incf FSR,F
goto Pg2_LimpiarTimers_Bucle
Pg2_LimpiarTimers_Salir
return
Pg2_fTON_TOFF_TUP_TDN_Parametro
;por Reg0x71
goto Pg2_fTON_SO_Modalidad2
sBanco1
movf 0x71,W
movwf FSR
movf INDF,W
movwf AARGB0
Pg2_fTON_SO_Modalidad2
return
Pg2_PonerBT
btfss 0x72,0
bcf INDF,TimControl_BaseTiempo_BitBajo
bsf INDF,TimControl_BaseTiempo_BitAlto
btfss 0x72,1
bcf INDF,TimControl_BaseTiempo_BitAlto
return
Pg2_fTON_SO
call Pg2_fTON_TOFF_TUP_TDN_Parametro
movf 0x70,W
movwf FSR
pPagina1
pPagina2
goto Pg2_fTON_SO_Salir
movf FSR,W
movwf FSR
call Pg2_PonerBT
bcf INDF,TimControl_TipoTimer_BitBajo
bcf INDF,TimControl_TipoTimer_BitAlto
goto Pg2_fTON_SO_SenalActivacionOFF
goto Pg2_fTON_SO_SenalActivacionON
Pg2_fTON_SO_SenalActivacionON
btfsc INDF,TimControl_YaEnMarcha
goto Pg2_fTON_SO_HayQueActivarSalida_
bsf INDF,TimControl_YaEnMarcha
bsf INDF,TimControl_ActivacionBT
bcf INDF,TimControl_SalidaTimer
goto Pg2_fTON_SO_SenalActivacionONyOFF
Pg2_fTON_SO_HayQueActivarSalida_
incf FSR,F
sBanco1
movf INDF,W
btfss STATUS,Z
goto Pg2_fTON_SO_Salir
;Activamos salida
decf FSR,F
bsf INDF,TimControl_SalidaTimer
goto Pg2_fTON_SO_Salir
Pg2_fTON_SO_SenalActivacionOFF
bcf INDF,TimControl_YaEnMarcha
bcf INDF,TimControl_SalidaTimer
bcf INDF,TimControl_ActivacionBT
Pg2_fTON_SO_SenalActivacionONyOFF
incf FSR,F
sBanco1
movf AARGB0,W
movwf INDF
goto Pg2_fTON_SO_Salir
; 00: 1mseg
; 01: 10mseg
; 10: 100mseg
; 11: 1000mseg
Pg2_fTON_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fTOFF_SO
call Pg2_fTON_TOFF_TUP_TDN_Parametro
movf 0x70,W
movwf FSR
pPagina1
pPagina2
goto Pg2_fTOFF_SO_Salir
movf FSR,W
movwf FSR
call Pg2_PonerBT
bsf INDF,TimControl_TipoTimer_BitBajo
bcf INDF,TimControl_TipoTimer_BitAlto
goto Pg2_fTOFF_SO_SenalActivacionOFF
goto Pg2_fTOFF_SO_SenalActivacionON
Pg2_fTOFF_SO_SenalActivacionOFF
btfss INDF,TimControl_YaEnMarcha
goto Pg2_fTON_SO_HayQueDesactivarSalida_
;goto Pg2_fTOFF_SO_Salir
bcf INDF,TimControl_YaEnMarcha
bsf INDF,TimControl_ActivacionBT
bsf INDF,TimControl_SalidaTimer
goto Pg2_fTOFF_SO_SenalActivacionONyOFF
;ll
Pg2_fTON_SO_HayQueDesactivarSalida_
incf FSR,F
sBanco1
movf INDF,W
btfss STATUS,Z
goto Pg2_fTON_SO_Salir
;Desactivamos salida
decf FSR,F
bcf INDF,TimControl_SalidaTimer
bcf INDF,TimControl_ActivacionBT
goto Pg2_fTON_SO_Salir
;ll
Pg2_fTOFF_SO_SenalActivacionON
bsf INDF,TimControl_YaEnMarcha
bsf INDF,TimControl_SalidaTimer
bcf INDF,TimControl_ActivacionBT
Pg2_fTOFF_SO_SenalActivacionONyOFF
incf FSR,F
sBanco1
movf AARGB0,W
movwf INDF
goto Pg2_fTOFF_SO_Salir
; 00: 1mseg
; 01: 10mseg
; 10: 100mseg
; 11: 1000mseg
Pg2_fTOFF_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fREFLCD_SO
pPagina1
call Pg1_DebemosEjecutar_
pPagina2
andlw 0xFF ;Como retlw no afecta a los bits de STATUS hacemos esto
btfsc STATUS,Z
goto Pg2_fREFLCD_SO_Salir
pPagina1
call Pg1_Refresh_LCD
Pg2_fREFLCD_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
call Pg2_fTON_TOFF_TUP_TDN_Parametro
movf 0x70,W
movwf FSR
pPagina1
pPagina2
goto Pg2_fTUP_SO_Salir
movf FSR,W
movwf FSR
call Pg2_PonerBT
bcf INDF,TimControl_TipoTimer_BitBajo
bsf INDF,TimControl_TipoTimer_BitAlto
goto Pg2_fTUP_SO_SenalActivacionONyOFF
Pg2_fTUP_SO_SenalActivacionON
btfsc INDF,TimControl_YaEnMarcha
goto Pg2_fTUP_SO_SenalActivacionONyOFF
btfsc INDF,TimControl_SenalActivAnterior
goto Pg2_fTUP_SO_SenalActivacionONyOFF
bsf INDF,TimControl_YaEnMarcha
bsf INDF,TimControl_ActivacionBT
bsf INDF,TimControl_SalidaTimer
incf FSR,F
sBanco1
movf AARGB0,W
movwf INDF
decf FSR,F
Pg2_fTUP_SO_SenalActivacionONyOFF
bsf INDF,TimControl_SenalActivAnterior
btfss bPilaLogica
bcf INDF,TimControl_SenalActivAnterior
goto Pg2_fTUP_SO_Salir
; 00: 1mseg
; 01: 10mseg
; 10: 100mseg
; 11: 1000mseg
Pg2_fTUP_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
Pg2_fTDN_SO
call Pg2_fTON_TOFF_TUP_TDN_Parametro
movf 0x70,W
movwf FSR
pPagina1
pPagina2
goto Pg2_fTDN_SO_Salir
movf FSR,W
movwf FSR
call Pg2_PonerBT
bsf INDF,TimControl_TipoTimer_BitBajo
bsf INDF,TimControl_TipoTimer_BitAlto
btfsc bPilaLogica ;Primero averiguamos si podemos ejecutar la función
goto Pg2_fTDN_SO_SenalActivacionONyOFF
Pg2_fTDN_SO_SenalActivacionOFF
btfsc INDF,TimControl_YaEnMarcha
goto Pg2_fTDN_SO_SenalActivacionONyOFF
btfss INDF,TimControl_SenalActivAnterior
goto Pg2_fTDN_SO_SenalActivacionONyOFF
bsf INDF,TimControl_YaEnMarcha
bsf INDF,TimControl_ActivacionBT
bsf INDF,TimControl_SalidaTimer
incf FSR,F
sBanco1
movf AARGB0,W
movwf INDF
decf FSR,F
Pg2_fTDN_SO_SenalActivacionONyOFF
bsf INDF,TimControl_SenalActivAnterior
btfss bPilaLogica
bcf INDF,TimControl_SenalActivAnterior
goto Pg2_fTDN_SO_Salir
; 00: 1mseg
; 01: 10mseg
; 10: 100mseg
; 11: 1000mseg
Pg2_fTDN_SO_Salir
pPagina1
goto xxx_TBx_SO_Salir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg2_IntercambiaAARGByBARGB
sBanco1
movf AARGB0,W
movwf TEMPB0
movf BARGB0,W
movwf AARGB0
movf TEMPB0,W
movwf BARGB0
movf AARGB1,W
movwf TEMPB1
movf BARGB1,W
movwf AARGB1
movf TEMPB1,W
movwf BARGB1
movf AARGB2,W
movwf TEMPB2
movf BARGB2,W
movwf AARGB2
movf TEMPB2,W
movwf BARGB2
movf AARGB3,W
movwf TEMPB3
movf BARGB3,W
movwf AARGB3
movf TEMPB3,W
movwf BARGB3
sBanco0
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_SUMA_16
sBanco1
movf AARGB1,W
addwf BARGB1,F
movf AARGB0,W
btfsc STATUS,C
incfsz AARGB0,W
addwf BARGB0,F
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_SUMA_32
sBanco1
movf AARGB3,W
addwf BARGB3,F
movf AARGB2,W
btfsc STATUS,C
incfsz AARGB2,W
addwf BARGB2,F
movf AARGB1,W
btfsc STATUS,C
incfsz AARGB1,W
addwf BARGB1,F
movf AARGB0,W
btfsc STATUS,C
incfsz AARGB0,W
addwf BARGB0,F
retlw 0x00
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
Pg2_RESTA_16
sBanco1
movf AARGB1,W
subwf BARGB1,F
movf AARGB0,W
btfss STATUS,C
incfsz AARGB0,W
subwf BARGB0,F
return
Pg2_RESTA_16_FOR_COMPARACION
sBanco1
movf AARGB1,W
subwf BARGB1,W
movf AARGB0,W
btfss STATUS,C
incfsz AARGB0,W
subwf BARGB0,W
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; (BARGB0,BARGB1,BARGB2,BARGB3)-
(AARGB0,AARGB1,AARGB2,AARGB3)=(BARGB0,BARGB1,BARGB2,BARGB3)
Pg2_RESTA_32
sBanco1
movf AARGB3,W
subwf BARGB3,W
movwf BARGB3
movf AARGB2,W
btfss STATUS,C
incfsz AARGB2,W
subwf BARGB2,W
movwf BARGB2
movf AARGB1,W
btfss STATUS,C
incfsz AARGB1,W
subwf BARGB1,W
movwf BARGB1
movf AARGB0,W
btfss STATUS,C
incfsz AARGB0,W
subwf BARGB0,W
movwf BARGB0
retlw 0x00
Pg2_RESTA_32_FOR_COMPARACION
sBanco1
movf AARGB3,W
subwf BARGB3,W
;movwf BARGB3
movf AARGB2,W
btfss STATUS,C
incfsz AARGB2,W
subwf BARGB2,W
;movwf BARGB2
movf AARGB1,W
btfss STATUS,C
incfsz AARGB1,W
subwf BARGB1,W
;movwf BARGB1
movf AARGB0,W
btfss STATUS,C
incfsz AARGB0,W
subwf BARGB0,W
;movwf BARGB0
retlw 0x00
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_COMP_S8
sBanco1
movf AARGB0,W
subwf BARGB0,W
Pg2_Evaluar_SDs
bsf Bx_SD_EQ
btfss STATUS,Z
bcf Bx_SD_EQ
;Para no tener que hacer otra resta en SD_NEQ vamos a guardar STATUS,C
bsf Bx_SD_NEQ
btfss STATUS,C
bcf Bx_SD_NEQ
xorwf BARGB0,W
andlw 0x80
btfss STATUS,Z
goto COMP_S8_DistintoSigno
COMP_S8_MismoSigno
bsf STATUS,C
btfss Bx_SD_NEQ
bcf STATUS,C
goto Pg2_Evaluar_SDu
COMP_S8_DistintoSigno
bsf STATUS,C
btfsc BARGB0,7
bcf STATUS,C
goto Pg2_Evaluar_SDu
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
;
Pg2_COMP_U8
sBanco1
movf AARGB0,W
subwf BARGB0,W
bsf Bx_SD_EQ
btfss STATUS,Z
bcf Bx_SD_EQ
Pg2_Evaluar_SDu
bcf Bx_SD_NEQ
btfss Bx_SD_EQ
bsf Bx_SD_NEQ
btfss STATUS,C
goto COMP_U8_EsMenor
COMP_U8_EsMayorOIgual
bcf Bx_SD_LT
bsf Bx_SD_GE
bcf Bx_SD_GT
btfss Bx_SD_EQ
bsf Bx_SD_GT
bsf Bx_SD_LE
btfss Bx_SD_EQ
bcf Bx_SD_LE
return
COMP_U8_EsMenor
bcf Bx_SD_GE
bcf Bx_SD_GT
bsf Bx_SD_LT
bsf Bx_SD_LE
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_COMP_U16
call Pg2_COMP_U16_S16_Comun
goto Pg2_Evaluar_SDu
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_COMP_S16
call Pg2_COMP_U16_S16_Comun
goto Pg2_Evaluar_SDs
Pg2_COMP_U16_S16_Comun
sBanco1
call Pg2_RESTA_16_FOR_COMPARACION
;Para no tener que hacer otra resta en SD_NEQ vamos a guardar STATUS,C en Bx_SD_NEQ
bsf Bx_SD_NEQ
btfss STATUS,C
bcf Bx_SD_NEQ
sBanco1
movf BARGB1,W
subwf AARGB1,W
btfss STATUS,Z
goto Pg2_COMP_U16_S16_NoCero
movf BARGB0,W
subwf AARGB0,W
btfss STATUS,Z
goto Pg2_COMP_U16_S16_NoCero
bsf Bx_SD_EQ
goto Pg2_COMP_U16_S16_Seguir
Pg2_COMP_U16_S16_NoCero
bcf Bx_SD_EQ
Pg2_COMP_U16_S16_Seguir
;Restauramos C
bsf STATUS,C
btfss Bx_SD_NEQ
bcf STATUS,C
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_COMP_U32
;sBanco1
;call Pg2_RESTA_32
;bsf Bx_SD_EQ
;btfss STATUS,Z
;bcf Bx_SD_EQ
call Pg2_COMP_U32_S32_Comun
goto Pg2_Evaluar_SDu
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
; Banco de Trabajo: Banco 1.
Pg2_COMP_S32
;sBanco1
;call Pg2_RESTA_32
call Pg2_COMP_U32_S32_Comun
goto Pg2_Evaluar_SDs
Pg2_COMP_U32_S32_Comun
;sBanco1
; (BARGB0,BARGB1,BARGB2,BARGB3)-(AARGB0,AARGB1,AARGB2,AARGB3)
; =(BARGB0,BARGB1,BARGB2,BARGB3)
call Pg2_RESTA_32_FOR_COMPARACION
;Para no tener que hacer otra resta en SD_NEQ vamos a guardar STATUS,C en Bx_SD_NEQ
bsf Bx_SD_NEQ
btfss STATUS,C
bcf Bx_SD_NEQ
sBanco1
movf BARGB3,W
subwf AARGB3,W
btfss STATUS,Z
goto Pg2_COMP_U32_S32_NoCero
movf BARGB2,W
subwf AARGB2,W
btfss STATUS,Z
goto Pg2_COMP_U32_S32_NoCero
movf BARGB1,W
subwf AARGB1,W
btfss STATUS,Z
goto Pg2_COMP_U32_S32_NoCero
movf BARGB0,W
subwf AARGB0,W
btfss STATUS,Z
goto Pg2_COMP_U32_S32_NoCero
bsf Bx_SD_EQ
goto Pg2_COMP_U32_S32_Seguir
Pg2_COMP_U32_S32_NoCero
bcf Bx_SD_EQ
Pg2_COMP_U32_S32_Seguir
;Restauramos C
bsf STATUS,C
btfss Bx_SD_NEQ
bcf STATUS,C
return
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_UMUL_8x8
sBanco1
CLRF AARGB1
MOVLW 0x08
MOVWF LOOPCOUNT
MOVF AARGB0,W
LOOPUM0808A
RRF BARGB0, F
BTFSC STATUS,C
GOTO LUM0808NAP
DECFSZ LOOPCOUNT, F
GOTO LOOPUM0808A
CLRF AARGB0
RETLW 0x00
LUM0808NAP
BCF STATUS,C
GOTO LUM0808NA
LOOPUM0808
RRF BARGB0, F
BTFSC STATUS,C
ADDWF AARGB0, F
LUM0808NA
RRF AARGB0, F
RRF AARGB1, F
DECFSZ LOOPCOUNT, F
GOTO LOOPUM0808
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_SMUL_8x8
;BSF STATUS,RP0
sBanco1
CLRF SIGN
MOVF AARGB0,W
BTFSC STATUS,Z
RETLW 0x00
XORWF BARGB0,W
MOVWF TEMPB3
BTFSC TEMPB3,MSB
COMF SIGN, F
BTFSS BARGB0,MSB
GOTO M0808SOK
COMF AARGB0, F
INCF AARGB0, F
BTFSC BARGB0,MSB
GOTO M0808SX
M0808SOK
;Comienzo de macro
MOVLW 0x07
MOVWF LOOPCOUNT
MOVF AARGB0,W
LOOPSM0808A
RRF BARGB0, F
BTFSC STATUS,C
GOTO LSM0808NA
DECFSZ LOOPCOUNT, F
GOTO LOOPSM0808A
CLRF AARGB0
RETLW 0x00
LOOPSM0808
RRF BARGB0, F
BTFSC STATUS,C
ADDWFAARGB0, F
LSM0808NA
RLF SIGN, F
RRF AARGB0, F
RRF AARGB1, F
DECFSZ LOOPCOUNT, F
GOTO LOOPSM0808
RLF SIGN, F
RRF AARGB0, F
RRF AARGB1, F
;Fin de Macro
RETLW 0x00
M0808SX
CLRF AARGB1
RLF SIGN, W
RRF AARGB0, F
RRF AARGB1, F
RETLW 0x00
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_UMUL_16x16
sBanco1
CLRF AARGB3
MOVF AARGB0,W
MOVWF TEMPB0
MOVF AARGB1,W
MOVWF TEMPB1
MOVLW 0x08
MOVWF LOOPCOUNT
LOOPUM1616A
RRF BARGB1,F
BTFSC STATUS,C
GOTO ALUM1616NAP
DECFSZ LOOPCOUNT,F
GOTO LOOPUM1616A
MOVWF LOOPCOUNT
LOOPUM1616B
RRF BARGB0,F
BTFSC STATUS,C
GOTO BLUM1616NAP
DECFSZ LOOPCOUNT,F
GOTO LOOPUM1616B
CLRF AARGB0
CLRF AARGB1
RETLW 0x00
BLUM1616NAP
BCF STATUS,C
GOTO BLUM1616NA
ALUM1616NAP
BCF STATUS,C
GOTO ALUM1616NA
ALOOPUM1616
RRF BARGB1,F
BTFSS STATUS,C
GOTO ALUM1616NA
MOVF TEMPB1,W
ADDWF AARGB1,F
MOVF TEMPB0,W
BTFSC STATUS,C
INCFSZ TEMPB0,W
ADDWF AARGB0,F
ALUM1616NA
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
DECFSZ LOOPCOUNT,F
GOTO ALOOPUM1616
MOVLW 0x08
MOVWF LOOPCOUNT
BLOOPUM1616
RRF BARGB0,F
BTFSS STATUS,C
GOTO BLUM1616NA
MOVF TEMPB1,W
ADDWF AARGB1,F
MOVF TEMPB0,W
BTFSC STATUS,C
INCFSZ TEMPB0,W
ADDWFAARGB0,F
BLUM1616NA
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
DECFSZ LOOPCOUNT,F
GOTO BLOOPUM1616
return
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
;
Pg2_SMUL_16x16
sBanco1
;BSF STATUS,RP0
CLRF AARGB3
CLRF SIGN
MOVF AARGB0,W
IORWF AARGB1,W
BTFSC STATUS,Z
RETLW 0x00
MOVF AARGB0,W
XORWF BARGB0,W
MOVWF TEMPB0
BTFSC TEMPB0,MSB
COMF SIGN,F
BTFSS BARGB0,MSB
GOTO M1616SOK
COMF BARGB1,F
COMF BARGB0,F
INCF BARGB1,F
BTFSC STATUS,Z
INCF BARGB0,F
COMF AARGB1,F
COMF AARGB0,F
INCF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0,F
BTFSC BARGB0,MSB
GOTO M1616SX
M1616SOK
MOVF AARGB0,W
MOVWF TEMPB0
MOVF AARGB1,W
MOVWF TEMPB1
;Comienzo de macro
MOVLW 0x8
MOVWF LOOPCOUNT
LOOPSM1616A
RRF BARGB1,F
BTFSC STATUS,C
GOTO ALSM1616NA
DECFSZ LOOPCOUNT,F
GOTO LOOPSM1616A
MOVLW 0x7
MOVWF LOOPCOUNT
LOOPSM1616B
RRF BARGB0,F
BTFSC STATUS,C
GOTO BLSM1616NA
DECFSZ LOOPCOUNT,F
GOTO LOOPSM1616B
CLRF AARGB0
CLRF AARGB1
RETLW 0x00
ALOOPSM1616
RRF BARGB1,F
BTFSS STATUS,C
GOTO ALSM1616NA
MOVF TEMPB1,W
ADDWF AARGB1,F
MOVF TEMPB0,W
BTFSC STATUS,C
INCFSZ TEMPB0,W
ADDWF AARGB0,F
ALSM1616NA
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
DECFSZ LOOPCOUNT,F
GOTO ALOOPSM1616
MOVLW 0x7
MOVWF LOOPCOUNT
BLOOPSM1616
RRF BARGB0,F
BTFSS STATUS,C
GOTO BLSM1616NA
MOVF TEMPB1,W
ADDWF AARGB1,F
MOVF TEMPB0,W
BTFSC STATUS,C
INCFSZ TEMPB0,W
ADDWF AARGB0,F
BLSM1616NA
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
DECFSZ LOOPCOUNT,F
GOTO BLOOPSM1616
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
;Fin de macro
RETLW 0x00
M1616SX
CLRF AARGB2
CLRF AARGB3
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RETLW 0x00
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_UDIV_8x8
sBanco1
CLRF REMB0
MOVLW 8
MOVWF LOOPCOUNT
LOOPU0808A
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
SUBWF REMB0, F
BTFSC STATUS,C
GOTO UOK88A
ADDWF REMB0, F
BCF STATUS,C
UOK88A
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPU0808A
RETLW 0x00
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
; Banco de Trabajo: Banco 1.
Pg2_SDIV_8x8
sBanco1
;FXD0808S
CLRF SIGN
MOVF AARGB0,W
BTFSC STATUS,Z
RETLW 0x00
XORWF BARGB0,W
MOVWF TEMP
BTFSC TEMP,MSB
COMF SIGN,F
GOTO CA0808S
COMF BARGB0, F
INCF BARGB0, F
CA0808S
GOTO C0808SX
COMF AARGB0, F
INCF AARGB0, F
C0808SX
MOVF AARGB0,W
IORWF BARGB0,W
MOVWF TEMP
BTFSC TEMP,MSB
GOTO C0808SX1
C0808S
MOVF BARGB0,W
SUBWF REMB0, F
RLF AARGB0, F
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
ADDWF REMB0, F
RLF AARGB0, F
MOVLW 6
MOVWF LOOPCOUNT
LOOPS0808A
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,LSB
SUBWF REMB0, F
BTFSS AARGB0,LSB
ADDWF REMB0, F
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS0808A
BTFSS AARGB0,LSB
ADDWF REMB0, F
GOTO C0808SX4
C0808SOK
BTFSS SIGN,MSB
RETLW 0x00
COMF AARGB0, F
INCF AARGB0, F
COMF REMB0, F
INCF REMB0, F
RETLW 0x00
C0808SX1
GOTO C0808SX3
GOTO C0808SX2
MOVWF REMB0
CLRF AARGB0
GOTO C0808SOK
C0808SX2
INCF AARGB0,F
RETLW 0x00
C0808SX3
INCF TEMPB3,F
GOTO C0808S
C0808SX4
SUBWF REMB0,W
BTFSS STATUS,Z
GOTO C0808SOK
GOTO C0808SOK
BSF FPFLAGS,NAN
RETLW 0xFF
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_UDIV_16x16
sBanco1
;FXD1616U
CLRF REMB0
CLRF REMB1
MOVLW D'16'
MOVWF LOOPCOUNT
LOOPU1616
RLF AARGB0,W
RLF REMB1, F
RLF REMB0, F
MOVF BARGB1,W
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
BTFSC STATUS,C
GOTO UOK66LL
MOVF BARGB1,W
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
BCF STATUS,C
UOK66LL
RLF AARGB1, F
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPU1616
RETLW 0x00
;
*************************************************************************************
*******
;
*************************************************************************************
*******
; Parametro de entrada:
Pg2_SDIV_16x16
sBanco1
;FXD1616S
CLRF SIGN
CLRF REMB1
MOVF AARGB0,W
IORWF AARGB1,W
BTFSC STATUS,Z
RETLW 0x00
MOVF AARGB0,W
XORWF BARGB0,W
MOVWF TEMP
BTFSC TEMP,MSB
COMF SIGN,F
GOTO CA1616S
COMF BARGB1, F
COMF BARGB0, F
INCF BARGB1, F
BTFSC STATUS,Z
INCF BARGB0, F
CA1616S
GOTO C1616SX
COMF AARGB1, F
COMF AARGB0, F
INCF AARGB1, F
BTFSC STATUS,Z
INCF AARGB0, F
C1616SX
MOVF AARGB0,W
IORWF BARGB0,W
MOVWF TEMP
BTFSC TEMP,MSB
GOTO C1616SX1
C1616S
RLF AARGB0,W
RLF REMB1, F
RLF REMB0, F
MOVF BARGB1,W
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
RLF AARGB1, F
RLF AARGB0, F
MOVLW D'15'
MOVWF LOOPCOUNT
LOOPS1616
RLF AARGB0,W
RLF REMB1, F
RLF REMB0, F
MOVF BARGB1,W
BTFSS AARGB1,LSB
GOTO SADD66L
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
GOTO SOK66LL
SADD66L
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
SOK66LL
RLF AARGB1, F
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1616
BTFSC AARGB1,LSB
GOTO SOK66L
MOVF BARGB1,W
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
SOK66L
GOTO C1616SX4
C1616SOK
BTFSS SIGN,MSB
RETLW 0x00
COMF AARGB1, F
COMF AARGB0, F
INCF AARGB1, F
BTFSC STATUS,Z
INCF AARGB0, F
COMF REMB1, F
COMF REMB0, F
INCF REMB1, F
BTFSC STATUS,Z
INCF REMB0, F
RETLW 0x00
C1616SX1
GOTO C1616SX3
MOVF AARGB0,W
MOVF AARGB1,W
MOVWF REMB1
CLRF AARGB0
CLRF AARGB1
GOTO C1616SOK
C1616SX2
CLRF AARGB1
INCF AARGB1,F
RETLW 0x00
C1616SX3
COMF AARGB1,F
INCF TEMPB3,F
GOTO C1616S
C1616SX4
INCF REMB0,F
MOVF BARGB1,W
SUBWF REMB1,W
BTFSS STATUS,Z
GOTO C1616SOK
MOVF BARGB0,W
SUBWF REMB0,W
BTFSS STATUS,Z
GOTO C1616SOK
BTFSC STATUS,Z
INCF AARGB0,F
BTFSS AARGB0,MSB
GOTO C1616SOK
BSF FPFLAGS,NAN
RETLW 0xFF
;;************************************************************************************
********
;;************************************************************************************
********
;;
(A0,A1,A2,A3) + (R0,R1)
;; Parametro de entrada:
Pg2_UDIV_32x16
sBanco1
;FXD3216U
CLRF REMB0
CLRF REMB1
CLRF TEMP
RLF AARGB0,W
RLF REMB1, F
MOVF BARGB1,W
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
RLF AARGB0, F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216A
RLF AARGB0,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB0,LSB
GOTO UADD26LA
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26LA
UADD26LA
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26LA
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPU3216A
RLF AARGB1,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB0,LSB
GOTO UADD26L8
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26L8
UADD26L8
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26L8
RLF AARGB1, F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216B
RLF AARGB1,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB1,LSB
GOTO UADD26LB
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26LB
UADD26LB
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26LB
RLF AARGB1, F
DECFSZ LOOPCOUNT, F
GOTO LOOPU3216B
RLF AARGB2,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB1,LSB
GOTO UADD26L16
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26L16
UADD26L16
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26L16
RLF AARGB2, F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216C
RLF AARGB2,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB2,LSB
GOTO UADD26LC
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26LC
UADD26LC
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26LC
RLF AARGB2, F
DECFSZ LOOPCOUNT, F
GOTO LOOPU3216C
RLF AARGB3,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB2,LSB
GOTO UADD26L24
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26L24
UADD26L24
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26L24
RLF AARGB3, F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216D
RLF AARGB3,W
RLF REMB1, F
RLF REMB0, F
RLF TEMP, F
MOVF BARGB1,W
BTFSS AARGB3,LSB
GOTO UADD26LD
SUBWF REMB1, F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0, F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP, F
GOTO UOK26LD
UADD26LD
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP, F
UOK26LD
RLF AARGB3, F
DECFSZ LOOPCOUNT, F
GOTO LOOPU3216D
BTFSC AARGB3,LSB
GOTO UOK26L
MOVF BARGB1,W
ADDWF REMB1, F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0, F
UOK26L
RETLW 0x00
;;Estamos aproximadamente al final de la pagina 2 de codigo FLASH
ORG 0x1730 ;Comienzo de Zona de Flash Data hasta 0x17F7 200 posiciones.
Pg2_FLASH_DATA_Inicio
dt " "
dt " "
dt " "
;Cada posición es un retlw del valor que hayamos puesto como caracter.
;4 palabras.
nop
ORG 0x17F9
Pg2_Byte_ConfiguracionIO_1
Pg2_Byte_ConfiguracionIO_2
Pg2_Byte_ConfiguracionIO_3
Pg2_Byte_ConfiguracionIO_4
Pg2_Byte_ConfiguracionIO_5
Pg2_Byte_ConfiguracionIO_6
Pg2_Byte_ConfiguracionIO_7
ORG 0x1800
Pg3_ProgramaLadder
retlw 0x7F
EndMemoriaFlash
retlw 0x7F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg3_WriteED
sBanco0
goto Pg3_WriteED_end
; Parametro de entrada:
movwf LOCAL_0
movlw 0x2F
movwf FSR
swapf INDF,W
movwf LOCAL_1
incf FSR,F
movf INDF,W
andlw 0x0F
iorwf LOCAL_1,F
pPagina0
call Pg0_EscribirEnEEPROM
pPagina3
Pg3_WriteED_end
movwf BUFFER_RX_2
pPagina0
call mandar_trama_a_maestro
pPagina3
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg3_ReadED
sBanco0
; Parametro de entrada:
movwf LOCAL_0
; Parametro de entrada:
pPagina0
call Pg0_LeerDeEEPROM
pPagina3
sBanco0
swapf LOCAL_1,W
andlw 0x0F
movwf 0x2F
movf LOCAL_1,W
andlw 0x0F
movwf 0x30
Pg3_ReadED_end
movlw .3
;movwf BUFFER_RX_2
pPagina0
call mandar_trama_a_maestro
pPagina3
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg3_PonerCPUaSTOP
sBanco3
clrf B3_ByteIO_P1_p8
clrf B3_ByteIO_P9_p16
clrf B3_ByteIO_P17_p24
clrf B3_ByteIO_P25_p32
clrf B3_ByteIO_P33_p40
;bsf PCLATH,3
pPagina1
call Pg1_EntradasSalidas
pPagina3
;bcf PCLATH,3
sBanco0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg3_LimpiarZonaLCD
movlw 0x27
iorlw 0x80
movwf FSR
Pg3_LimpiezaZonaLCD
movwf INDF
movlw 0x4E
addlw .1
iorlw 0x80
goto Pg3_LimpiezaZonaLCD
bcf STATUS,IRP
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pg3_RespondeTramaVersion
;ping-pong
sBanco0
movlw .2
movlw .1
pPagina0
call mandar_trama_a_maestro
pPagina3
return
org 0x1FFF
nop