CODIGO EN ASSEMBLER RECEPTOR ;************************************************************************ list p=16f84A radix hex ;selecion de pic ; codigo hex pc status equ portb equ PORTA PIR1 equ RCSTA RCREG trisb equ TRISA TXSTA SPBRG t1 t2 t3 t4 var1 equ tem tem1 equ loops equ loops2 equ datos equ dato1 equ r0e equ conta equ conta1 equ e rs equ 02h 03h 06h equ 05h 0ch equ 18h equ 1ah 86h equ 85h equ 98h equ 99h equ 20h equ 21h equ 22h equ 23h 24h equ 25h 26h 27h 28h 29h 2Ah 2Bh 2ch 2Dh equ 1h equ 0h org goto org 0X05 0x00 inicio inicio clrf status bsf bcf movlw 0x0C movwftrisb bsf bcf bcf clrf t1 clrf t2 clrf t3 status,5 status,6 TRISA,0 TRISA,1 status,5 ; ;seleciona banco 1 ;w=0000 1100 ;portb=0000 1100 para el lcd ;de salida portc.0 clrf t4 call call call LCD retardo LCD1 xxyy bcf PORTA,1 datos / despues de mostrar datos en LCD call retardo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; rutina de recepcion ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; recibir1 rcvr1 siguient1 nop clrf dato1 btfsc PORTA,0 goto recibir1 call unoymedio movlw 8 movwf conta bcf btfsc bsf rrf call decfsz goto status,0 PORTA,0 status,0 dato1 delayl conta rnext1 movf dato1,0 movwft1 recibir2 rcvr2 siguient2 nop clrf dato1 btfsc PORTA,0 goto recibir2 call unoymedio movlw 8 movwf conta bcf status,0 btfsc PORTA,0 bsf status,0 rrf dato1 call delayl decfsz conta goto rnext2 movf dato1,0 ;envia señal que esta listo para recibir movwft2 recibir3 rcvr3 siguient3 nop clrf dato1 btfsc PORTA,0 goto recibir3 call unoymedio movlw 8 movwf conta bcf status,0 btfsc PORTA,0 bsf status,0 rrf dato1 call delayl decfsz conta goto rnext3 movf dato1,0 movwft3 recibir4 rcvr4 siguient4 nop clrf dato1 btfsc PORTA,0 goto recibir4 call unoymedio movlw 8 movwf conta bcf status,0 btfsc PORTA,0 bsf status,0 rrf dato1 call delayl decfsz conta goto rnext4 movf dato1,0 movwft4 bsf call goto PORTA,1 LCD1 xxyy unoymedio movlw .249 goto startup delayl movlw .166 startup movwf r0e redo nop nop decfsz r0e goto redo retlw 0 ;;;;;;;;;;;;;;;;;;;;;;;rutinas de muestreo en el LCD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; control bcf portb,rs ;rs=0 ,bit.0=1 selecciona registro control...portb= 0000 0000 goto dato2 dato bsf portb= 0000 0001 portb,rs dato2 bsf portb= 0000 0011 portb,e movwfdatos variable dato....dato=0010 0011 movlw 0xF0 andwf datos,0 iorwf portb,1 call retardo bcf portb,e call retardo bsf portb,e movlw 0x0f andwf portb,1 swapf datos,0 andlw 0xF0 iorwf portb,1 call retardo bcf portb,e call retardo clrf portb retlw 0 tabla addwf pc,1 ;rs=1, selecciona registro de datos ;e=1, bit.1=1 habilita lcd............. ;copia el valor del registro dato/control en la ;w=1111 0000 ;w=0010 0000 ;portb=0010 0011 ;portb=0010 0001 ;w ;w ;portb=0010 0011 =0000 1111 ;portb=0000 0011 ;w =0011 0010 =0011 0000 ;portb=0011 0011 retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw "T" "1" ":" "T" "2" ":" "T" "3" ":" "T" "4" ":" 0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;10 ;11 ;12 LCD ;;;;;;;;;;;;; muestra los valores de t1 /t2/t3/t4=0 begin movlw 01h call control movlw 02h limpia pantalla call control movlw 28h call control movlw 0Ch call control movlw 06h call control muestra mensaje clrf var1 movlw 0x80 call control xxx1 movf var1,0 ; n=w call tabla call dato call retardo incf var1,1 movlw 0x03 xorwf var1,0 btfss status,2 goto xxx1 ; ; (2) definicion de bus de 4 bits , w=0000 0010 ; (3) w=0010 1000 ratifica datos de 4 bits y 2lineas ; (4) w=0000 1100 activa pantalla ; (5) w=0000 0110 mensaje fijo n pantalla y ;(5) ciclo de lectura de la tabala q contiene el ;variable n para que aparezca la cantidad de datos ;ubica el cursor en la posicion ;copio el valor de n en W ;operacion logica entre el w y la variable pulso ;op=0 =>z=1 y op=1 =>z=0 movlw 0x89 ;ubica el cursor en la posicion call control xxx2 movf var1,0 ; n=w call tabla call dato call retardo incf var1,1 movlw 0x06 ;copio el valor de n en W xorwf var1,0 btfss status,2 goto xxx2 movlw 0xc0 call control xxx3 movf var1,0 ; n=w call tabla call dato call retardo incf var1,1 movlw 0x09 xorwf var1,0 btfss status,2 goto xxx3 ;operacion logica entre el w y la variable pulso ;op=0 =>z=1 y op=1 =>z=0 ;ubica el cursor en la posicion ;copio el valor de n en W ;operacion logica entre el w y la variable pulso ;op=0 =>z=1 y op=1 =>z=0 movlw 0xc9 ;ubica el cursor en la posicion call control xxx4 movf var1,0 ; n=w call tabla call dato call retardo incf var1,1 movlw 0x0c ;copio el valor de n en W xorwf var1,0 ;operacion logica entre el w y la variable pulso btfss status,2 ;op=0 =>z=1 y op=1 =>z=0 goto xxx4 retlw 0 ;;;;;;;;;;;;;;;;;;;;;;;; muestra valores LCD1 movlw 0x83 ;ubica el cursor en la posicion call control movf t1,0 ;copio t1 en w movwftem ;guardo w en tem call decena movf tem1,0 call dato call retardo movf tem,0 call dato call retardo movlw b'11011111' call dato call retardo movlw b'01000011' call dato call retardo movlw 0x8C call control movf t2,0 movwftem call decena ;ubica el cursor en la posicion ;copio t1 en w ;guardo w en tem movf tem1,0 call dato call retardo movf tem,0 call dato call retardo movlw b'11011111' call dato call retardo movlw b'01000011' call dato call retardo movlw 0xc3 ;ubica el cursor en la posicion call control movf t3,0 ;copio t1 en w movwftem ;guardo w en tem call decena movf tem1,0 call dato call retardo movf tem,0 call dato call retardo movlw b'11011111' call dato call retardo movlw b'01000011' call dato call retardo ;;; movlw 0xcc ;ubica el cursor en la posicion call control movf t4,0 ;copio t1 en w movwftem ;guardo w en tem call decena movf tem1,0 call dato call retardo movf tem,0 call dato call retardo movlw b'11011111' call dato call retardo movlw b'01000011' call dato call retardo call retardo retlw 0 aqui viene el valor de t1 ò t2 ò t3 ò t4 en la variable 'tem' decenamovlw 0x5a subwf tem,0 btfsc status,0 goto unidad1 unidad1 ;90 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x50 subwf tem,0 btfsc status,0 goto unidad2 ;80 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x46 subwf tem,0 btfsc status,0 goto unidad3 ;70 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x3c subwf tem,0 btfsc status,0 goto unidad4 ;60 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x32 subwf tem,0 btfsc status,0 goto unidad5 ;50 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x28 subwf tem,0 btfsc status,0 goto unidad6 ;40 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x1e subwf tem,0 btfsc status,0 goto unidad7 ;30 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x14 subwf tem,0 btfsc status,0 goto unidad8 ;20 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x0a subwf tem,0 btfsc status,0 goto unidad9 goto unidadA ;10 ;f-w=w ;c=0 acarreo /c=1 no acarreo movlw 0x5a subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x09 ;w=90 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=04 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;copiamos 4 en tem(decena) ;valor 0 en ascii ;sumamos w+tem1=tem1 unidad2 movlw 0x50 subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x08 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=80 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=08 ;copiamos 8 en tem(decena) ;valor 0 en ascii ;sumamos w+tem1=tem1 unidad3 movlw 0x46 subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x07 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=70 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=07 ;copiamos 4 en tem(decena) ;valor 0 en ascii ;sumamos w+tem1=tem unidad4 movlw 0x3c subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x06 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=60 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=04 ;copiamos 6 en tem(decena) ;valor 0 en ascii ;sumamos w+tem=tem unidad5 movlw 0x32 subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x05 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=50 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=05 ;copiamos 5 en tem(decena) ;valor 0 en ascii ;sumamos w+tem=tem unidad6 movlw 0x28 subwf tem,1 movlw 0x30 addwf tem,1 ;w=40 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem movlw 0x04 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=04 ;copiamos 4 en tem(decena) ;valor 0 en ascii ;sumamos w+tem=tem unidad7 movlw 0x1e subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x03 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=30 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=03 ;copiamos 3 en tem(decena) ;valor 0 en ascii ;sumamos w+tem=tem unidad8 movlw 0x14 subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x02 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=20 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=02 ;copiamos 2 en tem(decena) ;valor 0 en ascii ;sumamos w+tem=tem unidad9 movlw 0x0a subwf tem,1 movlw 0x30 addwf tem,1 movlw 0x01 movwftem1 movlw 0x30 addwf tem1,1 retlw 0 ;w=10 ;f-w=f guardamos resultado(unidades en tem) ;valor 0 en ascii ;sumamos w+tem=tem ;w=01 ;copiamos 1 en tem(decena) ;valor 0 en ascii ;sumamos w+tem=tem unidadA movlw 0x30 addwf tem,1 movlw 0x30 movwftem1 retlw 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; retardo MOVLW MOVWF top2 top D'50' ;el registro contiene el nº loops ; de ms de retardo MOVLW D'100' MOVWF loops2 NOP NOP NOP NOP NOP NOP DECFSZ GOTO DECFSZ GOTO retlw 0 end loops2 ; pregunta si termino 1ms top loops ; pregunta si termina el retardo top2