LIST P=16F877
INCLUDE <P16F877.INC>
CONT0 EQU 0X20
CONT1 EQU 0X21
CONT2 EQU 0X22
CONT3 EQU 0X23
ADRES EQU 0X24
DATO EQU 0X25
SUM1 EQU 0X26
SUM2 EQU 0X27
DATOX EQU 0X28
DIRX EQU 0X29
DIR EQU 0X2A
ORG 0X00
BSF STATUS,5 ;IR A BANCO 1
MOVLW B'00000000'
MOVWF PORTA ;SE CONFIGURAN LAS PUERTAS COMO SALIDAS
MOVLW B'00000000'
MOVWF PORTB
MOVLW B'10000000' ;SE CONFIGURA LA RC7/TX COMO SALIDA DETRASMICION
MOVWF PORTC ;Y RC6/RX COMO ENTRADA DE RESEPCION
MOVLW B'00000000'
MOVWF PORTD
MOVLW B'00000000'
MOVWF PORTE
; COMIENSA CONFIGRUACION DE LA USART
MOVLW D'63' ;TRASMICION A 9600 BAUDIOS A 10MHz
MOVWF SPBRG ;SE CARGA BALOR AL BAUD RATE
BCF TXSTA,BRGH ;TRASMICION EN BAJA VELOCIDAD
BCF TXSTA,SYNC ;TRASMICION ASINCRONA
BCF STATUS,5 ;IR A BANCO 0
BSF RCSTA,SPEN ;ABILITA EL PUERTO SERIE
BSF STATUS,5 ;IR AL BANCO 1
BCF TXSTA,TX9 ;8 BITS DE DATOS
BSF TXSTA,TXEN ;AVILITA LA TRASMICION SERIAL, TXIF=1
BCF STATUS,5 ;IR A BANCO 0
BCF RCSTA,RX9 ;8 BITS DE DATOS
BSF RCSTA,CREN ;AVILITA RESEPCION CONTINUA
INICIO MOVLW D'10';'127'
MOVWF DIR
INICIO GOTO READ ;MUESTRA EL DATO GUARDADO EN LA MEMORIA EEPROM
BEGIN NOP
INICIO1 MOVLW B'00000001'
MOVWF PORTB
CALL PAUSA
MOVLW B'00000000'
MOVWF PORTB
MOVLW B'00000010'
MOVWF PORTB
CALL PAUSA
MOVLW B'00000000'
MOVWF PORTB
CLRF PORTB
;pROCESO DE COMUNICACION DE LA USART
;PROCESO DE RESEPCION
LEE BTFSS PIR1,RCIF ;PREGUNTA SI EL RX ES FULL RCIF=1
GOTO LEE ;NO VE A LEE
MOVFW RCREG ;SI W=RCREG Y PONE A CERO EL RCIF
MOVWF PORTB ;ESIBE EL DATO RECIVIDO
MOVWF DATO ;EL DATO RECIVIDO SE CARGA EN DATO
CALL PAUSA
CALL WRITE ;GUARDA EN LA EEPROM EL DATO
;PROCESO DE TRASMICION
ESCRIBE MOVFW DIR
MOVWF TXREG ;SE TRASMITE EL DATO
TRDATA BTFSS PIR1,TXIF ;ESPERA HASTA QUE TERMINE LA TRASMICION
GOTO TRDATA ;NO VE A TRDATA
CLRF TXREG
DECFSZ DIR,1
GOTO LEE ;VE A INICIO
GOTO READ
;ESCRITURA EN LA MEMORIA EEDATA
WRITE
MOVFW DIR ;CARGA LA DIRECION DONDE SE GUARDARA
MOVWF ADRES ;EL DATO
;MOVFW DATOX
;MOVWF DATO ;CARGA EL DATO A GUARDAR
BCF STATUS,RP0 ;Ir banco 0
BCF STATUS,RP1
MOVFW ADRES ;EEADR = ADDR_L
BCF STATUS,RP0 ;Ir banco 2
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP0 ;Ir banco 0
BCF STATUS,RP1
MOVFW DATO ;EEDATA = DATA_L
BCF STATUS,RP0 ;Ir banco 2
BSF STATUS,RP1
MOVWF EEDATA
BSF STATUS,RP0 ;Ir banco 3
BSF STATUS,RP1
BCF EECON1,EEPGD;Apuntar a la memoria EEPROM
BSF EECON1,WREN ;Habilitar escritura
BCF INTCON,GIE ;Deshabilita interrupciones
MOVLW 55h
MOVWF EECON2 ;Escribe 55 hexadecimal
MOVLW 0xAA
MOVWF EECON2 ;Escribe AA hexadecimal
BSF EECON1,WR ;Habilita el bit de escritura
BSF INTCON,GIE ;Habilita interrupciones
ESPERA
BTFSC EECON1,WR ;Espera el final de grabación
GOTO ESPERA ;Si no termina la grabación: Ir _bucle
BCF PIR2,EEIF ;Si termina Borra bandera de interrupción
BCF EECON1,WREN ;Deshabilitar escritura
BCF STATUS,RP0 ;Ir banco 0
BCF STATUS,RP1
RETURN ;Retorno
;PROCESO DE LECTURA DE LA EEPROM
READ
MOVLW D'10';127'
MOVWF DIRX
LOOP1 MOVFW DIRX
MOVWF ADRES
BCF STATUS,RP0 ;Ir banco 0
BCF STATUS,RP1
MOVFW ADRES ;Cargar dirección a leer
BCF STATUS,RP0 ;Ir banco 2
BSF STATUS,RP1
MOVWF EEADR
BSF STATUS,RP0 ;Ir banco 3
BSF STATUS,RP1
BCF EECON1,EEPGD;Apunta a la memoria EEPROM
BSF EECON1,RD ;Habilita ciclo de lectura
BCF STATUS,RP0 ;Ir banco 2
BSF STATUS,RP1
MOVFW EEDATA ;W = EEDATA (leer dato de EEPROM)
BCF STATUS,RP0 ;Ir banco 0
BCF STATUS,RP1
MOVWF DATO ;DATA_L = W (almacena dato de EEPROM)
MOVWF PORTB ;EXIBE EL DATO LEIDO
CALL PAUSA
MOVLW B'00000000'
MOVWF PORTB
CALL PAUSA
DECFSZ DIRX,1
GOTO LOOP1
GOTO INICIO
;PAUSA ENTRE DESTELLOS
PAUSA MOVLW D'150'
MOVWF CONT2
LOOP23 MOVLW D'30'
MOVWF CONT1
LOOP21 MOVLW D'50'
MOVWF CONT0
LOOP20 DECFSZ CONT0,1
GOTO LOOP20
DECFSZ CONT1,1
GOTO LOOP21
DECFSZ CONT2,1
GOTO LOOP23
RETURN
END