Este programa es una aplicacion del protocolo I2C que escribe un dato en la memoria dos hilos 24lc08 este mismo dato q escribe en la memoria lo envia por comunicacion serial usando la Usard el Max232 y funcionan perfectamente. se visualiza en la LCD el dato de 8 bit en Hexadecimal este mismo se ve en el PC con el Hiperterminal a 9600 Baudios y el pic usa un cristal de 4MHzINCLUDE "P16F877A.INC"
SD EQU 0
SC EQU 1
#DEFINE SDA PORTA,SD ; PIN LINEA DE DATOS
#DEFINE SCL PORTA,SC ; PIN LINEA DE RELOJ
;#DEFINE S_DATA_T TRISC,4 ; TRISC4 ENTRADA/SALIDA
;#DEFINE S_CLOCK_T TRISC,3 ; TRISC3 ENTRADA/SALIDA
#DEFINE RS PORTE,2
#DEFINE RW PORTE,1
#DEFINE EN PORTE,0
#DEFINE F_RX_COMPLETO 0X20,0
#DEFINE F_TEMP 0X20,1 ; BANDERA TEMPORAL (GENERICA)
#DEFINE F_COMANDO_LCD 0X20,2 ;
#DEFINE PULW PORTA,2 ; PULSADOR NEGRO ESCRITURA
;#DEFINE PULR PORTA,3 ; PULSADOR ROJO LECTURA
#DEFINE LED PORTC,2
SALIDA_LCD EQU PORTB
CBLOCK 0X20
DATO
DIR
TIMER_0
TIMER_1
TIMER_2
TIMER_3
TIMER_4
TIMER_BUSY
CONT1
OUTBYTE
TMP1
TMP2
ADRESS
CONT1MSS
CONT2
AUX
AUX2
DATO_LCD
COMANDO_LCD
DATO_RX
DATO_TX
DIRECCION_I2C
DIRECCION_ESCLAVO_I2C
AUX_I2C
BYTE_SALIDA
ANO
MES
DIA
DIA_SEMANA
HORA
MINUTOS
SEGUNDOS
ENDC
ORG 0X0000
GOTO INICIO
ORG 0X0005 ; PAGINA 0 DE MEMORIA PARA LAS TABLAS
NUM ANDLW H'0F'
ADDWF PCL,F
RETLW '0'
RETLW '1'
RETLW '2'
RETLW '3'
RETLW '4'
RETLW '5'
RETLW '6'
RETLW '7'
RETLW '8'
RETLW '9'
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
INICIO MOVLW B'01000000'
MOVWF ADCON0
CALL BANCO_1
MOVLW 0X06 ; CONF. ADCON1
MOVWF ADCON1 ; NO EDITAR
CLRF TRISB ; NO EDITAR
MOVLW 0X00 ; NO EDITAR
MOVWF TRISE ; NO EDITAR
MOVLW B'00000011' ;PULSADOR DE LECTURA Y ESCRITURA Y LED
MOVWF TRISC
MOVLW 0X00 ; NO EDITAR FF ES ENTRADA
MOVWF TRISD ; NO EDITAR
MOVLW B'11111100' ;PARA SDA Y SCL
MOVWF TRISA
MOVLW 0X02 ; NO EDITAR
MOVWF OPTION_REG ; NO EDITAR
MOVLW B'00100100' ;B'11101111' *****************
MOVWF TXSTA
MOVLW .25
MOVWF SPBRG ;9600BAUDIOS ***************
CALL BANCO_0
MOVLW B'10010000' ;*******************
MOVWF RCSTA ;*************
BSF INTCON,GIE ; HABILITAR INTERRUPCIONES DE BANDERA
MOVLW 0XA8 ; CONFIG. SSPCON MODO I2C COMO MAESTRO (Sync Serial Port Control Register)
MOVWF SSPCON
CALL BANCO_1
MOVLW 0X1F ; CONFIG. SSPCON2 MODO AUTOMATICO (Sync Serial Port Control Register2)
MOVWF SSPCON2
CALL BANCO_0
; BORRAR **********************************
CLRF 0X20
CLRF 0X21
CLRF 0X22
CLRF 0X23
CLRF 0X24
CLRF 0X25
CLRF 0X26
CLRF 0X27
CLRF 0X28
CLRF 0X29
CLRF 0X2A
CLRF 0X2B
CLRF 0X2C
CLRF 0X2D
CLRF 0X2E
CLRF 0X2F
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
CALL T50MS
CALL INICIAR_LCD
CALL T50MS
CALL INICIAR_USART
CALL MSJ_UCATO
CALL T1S
CALL T1S
CALL BORRAR_LCD
CALL NO_PARPADEAR_LCD
CLRF TMR0
CALL PROG
; **************** INSTRUCCIONES MAIN *******************
MAIN MOVFW TMR0
XORLW .124 ; APROX 1 MS (1000 HZs APROX)
BTFSS STATUS,Z
GOTO $-3
CLRF TMR0
PRE CALL T1S
BTFSS PULW
GOTO PRE
CALL WRVECT
CALL MOSTRAR1
GOTO PRE
;CALL RECIBIR_USART
;BTFSS F_RX_COMPLETO
;GOTO MAIN
;MOVFW DATO_RX
;MOVWF DATO_LCD
;CALL ENVIAR_LETRA_LCD
;GOTO MAIN
; ************** INSTRUCCIONES INICIALIZACION LCD **************
INICIAR_LCD MOVLW 0X01 ; BORRAR PANTALLA
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
CALL BUSY_LCD
MOVLW 0X0D ; CONTROL DE DISPLAY
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
CALL BUSY_LCD
MOVLW 0X06 ; CONFIG. MODO DE ENTRADA
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
CALL BUSY_LCD
MOVLW 0X38 ; CONFIG. DE FUNCIÓN
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
CALL BUSY_LCD
MOVLW 0X80 ; ESCRIBIR EN RAM
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
CALL BUSY_LCD
RETURN
; ******* COMANDOS ************
BORRAR_LCD MOVLW 0X01
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
RETURN
NO_PARPADEAR_LCD MOVLW 0X0C
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
RETURN
PARPADEAR_LCD MOVLW 0X0D
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
RETURN
ENVIAR_COMANDO_LCD BCF EN
BCF RS
BCF RW
MOVFW COMANDO_LCD
MOVWF SALIDA_LCD
BSF EN
CALL BUSY_LCD
BCF EN
RETURN
ENVIAR_LETRA_LCD BCF EN
BSF RS
BCF RW
MOVFW DATO_LCD
MOVWF SALIDA_LCD
BSF EN
CALL T100US
BCF EN
RETURN
IR_LINEA_1 MOVLW 0X80
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
RETURN
IR_LINEA_2 MOVLW 0XC0
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
RETURN
RETURN_HOME MOVLW 0X03
MOVWF COMANDO_LCD
CALL ENVIAR_COMANDO_LCD
RETURN
; ********** MENSAJES *************
MSJ_UCATO CALL NO_PARPADEAR_LCD
CALL BORRAR_LCD
CALL BUSY_LCD ; ESPERE ENTRE COMANDO(S) Y LETRA(S) - REQUERIDO
MOVLW 'B'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'A'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'S'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'E'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'S'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW ' '
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'D'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'E'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW ' '
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
CALL IR_LINEA_2 ; SALTO DE LINEA
MOVLW 'D'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'A'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'T'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'O'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'S'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW ' '
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'F'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'I'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'N'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'A'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW 'L'
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
MOVLW ' '
MOVWF DATO_LCD
CALL ENVIAR_LETRA_LCD
RETURN
; ************** INSTRUCCIONES DEL TEMPORIZADOR ****************
T100US CLRF TIMER_0
T100US_L INCF TIMER_0
MOVFW TIMER_0
XORLW .16
BTFSS STATUS,Z
GOTO T100US_L
RETURN
T1MS CLRF TIMER_1
T1_L INCF TIMER_1,F
MOVFW TIMER_1
XORLW .165
BTFSS STATUS,Z
GOTO T1_L
RETURN
BUSY_LCD CLRF TIMER_BUSY ; TIMER DE 2 MS
TB_L CALL T1MS
INCF TIMER_BUSY,F
MOVF TIMER_BUSY,W
XORLW .2
BTFSS STATUS,Z
GOTO TB_L
RETURN
T10MS CLRF TIMER_2
T2_L CALL T1MS
INCF TIMER_2,F
MOVF TIMER_2,W
XORLW .10
BTFSS STATUS,Z
GOTO T2_L
RETURN
T50MS CLRF TIMER_3
T3_L CALL T10MS
INCF TIMER_3,F
MOVF TIMER_3,W
XORLW .5
BTFSS STATUS,Z
GOTO T3_L
RETURN
T40US CLRF TIMER_0
T40US_L INCF TIMER_0
MOVFW TIMER_0
XORLW .6
BTFSS STATUS,Z
GOTO T40US_L
RETURN
T1S CLRF TIMER_4
T4_L CALL T50MS
INCF TIMER_4,F
MOVF TIMER_4,W
XORLW .20
BTFSS STATUS,Z
GOTO T4_L
RETURN
; ******* SELECCION DE LOS BANCOS ********
BANCO_0 BCF STATUS,RP0
BCF STATUS,RP1
RETURN
BANCO_1 BSF STATUS,RP0
BCF STATUS,RP1
RETURN
; ******* USART **************
INICIAR_USART CALL BANCO_1
MOVLW .25
MOVWF SPBRG ; 9600 BPS
BSF TXSTA,BRGH ; TX BRG ALTA VELOCIDAD
BCF TXSTA,SYNC ; TX ASINCRONO
BCF TXSTA,TX9 ; TX COMUNICACION 8 BITS
BSF TXSTA,TXEN ; TX HABILITADO
CALL BANCO_0
BSF RCSTA,SPEN ; RX POR SERIAL PORT HABILIDADO
BCF RCSTA,RX9 ; RECEPCION A 8 BITS
BSF RCSTA,CREN ; RECEPCION CONTINUA
RETURN
ENVIAR_USART CALL BANCO_1
BSF TXSTA,TXEN ; TX HABILITADO
CALL BANCO_0
MOVFW DATO_TX
MOVWF TXREG
;CALL BANCO_1
;BTFSS TXSTA,TRMT
;GOTO $-1
;BCF TXSTA,TXEN
CALL BANCO_0
RETURN
RECIBIR_USART BTFSS PIR1,RCIF
GOTO INCOMPLETO_RX
GOTO COMPLETO_RX
COMPLETO_RX BSF F_RX_COMPLETO
MOVFW RCREG
MOVWF DATO_RX
MOVWF TXREG
RETURN
INCOMPLETO_RX BCF F_RX_COMPLETO
RETURN
; ***************** I2C ***********************
RDVECT CALL START
MOVLW B'10100000'
CALL TXDATA
MOVF ADRESS,W
CALL TXDATA
CALL START
MOVLW B'10100011'
CALL TXDATA
RDVECT1 CALL RXDATA
MOVF OUTBYTE,W
MOVWF TMP2
RDVECT2 CALL NORE
CALL STOP
RETURN
WRVECT BSF LED
MOVFW PORTD
MOVWF TMP1
MOVLW B'00000000';DIR
MOVWF ADRESS
CALL START
MOVLW B'10100000';REG
CALL TXDATA
MOVF ADRESS,W
CALL TXDATA
WRVECT1 MOVF TMP1,W
CALL TXDATA
CALL STOP
RETURN
START BSF SDA
GOTO $+.2
STOP BCF SDA
BSF STATUS,RP0
MOVLW B'1111100'
MOVWF TRISA
BCF STATUS,RP0
BCF SCL
MOVLW 1<<SD ; PREGUNTAR???
BSF SCL
GOTO $+.1
GOTO $+.1
XORWF PORTA,W
MOVWF PORTA
GOTO TXDATA3
SIRE BCF SDA
GOTO $+.2
NORE BSF SDA
BSF STATUS,RP0
MOVLW B'1111100'
MOVWF TRISA
BCF STATUS,RP0
GOTO TXDATA2
TXDATA MOVWF OUTBYTE
TXDATE BSF STATUS,RP0
MOVLW B'1111100'; SCL Y SDA COMO SALIDA
MOVWF TRISA
BCF STATUS,RP0
MOVLW .8
MOVWF CONT1
TXDATA1 RLF OUTBYTE,F
BTFSS STATUS,C
BCF SDA
BTFSC STATUS,C
BSF SDA
BSF SCL
GOTO $+.1
GOTO $+.1
BCF SCL
DECFSZ CONT1,F
GOTO TXDATA1
BSF STATUS,RP0
MOVLW B'1111101'
MOVWF TRISA
BCF STATUS,RP0
BTFSC SDA
GOTO NORE
GOTO SIRE
TXDATA2 BSF SCL
TXDATA3 GOTO $+.1
GOTO $+.1
BCF SCL
RETURN
RXDATA BSF STATUS,RP0
MOVLW B'1111101'
MOVWF TRISA
BCF STATUS,RP0
MOVLW .8
MOVWF CONT1
RXDATA1 BSF SCL
GOTO $+.1
BCF STATUS,C
RLF OUTBYTE,F
BTFSC SDA
BSF OUTBYTE,0
BCF SCL
; NOP
DECFSZ CONT1,F
GOTO RXDATA1
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROG CALL BUSY
MOVLW B'00000110' ; MOVIMIENTO DEL CURSOR A LA DERECHA
CALL CONTROL
CALL BUSY
MOVLW B'00111100' ; BITS, n0. DE FILAS, TAMAÑO LETRA
CALL CONTROL
CALL BUSY
MOVLW B'00001111' ; dcb
CALL CONTROL
CALL BUSY
MOVLW B'00000001' ; BORRA Y UBICA CURSOR
CALL CONTROL
RETURN
CONTROL BCF RS
BCF RW
MOVWF PORTB
BSF EN
BCF EN
RETURN
DATOS BSF RS
BCF RW
MOVWF PORTB
BSF EN
BCF EN
RETURN
;******************* RUTINA OCUPADO PANTALLA O NO ********************
BUSY CLRF CONT2
T2MSA CALL T1MSS
INCF CONT2,F
MOVF CONT2,W
XORLW .2
BTFSS STATUS,Z
GOTO T2MSA
RETURN
T1MSS CLRF CONT1MSS
T1MSS1 INCF CONT1MSS,F
MOVF CONT1MSS,W
XORLW .166
BTFSS STATUS,Z
GOTO T1MSS1
RETURN
MOSTRAR1 MOVLW H'80'
CALL CONTROL
CALL BUSY
MOVLW 'E'
CALL DATOS
CALL BUSY
MOVLW 'S'
CALL DATOS
CALL BUSY
MOVLW 'C'
CALL DATOS
CALL BUSY
MOVLW 'R'
CALL DATOS
CALL BUSY
MOVLW 'I'
CALL DATOS
CALL BUSY
MOVLW 'B'
CALL DATOS
CALL BUSY
MOVLW 'O'
CALL DATOS
CALL BUSY
MOVLW ' '
CALL DATOS
CALL BUSY
MOVLW ' '
CALL DATOS
CALL BUSY
MOVF TMP1,W
MOVWF AUX
RRF AUX,F
RRF AUX,F
RRF AUX,F
RRF AUX,F
MOVF AUX,W
CALL NUM
CALL DATOS
CALL BUSY
MOVF TMP1,W
CALL NUM
CALL DATOS
CALL BUSY
MOVFW TMP1 ;*************
MOVWF AUX
RRF AUX,F
RRF AUX,F
RRF AUX,F
RRF AUX,F
MOVF AUX,W
CALL NUM
MOVWF TXREG
CALL T10MS
MOVFW TMP1
CALL NUM
MOVWF TXREG
CALL T10MS
RETURN
MOSTRAR2 MOVLW H'C0'
CALL CONTROL
CALL BUSY
MOVLW 'R'
CALL DATOS
CALL BUSY
MOVLW 'E'
CALL DATOS
CALL BUSY
MOVLW 'A'
CALL DATOS
CALL BUSY
MOVLW 'D'
CALL DATOS
CALL BUSY
MOVLW ':'
CALL DATOS
CALL BUSY
MOVLW ' '
CALL DATOS
CALL BUSY
MOVF TMP2,W
MOVWF AUX2
RRF AUX2,F
RRF AUX2,F
RRF AUX2,F
RRF AUX2,F
MOVF AUX2,W
CALL NUM
CALL DATOS
CALL BUSY
MOVF TMP2,W
CALL NUM
CALL DATOS
CALL BUSY
RETURN
END
Dudas o aportes por favor escribir Gracias Jullian Ladino Bogota Colombia