Escolar Documentos
Profissional Documentos
Cultura Documentos
;--------------------------------------------------------ENCABEZADO--------------------------------------------------
;------------------------------------------------CONFIGURACIÓN DE BITS-----------------------------------------
__CONFIG
_CP_ALL&_DEBUG_OFF&_WRT_ENABLE_OFF&_CPD_ON&_LVP_OFF&_BODEN_OF
F&_PWRTE_ON&_WDT_OFF&_XT_OSC
; protección de datos, debug desactivado, no verificar tensión PIC, protección de la EEPROM activada
; programación con bajo voltaje desactivada, boden desactivado, reset por conexión a alimentación activo
; watchdog desactivado y usamos cristal.
;------------------------------------------------CONFIGURACIÓN DE PINES----------------------------------------
;--------------------------------------------------DEFINICIÓN DE FLAG----------------------------------------------
;-------------------------------------------CONFIGURACIÓN DE MEMORIA--------------------------------------
WWW EQU .32 ; Sirve para guardar W cuando entramos en una interrupción
ESTADO EQU .33 ; Sirve para guardar STATUS cuando entramos en interrp.
TEMP1 EQU .34 ; Almacenar variables temporales
TEMP2 EQU .35
TEMP3 EQU .36
TEMP4 EQU .37
CONTA_1 EQU .38 ; Contadores
CONTA_2 EQU .39
CONTA_3 EQU .40
CONTA_4 EQU .41
CONTA_5 EQU .42
DP1 EQU .43 ; Datos a representar en el LCD, números
DP2 EQU .44
DP3 EQU .45
DP4 EQU .46
DP5 EQU .47
DP6 EQU .48
DP7 EQU .49
DP8 EQU .50
DP9 EQU .51
DP10 EQU .52
DP11 EQU .53
DP12 EQU .54
DP13 EQU .55
DP14 EQU .56
DP15 EQU .57
POTE_G EQU .58 ; Valor potenciómetro de Graves
POTE_M EQU .59 ; Valor potenciómetro de Medios
POTE_A EQU .60 ; Valor potenciómetro de Agudos
POTE_GA EQU .61 ; Valor potenciómetro de Ganancia
FLASH_N EQU .62 ; Registro para saber en que potenciómetro nos encontramos
FLAG EQU .63 ; Registro para la representación del LCD
DX1 EQU .64 ; Registros temporales para el LCD
DX2 EQU .65
DX3 EQU .66
DX4 EQU .67
RETARDO1 EQU .68 ; Retardo (parpadeo)
DIR1 EQU .69 ; Registros temporales para la lect y escrit de la EEPROM
DIR2 EQU .70
DIR3 EQU .71
DIR4 EQU .72
;---------------------------------------------------------MACROS---------------------------------------------------------
;-------------------------------------------------VECTORES DE RESET-----------------------------------------------
;---------------------------------------------------INTERRUPCIONES--------------------------------------------------
movf RETARDO1,F
btfss STATUS,Z ; Si el retardo (parpadeo) es 0 salta una instrucción
decf RETARDO1,F ; Decremento retardo (parpadeo) si no es 0
BAJ
movf DP1,W
movwf DX1 ; Guardamos datos DP1 en temporales DX1
movf DP2,W
movwf DX2
movf DP3,W
movwf DX3
movf DP4,W
movwf DX4
movlw A' ' ; Espacio
movwf DP1 ; Guardamos lo que tenemos en W en DP
movwf DP2
movwf DP3
movwf DP4
call PRESENTAR ; Presentamos los valores en el LCD
movf DX1,W
movwf DP1 ; Guardamos en DP lo que tenemos en temporales DX
movf DX2,W
movwf DP2
movf DX3,W
movwf DP3
movf DX4,W
movwf DP4
goto SAL1 ; Vamos a SAL1
MED
movf DP5,W
movwf DX1 ; Guardamos datos DP en temporales DX
movf DP6,W
movwf DX2
movf DP7,W
movwf DX3
movf DP8,W
movwf DX4
movlw A' ' ; Espacio
movwf DP5 ; Guardamos lo que tenemos en W en DP
movwf DP6
movwf DP7
movwf DP8
call PRESENTAR ; Presentamos los valores en el LCD
movf DX1,W
movwf DP5 ; Guardamos en DP lo que tenemos en temporales DX
movf DX2,W
movwf DP6
movf DX3,W
movwf DP7
movf DX4,W
movwf DP8
goto SAL1 ; Vamos a SAL1
AGU
movf DP9,W
movwf DX1 ; Guardamos datos DP en temporales DX
movf DP10,W
movwf DX2
movf DP11,W
movwf DX3
movf DP12,W
movwf DX4
movlw A' ' ; Espacio
movwf DP9 ; Guardamos lo que tenemos en W en DP
movwf DP10
movwf DP11
movwf DP12
call PRESENTAR ; Presentamos los valores en el LCD
movf DX1,W
movwf DP9 ; Guardamos en DP lo que tenemos en temporales DX
movf DX2,W
movwf DP10
movf DX3,W
movwf DP11
movf DX4,W
movwf DP12
goto SAL1 ; Vamos a SAL1
GAN
movf DP13,W
movwf DX1 ; Guardamos datos DP en temporales DX
movf DP14,W
movwf DX2
movf DP15,W
movwf DX3
movlw A' ' ; Espacio
movwf DP13 ; Guardamos lo que tenemos en W en DP
movwf DP14
movwf DP15
call PRESENTAR ; Presentamos los valores en el LCD
movf DX1,W
movwf DP13 ; Guardamos en DP lo que tenemos en temporales DX
movf DX2,W
movwf DP14
movf DX3,W
movwf DP15
SAL1
bcf FLASH_E ; Ponemos a 0 el flag del parpadeo
swapf ESTADO,W
movwf STATUS ; Guardamos en STATUS lo que tenemos en ESTADO
swapf WWW,F
swapf WWW,W ; Guardamos en W lo que tenemos en WWW
retfie
SAL2
call PRESENTAR ; Presentamos en el LCD
bsf FLASH_E ; Ponemos a 1 el flag del parpadeo
swapf ESTADO,W
movwf STATUS ; Guardamos en STATUS lo que tenemos en ESTADO
swapf WWW,F
swapf WWW,W ; Guardamos en W lo que tenemos en WWW
retfie
;------------------------------------------------------------------------------------------------------------------------------
;---------------------------------------------------------RETARDOS-----------------------------------------------------
QWE0
nop
decfsz CONTA_1,F
goto QWE0
return
;------------------------------------------------------------------------------------------------------------------------------
QWE1
nop
decfsz CONTA_1,F
goto QWE1
return
;------------------------------------------------------------------------------------------------------------------------------
QWE2
nop
decfsz CONTA_1,F
goto QWE2
return
;------------------------------------------------------------------------------------------------------------------------------
QWE3
movlw .237
movwf CONTA_2
QWE4
nop
decfsz CONTA_2,F
goto QWE4
decfsz CONTA_1,F
goto QWE3
return
;------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
QWE5
movlw .181
movwf CONTA_4
QWE6
nop
nop
decfsz CONTA_4,F
goto QWE6
decfsz CONTA_3,F
goto QWE5
return
;------------------------------------------------------------------------------------------------------------------------------
QWE7
movlw .41
movwf CONTA_4
QWE8
movlw .73
movwf CONTA_5
QWE9
clrwdt
decfsz CONTA_5,F
goto QWE9
decfsz CONTA_4,F
goto QWE8
decfsz CONTA_3,F
goto QWE7
return
;--------------------------------------------------------------LCD----------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
;-----------------------------------------REPRESENTACIÓN A ESCALA--------------------------------------------
ARR_G ; Si es negativo
movlw .128
movwf TEMP2
movf TEMP1,W
subwf TEMP2,W ; Hacemos 128 menos TEMP2 y guardamos en TEMP2
movwf TEMP1 ; Lo guardamos en TEMP1
movlw A'-'
movwf DP1 ; Cargamos en DP1 el signo negativo
TRE1
incf DP2,F ; Incrementa en 1 el valor de DP2
movlw .100
subwf TEMP1,F ; Hace TEMP1 menos 100 y guardamos en TEMP1
btfsc STATUS,C ; Si el acarreo es 0 saltamos una instrucción (negativo)
goto TRE1 ; Si el acarreo es 1 volvemos a TRE1 (positivo)
movlw .100
addwf TEMP1,F ; Sumamos 100 a TEMP1
decf DP2,F ; Decremento en uno el valor de DP2
movlw .48
addwf DP2,F ; Sumamos 48 a DP2
TRE2
incf DP3,F ; Incremento en 1 el valor de DP3
movlw .10
subwf TEMP1,F ; Restamos 10 a TEMP1 y guardamos en TEMP1
btfsc STATUS,C ; Si el acarreo es 0 saltamos una instrucción (negativo)
goto TRE2 ; Si el acarreo es 1 volvemos a TRE2 (positivo)
movlw .10
addwf TEMP1,F ; Sumamos 10 a TEMP1
decf DP3,F ; Restamos 1 a DP3
movlw .48
addwf DP3,F ; Sumamos 48 a DP3
movf TEMP1,W
movwf DP4 ; Guardamos en DP4 el valor de TEMP1
movlw .48
addwf DP4,F ; Sumamos 48 a DP4
return
;------------------------------------------------------------------------------------------------------------------------------
movwf DP7
movwf DP8
return
NO_CERO_M
btfss STATUS,C
goto ARR_M
movlw .128
subwf TEMP1,F
movlw A'+'
movwf DP5
goto TRE3
ARR_M
movlw .128
movwf TEMP2
movf TEMP1,W
subwf TEMP2,W
movwf TEMP1
movlw A'-'
movwf DP5
TRE3
incf DP6,F
movlw .100
subwf TEMP1,F
btfsc STATUS,C
goto TRE3
movlw .100
addwf TEMP1,F
decf DP6,F
movlw .48
addwf DP6,F
TRE4
incf DP7,F
movlw .10
subwf TEMP1,F
btfsc STATUS,C
goto TRE4
movlw .10
addwf TEMP1,F
decf DP7,F
movlw .48
addwf DP7,F
movf TEMP1,W
movwf DP8
movlw .48
addwf DP8,F
return
;------------------------------------------------------------------------------------------------------------------------------
NO_CERO_A
btfss STATUS,C
goto ARR_A
movlw .128
subwf TEMP1,F
movlw A'+'
movwf DP9
goto TRE5
ARR_A
movlw .128
movwf TEMP2
movf TEMP1,W
subwf TEMP2,W
movwf TEMP1
movlw A'-'
movwf DP9
TRE5
incf DP10,F
movlw .100
subwf TEMP1,F
btfsc STATUS,C
goto TRE5
movlw .100
addwf TEMP1,F
decf DP10,F
movlw .48
addwf DP10,F
TRE6
incf DP11,F
movlw .10
subwf TEMP1,F
btfsc STATUS,C
goto TRE6
movlw .10
addwf TEMP1,F
decf DP11,F
movlw .48
addwf DP11,F
movf TEMP1,W
movwf DP12
movlw .48
addwf DP12,F
return
;------------------------------------------------------------------------------------------------------------------------------
TRE7
incf DP13,F ; Aumentamos en 1 el valor de DP13 y guardamos en DP13
movlw .100
subwf TEMP1,F ; Restamos 100 a TEMP1
btfsc STATUS,C ; Si es 0 el acarreo saltamos una instrucción (negativo)
goto TRE7 ; Si no es 0 el acarreo volvemos a TRE7 (positivo)
movlw .100
addwf TEMP1,F ; Sumamos 100 a TEMP1 y guardamos en TEMP1
decf DP13,F ; Restamos 1 a DP13 y guardamos en DP13
movlw .48
addwf DP13,F ; Sumamos 48 a DP13 y guardamos en DP13
TRE8
incf DP14,F ; Sumamos 1 a DP14 y guardamos en DP14
movlw .10
subwf TEMP1,F ; Restamos 10 a TEMP1
btfsc STATUS,C ; Si el acarreo es 0 saltamos una instrucción
goto TRE8 ; Si el acarreo es 1 volvemos a TRE8
movlw .10
addwf TEMP1,F ; Sumamos 10 a TEMP1 y guardamos en TEMP1
decf DP14,F ; Restamos 1 a DP14 y guardamos en DP14
movlw .48
addwf DP14,F ; Sumamos 48 a DP14 y guardamos en DP14
movf TEMP1,W
movwf DP15 ; Guardamos en DP15 el valor de TEMP1
movlw .48
addwf DP15,F ; Sumamos 48 a DP15 y guardamos en DP15
return
;------------------------------------------------------------------------------------------------------------------------------
call DATO_D
movlw A'n' ;n
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movf DP13,W ; Centenas del potenciómetro de ganancia
call DATO_D
movf DP14,W ; Decenas del potenciómetro de ganancia
call DATO_D
movf DP15,W ; Unidades del potenciómetro de ganancia
call DATO_D
return
;--------------------------------------------LECTURA DE LA EEPROM----------------------------------------------
;--------------------------------------------------------PROGRAMA-----------------------------------------------------
movlw .0
movwf DIR1 ; Dirección 1 apunta a 0
movlw .1
movwf DIR2 ; Dirección 2 apunta a 1
movlw .2
movwf DIR3 ; Dirección 3 apunta a 2
movlw .3
movwf DIR4 ; Dirección 4 apunta a 3
call LEER_EEPROM ; Leemos la EEPROM
movlw B'00000000'
movwf PIR1 ; Configuro las interrupciones por TMR1
movlw B'11000000'
movwf INTCON ; Activa unmasked interrupciones
movlw B'00110001'
movwf T1CON ; 1:8 prescale value, enable timer1
call PRESENTAR ; Presentación de los datos en el LCD
call ENVIAR_GR_GA ; Transmite al pote de Ganancia-Graves la posición
call ENVIAR_ME_AG ; Transmite al pote de Medios-Agudos la posición
NO_FLASH
movlw .0
movwf FLASH_N ; Damos valor 0 a FLASH_N (ningún pote)
movlw .30
movwf RETARDO1 ; Retardo (parpadeo)
movlw .1
movwf FLASH_N ; Colocamos un 1 en FLASH_N (Potenciómetro de Graves)
btfss CAMBIO ; Volvemos a comprobar CAMBIO. Si esta pulsado salta a POTE_GRAVES
goto $-1
goto POTE_GRAVES
SALTA1
btfsc BAJA ; Si se pulsa BAJA salta una instrucción
goto SALTA2 ; Si no se pulsa BAJA vamos a SALTA2
movlw .1
subwf POTE_G,W ; Restamos 1 al valor de POTE_G
btfsc STATUS,Z ; Si la operación no es 0 saltamos una instrucción
goto SALTA3 ; Si la operación es 0 vamos a SALTA3
decf POTE_G,F ; Restamos una posición a POTE_G y guardamos
movf POTE_G,W ; Pasamos POTE_G a W
call CONVERTIR_G ; Convertimos a escala
movlw .30
movwf RETARDO1 ; Retardo (parpadeo)
bcf INTCON,GIE ; Desactivamos las interrupciones
call PRESENTAR ; Presentamos en el LCD los datos actuales
call ENVIAR_GR_GA ; Transmite al pote de Ganancia-Graves los datos
goto SALTA3 ; Vamos a SALTA3
SALTA2
bsf INTCON,GIE ; Activamos las interrupciones
SALTA3
movf RETARDO1,F
btfsc STATUS,Z ; Si el retardo (parpadeo) no es 0 saltamos una instrucción
goto NO_FLASH ; Si el retardo (parpadeo) es 0 vamos a NO_FLASH (inicio)
btfsc CAMBIO ; Si se pulsa CAMBIO salta una instrucción
goto POTE_GRAVES ; Si no se pulsa CAMBIO volvemos a POTE_GRAVES
movlw .30
movwf RETARDO1 ; Vuelve a cargar retardo (parpadeo)
movlw .2
movwf FLASH_N ; Colocamos un 2 en FLASH_N (Potenciómetro de Medios)
btfss CAMBIO ; Si no se pulsa CAMBIO vamos a POTE_MEDIOS
goto $-1
goto POTE_MEDIOS
;------------------------------------------------------------------------------------------------------------------------------
SALTA4
btfsc BAJA
goto SALTA5
movlw .1
subwf POTE_M,W
btfsc STATUS,Z
goto SALTA6
decf POTE_M,F
movf POTE_M,W
call CONVERTIR_M
movlw .30
movwf RETARDO1
bcf INTCON,GIE
call PRESENTAR
call ENVIAR_ME_AG
goto SALTA6
SALTA5
bsf INTCON,GIE
SALTA6
movf RETARDO1,F
btfsc STATUS,Z
goto NO_FLASH
btfsc CAMBIO
goto POTE_MEDIOS
movlw .30
movwf RETARDO1
movlw .3
movwf FLASH_N
btfss CAMBIO
goto $-1
goto POTE_AGUDOS
;------------------------------------------------------------------------------------------------------------------------------
SALTA7
btfsc BAJA
goto SALTA8
movlw .1
subwf POTE_A,W
btfsc STATUS,Z
goto SALTA9
decf POTE_A,F
movf POTE_A,W
call CONVERTIR_A
movlw .30
movwf RETARDO1
bcf INTCON,GIE
call PRESENTAR
call ENVIAR_ME_AG
goto SALTA9
SALTA8
bsf INTCON,GIE
SALTA9
movf RETARDO1,F
btfsc STATUS,Z
goto NO_FLASH
btfsc CAMBIO
goto POTE_AGUDOS
movlw .30
movwf RETARDO1
movlw .4
movwf FLASH_N
btfss CAMBIO
goto $-1
goto POTE_GANANCIA
;------------------------------------------------------------------------------------------------------------------------------
SALTA10
btfsc BAJA
goto SALTA11
movlw .0
subwf POTE_GA,W
btfsc STATUS,Z
goto SALTA11
decf POTE_GA,F
movf POTE_GA,W
call CONVERTIR_GA
movlw .30
movwf RETARDO1
bcf INTCON,GIE
call PRESENTAR
call ENVIAR_GR_GA
goto SALTA12
SALTA12
movf RETARDO1,F
btfsc STATUS,Z
goto NO_FLASH
btfsc CAMBIO
goto POTE_GANANCIA
movlw .0
movwf FLASH_N
btfss CAMBIO
goto $-1
goto NO_FLASH
;------------------------------------------------------------------------------------------------------------------------------
QWE10
movlw .40
movwf CONTA_4
QWE11
movlw .72
movwf CONTA_5
QWE12
btfsc MEMORIA ; Si se pulsa MEMO más de 2 segundos salta una instrucción
goto LEER ; En caso de pulsar por menos de 2 segundos vamos a LEER
decfsz CONTA_5,F
goto QWE12
decfsz CONTA_4,F
goto QWE11
decfsz CONTA_3,F
goto QWE10
goto GUARDAR ; Después de esperar 2 segundos vamos a GUARDAR
DAS1
nop
btfsc EECON1,WR ; Si el ciclo de escritura terminó, saltamos una instrucción
goto DAS1 ; Si no ha terminado el ciclo de escritura volvemos a DAS1
btfsc EECON1,WRERR ; Si no hay error de escritura, saltamos una instrucción
goto GUARDAR ; Si hay error de escritura volvemos a GUARDAR
bcf STATUS,RP0
bcf STATUS,RP1 ; Seleccionamos el banco 0
DAS2
movf POTE_M,W ; Guardamos la posición 01 de la EEPROM
bsf STATUS,RP1
bcf STATUS,RP0
movwf EEDATA
movlw .1
movwf EEADR ; Guardamos el valor POTE_M en la dirección 1 (Medios)
bsf STATUS,RP0
bcf EECON1,WRERR
bcf EECON1,WR
bcf EECON1,EEPGD
bsf EECON1,WREN
movlw 0X55
movwf EECON2
movlw 0XAA
movwf EECON2
bsf EECON1,WR
bcf EECON1,WREN
DAS3
nop
btfsc EECON1,WR
goto DAS3
btfsc EECON1,WRERR
goto DAS2
DAS4
movf POTE_A,W ; Guardamos la posición 02 de la EEPROM
bsf STATUS,RP1
bcf STATUS,RP0
movwf EEDATA
movlw .2
movwf EEADR ; Guardamos el valor POTE_A en la dirección 2 (Agudos)
bsf STATUS,RP0
bcf EECON1,WRERR
bcf EECON1,WR
bcf EECON1,EEPGD
bsf EECON1,WREN
movlw 0X55
movwf EECON2
movlw 0XAA
movwf EECON2
bsf EECON1,WR
bcf EECON1,WREN
DAS5
nop
btfsc EECON1,WR
goto DAS5
btfsc EECON1,WRERR
goto DAS4
bcf STATUS,RP0
bcf STATUS,RP1
DAS6
movf POTE_GA,W ; Guardamos la posición 03 de la EEPROM
bsf STATUS,RP1
bcf STATUS,RP0
movwf EEDATA
movlw .3
movwf EEADR ; Guardamos el valor POTE_GA en la dirección 3 (Ganancia)
bsf STATUS,RP0
bcf EECON1,WRERR
bcf EECON1,WR
bcf EECON1,EEPGD
bsf EECON1,WREN
movlw 0X55
movwf EECON2
movlw 0XAA
movwf EECON2
bsf EECON1,WR
bcf EECON1,WREN
DAS7
nop
btfsc EECON1,WR
goto DAS7
btfsc EECON1,WRERR
goto DAS6
movlw .4
movwf DIR1 ; La dirección 1 apunta a 4
movlw .5
movwf DIR2 ; La dirección 2 apunta a 5
movlw .6
movwf DIR3 ; La dirección 3 apunta a 6
movlw .7
movwf DIR4 ; La dirección 4 apunta a 7
call LEER_EEPROM ; Leemos la EEPROM
movlw B'00000001' ; Limpiamos el LCD
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'1' ;1
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
;------------------------------------------------------------------------------------------------------------------------------
movlw .8
movwf DIR1 ; La dirección 1 apunta a 8
movlw .9
movwf DIR2 ; La dirección 2 apunta a 9
movlw .10
movwf DIR3 ; La dirección 3 apunta a 10
movlw .11
movwf DIR4 ; La dirección 4 apunta a 11
call LEER_EEPROM ; Leemos la EEPROM
movlw B'00000001' ; Limpiamos el LCD
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'2' ;2
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'o' ;o
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; Volvemos al programa
;------------------------------------------------------------------------------------------------------------------------------
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'3' ;3
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'o' ;o
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; Volvemos al programa
;------------------------------------------------------------------------------------------------------------------------------
movlw .16
movwf DIR1 ; La dirección 1 apunta a 16
movlw .17
movwf DIR2 ; La dirección 2 apunta a 17
movlw .18
movwf DIR3 ; La dirección 3 apunta a 18
movlw .19
movwf DIR4 ; La dirección 4 apunta a 19
call LEER_EEPROM
movlw B'00000001' ; Limpiamos el LCD
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'4' ;4
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
call DATO_D
movlw A'a' ;a
;----------------------------------------------RUTINAS DE TRANSMISIÓN-----------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
'TEMP3'
movlw .8
movwf TEMP4 ; Inicializa el contador
GFD
bcf CLK ; Baja la línea de Clock
bcf DAT ; Baja la línea de Datos
btfsc TEMP3,7 ; Comprueba el bit, si es 0 lo deja igual
bsf DAT ; Y lo sube si es uno
nop
nop
bsf CLK ; Da un pulso de reloj
rlf TEMP3,F ; Rotamos a la izquierda 'TEMP3'
decfsz TEMP4,F ; Decrementamos. Comprobamos q hemos enviado los 8 bits
goto GFD ; Si no, repetimos el bucle
return ; Volvemos al programa
;------------------------------------------------DATOS DE LA EEPROM----------------------------------------------
ORG H'2100'
; Preset MEMO. Inicial todo en posición media.
data .128 ; Dato menor 1, cero 128, dato mayor 255
data .128 ; Dato menor 1, cero 128, dato mayor 255
data .128 ; Dato menor 1, cero 128, dato mayor 255
data .128 ; Dato menor 0, dato mayor 255
; Preset 4 (Normal)
data .170 ; Dato menor 1, cero 128, dato mayor 255
data .140 ; Dato menor 1, cero 128, dato mayor 255
data .100 ; Dato menor 1, cero 128, dato mayor 255
data .128 ; Dato menor 0, dato mayor 255
;---------------------------------------------------------------------------------------------------
end ; Fin del programa