Autor Tema: USART PIC 16F877  (Leído 4445 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
USART PIC 16F877
« en: 07 de Mayo de 2007, 09:54:29 »
Hola a todos.

Tengo un problemilla que no se por donde arreglarlo.

Tengo un código que me coje los datos del puerto serie a 9600 baudios, 8 bits, sin paridad y bit de parada, y el problema es que creo que no me lo hace bien.

He usado el proteus para simularlo, y se me encienden siempre los bits "11111101" del puerto D, cuando creo que no deberia ser así.

He aquí el código:

Código: [Seleccionar]

     include "p16f877.inc"

org 0x00

;CONFIGURACIÓN DEL PIC PARA RECEPCION DE DATOS
;---------------------------------------------
    bsf STATUS,RP0 ;Ir banco 1
    bcf STATUS,RP1
    clrf TRISA ;PORTA salida
    clrf TRISB ;PORTB salida
    clrf TRISC ;PORTC salida
    clrf TRISD ;PORTD salida
    clrf TRISE ;PORTE salida
    bsf TRISC,7 ;RC7/Rx como Entrada, Pin de Recepción de Datos RS232
    movlw d'129' ;9600 baudios - 20 MHz (valor 129)
    movwf SPBRG

    bsf STATUS,RP1 ;Ir banco 0
    bcf STATUS,RP0
    bsf RCSTA,BRGH ;Se pone el bit a 1 para configurar como Alta Velocidad (bit a 1)
    bcf RCSTA,SYNC ;Modo asíncrono (bit a 0)
    bsf RCSTA,SPEN ;habilita el puerto serie (bit a 1)
    bcf RCSTA,RX9 ;8 Bits de datos (bit a 0)
    bsf RCSTA,CREN ;Para Rx Continuo (bit a 1)
;-----------------
;FIN CONFIGURACION
_espera
    btfss PIR1,RCIF ;Pregunta si el buffer de RX es full
    goto _espera ;No, ir _espera
    movf RCREG,W ;Si, W=RCREG y pone a cero el RCIF
    movwf PORTD ;PORTD = W
    clrf RCIF
    goto _espera


Lo he provado enviando el caracter "A" por el puerto serie, y deberia salir "01000001" en lugar de salir lo que sale.

¿Que estoy haciendo mal?


Un saludo y gracias por todo.
« Última modificación: 07 de Mayo de 2007, 09:56:39 por TheBlooD »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: USART PIC 16F877
« Respuesta #1 en: 07 de Mayo de 2007, 10:41:06 »
Veo lo siguiente


   bsf STATUS,RP1    ;Ir banco 0


Esto, activa el banco 2, no el 0.  Tal vez ahí está tu problema.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: USART PIC 16F877
« Respuesta #2 en: 07 de Mayo de 2007, 11:17:33 »
Hola maunix, gracias por tu mensaje.

Efectivamente eso esta mal, un despiste mio, pero por desgracia me sigue haciendo lo mismo...  :(


Un saludo, y gracias por tu ayuda

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: USART PIC 16F877
« Respuesta #3 en: 07 de Mayo de 2007, 19:43:11 »
Acabo de ver algo más, el TRISC<6> también debe estar en 1.  Por más que no estes transmitiendo es una buena costumbre setear bien dicho pin.

En cuanto al software, debes verificar si se habilita el bit RCSTA,OERR.  Si esto es así, se soluciona borrando y encendiendo el CREN

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado TheBlooD

  • PIC12
  • **
  • Mensajes: 66
Re: USART PIC 16F877
« Respuesta #4 en: 08 de Mayo de 2007, 16:19:43 »
Bueno, pues ya he avanzado un paso. Al menos ahora me cambia de estado cuando mando un caracter por el puerto serie.

El problema es que el resultado no se corresponde con el dato enviado, por ejemplo, si envio el caracter "A" (65) me da como resultado "10010110" cosa que es totalmente incorrecta.

Si mando el "B" (66) me sale "01011010" igualmente incorrecto.

He revisado todos los valores y creo que son todos correctos. ¿podria ser problema del Proteus y su COMPIM?

He aqui el actual código:

Código: [Seleccionar]

     include "p16f877.inc"

org 0x00

;CONFIGURACIÓN DEL PIC PARA RECEPCION DE DATOS
;---------------------------------------------
    bsf STATUS,RP0 ;Ir banco 1
    bcf STATUS,RP1
    clrf TRISA ;PORTA salida
    clrf TRISB ;PORTB salida
    clrf TRISC ;PORTC salida
    clrf TRISD ;PORTD salida
    clrf TRISE ;PORTE salida

    bsf TRISC,7 ;RC7/Rx como Entrada, Pin de Recepción de Datos RS232
    bcf TRISC,6 ;RC6/Tx como Salida, Pin de Transmisión de Datos RS232
    movlw d'129' ;9600 baudios - 20 MHz (valor 129)
    movwf SPBRG

    bcf TXSTA,TX9 ;8 bits de datos a transmitir
bsf TXSTA,TXEN ;Activa la transmisión serial, TXIF = 1

    bcf STATUS,RP1 ;Ir banco 0
    bcf STATUS,RP0
    bsf RCSTA,BRGH ;Se pone el bit a 1 para configurar como Alta Velocidad (bit a 1)
    bcf RCSTA,SYNC ;Modo asíncrono (bit a 0)

    bsf RCSTA,SPEN ;habilita el puerto serie (bit a 1)
    bcf RCSTA,RX9 ;8 Bits de datos (bit a 0)
    bsf RCSTA,CREN ;Para Rx Continuo (bit a 1)
;-----------------
;FIN CONFIGURACION
_espera
    btfss PIR1,RCIF ;Pregunta si el buffer de RX es full
    goto _espera ;No, ir _espera
btfsc RCSTA,OERR
call ERR_RX
    movf RCREG,W ;Si, W=RCREG y pone a cero el RCIF
    movwf PORTD ;PORTD = W
;goto _espera
    movwf TXREG ;Transmitir dato
_esperatx
    btfss PIR1,TXIF ;Espera hasta que transmisión culminó
    goto _esperatx ;No, ir _esperatx
btfsc TXSTA,OERR
call ERR_TX
    goto _espera ;Si, ir _esperarx

;SI OCURRE UN ERROR EN LA RECEPCION, RESETEA EL BIT CREN
ERR_RX bcf RCSTA,CREN
bsf RCSTA,CREN
return
;--------------------------------------------------------

;SI OCURRE UN ERROR EN LA TRANSMISION, RESETEA EL BIT CREN
ERR_TX bcf TXSTA,CREN
bsf TXSTA,CREN
return
;--------------------------------------------------------
end


« Última modificación: 08 de Mayo de 2007, 16:23:01 por TheBlooD »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: USART PIC 16F877
« Respuesta #5 en: 28 de Mayo de 2007, 05:00:46 »
¿Tienes ajustados los dos dispositivos a los mismos baudios?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: USART PIC 16F877
« Respuesta #6 en: 29 de Mayo de 2007, 08:35:10 »
Lo de proteus la verdad no lo puedo comprobar porque es perfectamente factible que falle el simulador.

En cuanto a tu código, solo me resta decirte que no existe un bit TXSTA, CREN
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado futjuly

  • PIC10
  • *
  • Mensajes: 1
Re: USART PIC 16F877
« Respuesta #7 en: 13 de Junio de 2007, 15:17:09 »
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 4MHz












INCLUDE "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 :-/


 

anything