1. ;Comunicación con RS232
;con el PIC16F84 y un XTAL de 4MHz
list p=16F84
radix HEX
;*****************************Declaración de los puertos***********************
TMR_Opt EQU 0x01
Estado EQU 0x03
PA_TA EQU 0x05
PB_TB EQU 0x06
Intcon EQU 0x0B
Rxdreg EQU 0x0C ;registro de recepción
Txdreg EQU 0x0D ;registro de transmisión
Cont EQU 0x0E ;contador de bits transmitidos
Dlycnt EQU 0x0F ;contador de retraso
#define RXport PA_TA,1 ;llamamos RXport a PA1
configurado como la señal RX
#define TXport PA_TA,0 ;llamamos TXport a PA0
configurado como la señal TX
#define SAport PA_TA,3 ;llamamos SAport a PA3
configurado como la señal que activa las salidas
#define ENport PA_TA,2 ;llamamos ENport a PA2
configurado como la señal que activa las entradas
ORG 0
;****************Programación de las
puertas****************************************
clrf Intcon ;prohibición de las interrupciones
bsf Estado,5 ;selección del banco 1
clrf PA_TA ;Programación del PA
clrf PB_TB ;Programación del PB
bcf Estado,5 ;selección del banco 0
;****************Inicialización del
circuito***************************************
bsf TXport ;Activación de Tx porque si no estaria
transmitiendo
bsf ENport ;reseteo de las salidas del circuito
clrf PB_TB
bsf SAport
bsf Estado,5 ;selección del banco 1
bsf RXport ;Progración de RX port como entrada
bcf Estado,5 ;selección del banco 0
bcf SAport
Inicio call RxD
btfss Rxdreg,0 ;Comprueba que orden se le ha mandado de lectura o
escritura
goto Salida
goto Entrada
;********Programación como salidas***************************
Salida bsf SAport ;se activa el 74373
call RxD ;leemos dato del ordenador
bsf Estado,5 ;Selección del banco 1
clrf PB_TB ;programación del PB como salidas
bcf Estado,5 ;Selección del banco 0
2. movf Rxdreg,W ;Movemos el dato recibido a la salida
movwf PB_TB
borra bcf SAport ;desactivación del 74373
btfsc SAport ;comprueba que se ha desactivado el 74373
goto borra
goto Inicio
;*******Programación como entradas******************************
Entrada bcf ENport ;activación del 74245
clrf Txdreg ;reseteo del registro de transmisión
bsf Estado,5 ;selección del banco 1
movlw 0xFF ;programación de PB como entrada
movwf PB_TB
bcf Estado,5 ;selección delbanco 0
movf PB_TB,W ;llevamos dato de PB al registro de
transmisión
movwf Txdreg
call TxD ;transmisión del dato
bsf ENport ;desactivación del 74245
bsf Estado,5 ;selección del banco 1
clrf PB_TB ;programación del PB como salidas
bcf Estado,5 ;selección del banco 0
clrf PB_TB ;reseteo de las salidas
goto Inicio
;*********************Rutina de recepción*********************
RxD clrf Rxdreg ;reseto del registro de recepción
btfsc RXport ;comprueba que se ha mandado el bit de
inicio
goto RxD ;si no see ha mandado espera a que lo manden
call Dly_Ini ;si se ha mandado hace el retardo
correspondiente al bit de inicio
movlw 0x08 ;mueve el número de bits a recibir al contador
movwf Cont
RxD_Bit call Dly_bit ;hace el retardo del bit
btfsc RXport ;comprueba que dato se le ha mandado
bsf Rxdreg,7 ;si es un uno se activa el bit 7 del registro de
recepción
btfss RXport
bcf Rxdreg,7 ;si es un cero se desactiva el bit
decfsz Cont,W ;decrementa el contador y lo guarda en
W para rotar sólo 6 veces
rrf Rxdreg,f ;rota a la derecha el registro de recepción
si el esultado anterior no es cero
decfsz Cont,f ;decrementa el contador para ve si ha
terminado
goto RxD_Bit ;va a leer otro bit
call Dly_bit ;hace el retardo del bit de stop
return ;regresa al salto
;*********************Rutina de transmisión*****************************
TxD movlw 0x08 ;mueve el número de bits a transmitir al contador
movwf Cont
bcf TXport ;envia el bit de inicio
call Dly_bit ;hace el retardo del bit
Txd_Bit btfsc Txdreg,0 ;comprueba si es un 0 o un 1 lo que hay que
enviar
bsf TXport ;si es un 1 activa el puerto de transmisión
btfss Txdreg,0
bcf TXport ;si es un 0 desactiva el puerto
rrf Txdreg,f ;rota a la derecha el registro de
3. transmisión
call Dly_bit ;hace el retardo
decfsz Cont,f ;decrementa el contador de bits
goto Txd_Bit ;si no se han mandado todos los bits va a
seguir enviando
bsf TXport ;envio del bit de STOP
call Dly_bit
call Dly_bit ;se hacen dos retardos para centrar tiempos
return
;*********************Temporizador de retardo entre bit y
bit**********************
Dly_bit movlw 0x1D ;se hace un retardo de 833us que es el
tiempo que se tarda en transmitir
;un bit a 9600 baudios
movwf Dlycnt
goto Dly ;salto a la rutina de temorización
;********************Temporizador de retardo del bit de
inicio**********************
Dly_Ini movlw 0x08 ;retardo equivalente a la mitad del tiempo
que tarda entre bit y bit
movwf Dlycnt
goto Dly ;salto a la rutina de temporización
;*********************Rutina de
temporización****************************************
Dly decfsz Dlycnt,f ;decrementa el contador de temporización, si
el resultado es 0 salta
goto Dly ;si es 1 vuelve a decrementar
return ;si es 0 regresa a donde se hizo el salto
end