LIST P=16F84 FSR EQU 04h INDF EQU 00h TRISA EQU 85h TRISB EQU 86h PORTA EQU 05h PORTB EQU 06h STATUS EQU 03h PCL EQU 02h INTCON EQU 0Bh PCLATH EQU 0Ah GUARDA EQU 0Ch MEMORY EQU 0Eh REG4 EQU 16h REG5 EQU 17h DIR EQU 10h DAT EQU 11h TRASLADOR EQU 4Dh DIG1 EQU 4Ch DIG2 EQU 4Bh DIG3 EQU 4Ah COUNTER EQU 12h REG3 EQU 13h TX EQU 14h RX EQU 15h REGH EQU 18h REGW EQU 19h EXT EQU 20h REG1 EQU 21h REG2 EQU 22h REG6 EQU 23h REG7 EQU 24h #DEFINE DATA PORTA,0 #DEFINE CLK PORTA,1 #DEFINE BANK1 BSF STATUS,5 #DEFINE BANK0 BCF STATUS,5 #DEFINE ENABLE PORTA,4 #DEFINE RS PORTA,3 #DEFINE RW PORTA,2 #DEFINE BF PORTB,1 #DEFINE BTX TX,7 #DEFINE BRX RX,0 #DEFINE LOAD PORTB,2 #DEFINE WAY PORTB,0 #DEFINE PULW PORTB,6 #DEFINE PULR PORTB,7 #DEFINE MRS MEMORY,4 #DEFINE MRW MEMORY,6 #DEFINE MC MEMORY,5 #DEFINE MACK MEMORY,0 #DEFINE MADC MEMORY,2 #DEFINE MWACK MEMORY,1 ORG 00 GOTO INICIO ORG 04 CALL TIME ;llamado al retardo de antirrebote CALL TIME CALL TIME CALL TIME CALL TIME MOVF PORTB,0 ;carga el estado de los pulsadores ANDLW 0XC0 MOVWF EXT BTFSS EXT,7 ;pregunta si es pulsador de GOTO LECTU ;lectura BTFSS EXT,6 ;pregunta si es pulsador de GOTO ESCRI ;escritura GOTO LOOP3 ESCRI ;rutina para escritura de un dato en la ;memoria BCF MRW BSF MADC BCF MWACK BCF LOAD NOP BSF LOAD BCF WAY CALL RXBUF BSF WAY MOVF RX,0 MOVWF DAT CALL LCD CALL BYTEWRITE CALL LCD CALL PAUSA INCF DIR,1 MOVF DIR,0 XORLW 0X10 BTFSC STATUS,2 CALL LABEL6 GOTO LOOP3 LOOP2 CALL BSTOP RETURN LOOP3 BCF INTCON,0 RETFIE LECTU ;rutina de lectura de un dato en ;la memoria BSF MRW BSF MADC BSF MWACK CALL BYTEREAD CALL LCD CALL PAUSA INCF DIR,1 MOVF DIR,0 XORLW 0X10 BTFSC STATUS,2 CALL LABEL6 GOTO LOOP3 BYTEWRITE ;rutina para envio de comandos y ;datos cuando se va a escribir la ;memoria MOVLW 0XA0 MOVWF TX CALL BSTART CALL SEND BTFSC BRX GOTO LOOP2 MOVF DIR,0 MOVWF TX CALL SEND BTFSC BRX GOTO LOOP2 MOVF DAT,0 MOVWF TX CALL SEND BTFSC BRX GOTO LOOP2 CALL BSTOP CALL TIME MOVLW 0XA0 MOVWF TX CALL BSTART CALL SEND BTFSC BRX GOTO LOOP2 MOVF DIR,0 MOVWF TX CALL SEND BTFSC BRX GOTO LOOP2 MOVLW 0XA1 MOVWF TX CALL BSTART CALL SEND BTFSC BRX GOTO LOOP2 CALL RECEIVER CALL BSTOP MOVF RX,0 XORWF DAT,0 BTFSS STATUS,2 GOTO BYTEWRITE RETURN LABEL6 CLRF DIR CALL MENSAJE CALL PAUSA RETURN BYTEREAD ;rutina de envio de comandos para ;leer la memoria MOVLW 0XA0 MOVWF TX CALL BSTART CALL SEND BTFSC BRX GOTO LOOP2 MOVF DIR,0 MOVWF TX CALL SEND BTFSC BRX GOTO LOOP2 MOVLW 0XA1 MOVWF TX CALL BSTART CALL SEND BTFSC BRX GOTO LOOP2 CALL RECEIVER CALL BSTOP MOVF RX,0 MOVWF DAT RETURN BCD ;rutina de correccion de binario a ;BCD MOVWF TRASLADOR CLRF DIG1 CLRF DIG2 CLRF DIG3 MOVLW 0X08 MOVWF COUNTER LEVEL1 MOVLW 0X4A MOVWF FSR LEVEL2 MOVLW 0X05 SUBWF INDF,0 BTFSC STATUS,0 CALL CORRECION BCF MC BTFSC STATUS,0 BSF MC DECF FSR,1 BCF STATUS,0 BTFSC MC BSF STATUS,0 RLF INDF,1 INCF FSR,1 INCF FSR,1 MOVF FSR,0 XORLW 0X4D BTFSS STATUS,2 GOTO LEVEL2 RLF INDF,1 BCF MC BTFSC STATUS,0 BSF MC DECF FSR,1 BCF STATUS,0 BTFSC MC BSF STATUS,0 RLF INDF,1 DECFSZ COUNTER GOTO LEVEL1 RETURN CORRECION ;suma 11 cuando el dato al que ;apunta el fsr es mayor que cuatro SWAPF INDF,1 MOVLW 0XB0 ADDWF INDF,1 SWAPF INDF,1 RETURN MENSAJE ;rutina para visualización de mensaje ;de llenado de memoria MOVLW 0X38 CALL COMANDO MOVLW 0X0C CALL COMANDO MOVLW 0X06 CALL COMANDO MOVLW 0X01 CALL COMANDO MOVLW 0XC2 CALL COMANDO MOVLW "P" CALL ASCII MOVLW "O" CALL ASCII MOVLW "S" CALL ASCII MOVLW "I" CALL ASCII MOVLW "C" CALL ASCII MOVLW "I" CALL ASCII MOVLW "O" CALL ASCII MOVLW "N" CALL ASCII MOVLW "E" CALL ASCII MOVLW "S" CALL ASCII MOVLW " " CALL ASCII MOVLW "C" CALL ASCII MOVLW "O" CALL ASCII MOVLW "M" CALL ASCII MOVLW "P" CALL ASCII MOVLW "L" CALL ASCII MOVLW "E" CALL ASCII MOVLW "T" CALL ASCII MOVLW "A" CALL ASCII MOVLW "S" RETURN LCD ;rutina para visualización de los datos ;que se van a escribir o leer en la memoria MOVLW 0X38 CALL COMANDO MOVLW 0X0C CALL COMANDO MOVLW 0X06 CALL COMANDO MOVLW 0X01 CALL COMANDO BTFSS MADC GOTO LOOP4 MOVLW 0X81 CALL COMANDO MOVF DIR,0 CALL BCD MOVF DIG2,1 BTFSC STATUS,2 GOTO LOOP5 MOVLW 0X03 MOVWF PCLATH MOVF DIG2,0 CALL TABLA CALL ASCII LOOP6 MOVLW 0X03 MOVWF PCLATH MOVF DIG1,0 CALL TABLA CALL ASCII LOOP4 MOVLW 0X85 CALL COMANDO MOVF DAT,0 CALL BCD MOVLW 0X03 MOVWF PCLATH MOVF DIG3,0 CALL TABLA CALL ASCII MOVLW "." CALL ASCII MOVLW 0X03 MOVWF PCLATH MOVF DIG2,0 CALL TABLA CALL ASCII MOVLW 0X03 MOVWF PCLATH MOVF DIG1,0 CALL TABLA CALL ASCII MOVLW 0X8B CALL COMANDO MOVLW "V" CALL ASCII MOVLW "o" CALL ASCII MOVLW "l" CALL ASCII MOVLW "t" CALL ASCII MOVLW "i" CALL ASCII MOVLW "o" CALL ASCII MOVLW "s" CALL ASCII BTFSS MADC GOTO LOOP7 BTFSC MWACK GOTO LOOP13 MOVLW 0X93 CALL COMANDO BTFSS MACK GOTO LABEL1 MOVLW "N" CALL ASCII MOVLW "O" CALL ASCII LABEL2 MOVLW "A" CALL ASCII MOVLW "C" CALL ASCII MOVLW "K" CALL ASCII LOOP13 MOVLW 0XCA CALL COMANDO BTFSC MRW GOTO READ WRITE MOVLW 0X14 MOVWF REGW WW MOVLW 0X03 MOVWF PCLATH MOVF REGW,0 CALL TABLA CALL ASCII INCF REGW,1 MOVF REGW,0 XORLW 0X19 BTFSS STATUS,2 GOTO WW LOOP7 RETURN READ MOVLW 0X10 MOVWF REGW WX MOVLW 0X03 MOVWF PCLATH MOVF REGW,0 CALL TABLA CALL ASCII INCF REGW,1 MOVF REGW,0 XORLW 0X14 BTFSS STATUS,2 GOTO WX RETURN LABEL1 MOVLW 0X95 CALL COMANDO GOTO LABEL2 LOOP5 MOVLW " " CALL ASCII GOTO LOOP6 COMANDO ;rutina para enviar un comando para ;el LCD BCF RS BTFSC RS ASCII ;rutina para envío de un dato al LCD BSF RS MOVWF GUARDA CALL BUSY MOVF GUARDA,0 MOVWF TX CALL TXBUF BSF ENABLE BCF ENABLE RETURN BUSY ;rutina para preguntar por la bandera ;de operación interna en el LCD MOVLW 0X80 MOVWF TX CALL TXBUF BCF MRS BTFSC RS BSF MRS BCF RS BSF RW BSF ENABLE BUCLE BTFSC BF GOTO BUCLE BCF ENABLE BCF RS BTFSC MRS BSF RS BCF RW RETURN TXBUF ;rutina para transmisión de un byte que se ;encuentra en el registro TX MOVLW 0X08 MOVWF COUNTER TXBUCLE BTFSC BTX BSF DATA CALL BITSEND RLF TX,1 DECFSZ COUNTER,1 GOTO TXBUCLE RETURN SEND ;rutina para transmisión de un byte con ;verificación de recepción por parte de ;la memoria (ACK) CALL TXBUF BCF MACK MOVLW 0XFF MOVWF REGH NOACK CALL BITRECEIVER BTFSS BRX GOTO ACK DECFSZ REGH,1 GOTO NOACK BSF MACK ACK RETURN BITSEND ;generación de pulsos de reloj en la linea ;serial clock BANK1 BCF TRISA,0 BANK0 BSF CLK NOP NOP BCF CLK RETURN RXBUF ;rutina para recepción de un byte MOVLW 0X08 MOVWF COUNTER CLRF RX RXBUCLE RLF RX,1 CALL BITRECEIVER DECFSZ COUNTER,1 GOTO RXBUCLE RETURN RECEIVER ;rutina para recepción de un byte y envío ;de reconocimiento CALL RXBUF BSF DATA CALL BITSEND RETURN BITRECEIVER ;envío de un pulso alto de reloj para ;recepción de un dato BANK1 BSF TRISA,0 BANK0 BCF BRX BSF CLK BTFSC DATA BSF BRX BCF CLK RETURN BSTOP ;protocolo para terminar la transmisión BCF DATA BANK1 BCF TRISA,0 BANK0 BSF CLK NOP BSF DATA NOP BCF CLK NOP BCF DATA RETURN BSTART ;protocolo para comenzar la transmisión ;del byte de control BSF DATA BANK1 BCF TRISA,0 BANK0 BSF CLK NOP BCF DATA NOP BCF CLK RETURN INICIO ;inicio del programa y configuración ;de registros especiales BANK1 CLRF TRISA MOVLW 0XC2 MOVWF TRISB BANK0 MOVLW 0X88 MOVWF INTCON CLRF PORTA MOVLW 0X05 MOVWF PORTB CLRF DIR BSF MACK BSF MRW NADA ;se carga el dato que viene del ADC BCF INTCON,3 BCF MADC BCF LOAD NOP BSF LOAD BCF WAY CALL RXBUF BSF WAY MOVF RX,0 MOVWF DAT CALL LCD BSF INTCON,3 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO GOTO NADA TIME ;retardo de espera para la operación de ;un byte de escritura MOVLW 0X32 MOVWF REG4 UNO MOVLW 0X64 MOVWF REG5 DOS DECFSZ REG5,1 GOTO DOS DECFSZ REG4,1 GOTO UNO RETURN PAUSA ;retardo para visualización de datos MOVLW 0X0F MOVWF REG1 LOOP8 MOVLW 0XFF MOVWF REG2 LOOP9 MOVLW 0XFF MOVWF REG3 LOOP10 DECFSZ REG3,1 GOTO LOOP10 DECFSZ REG2,1 GOTO LOOP9 DECFSZ REG1,1 GOTO LOOP8 RETURN RETARDO ;retardo para antirebote del pulsores MOVLW 0XFF MOVWF REG6 LOOP11 MOVLW 0XFF MOVWF REG7 LOOP12 DECFSZ REG7,1 GOTO LOOP12 DECFSZ REG6,1 GOTO LOOP11 RETURN ORG 305 TABLA ;tabla de codigos ascii para visualización ADDWF PCL,1 RETLW 0X30 RETLW 0X31 RETLW 0X32 RETLW 0X33 RETLW 0X34 RETLW 0X35 RETLW 0X36 RETLW 0X37 RETLW 0X38 RETLW 0X39 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW "R" RETLW "E" RETLW "A" RETLW "D" RETLW "W" RETLW "R" RETLW "I" RETLW "T" RETLW "E" END