Autor Tema: Ayuda con mi P16F877A  (Leído 1625 veces)

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

Desconectado elmaxtor

  • PIC10
  • *
  • Mensajes: 1
Ayuda con mi P16F877A
« en: 01 de Octubre de 2013, 18:22:47 »
Buenas tardes, soy nuevo en esto de los PIC y ya he realizado varios proyecticos pequeños, pero ahorita ando con uno que de verdad me tiene chuflas, me funciono en simulación estos dias pero ahora me da unas cosas extrañas en la misma simulacion. Trata de un pequeño programa donde ingresar una clave y lanzar un mensaje de aceptacion, me sucede es que en mis variables- dig1-dig2-dig3-dig4-dig5 al compararlas siempre me da error :( así meta bien la clave; otra cosa es el teclado en la simulacion en estos días funcionaba bien pero ahora al teclear cuenta la tecla+1. si le doy al 1 marca 2 y asi sucesivamente, se lo pude quitar quitando una linea de código pero que con esa linea funcionaba me parece raro. Espero puedan ayudarme les anexo  el programa . La clave es de 5 digitos "11111" es de prueba. Espero realmente su ayuda ya que ando frutrado
Código: [Seleccionar]
LIST         P=16F877A
     #include "P16F877A.inc"

     N_Tecla      EQU     0x20
     clave        EQU     0x22
     Tecla        EQU     0x21
     DATO_A       EQU     0x24
     DATO_B       EQU     0x25
     DIRE         EQU     0x110
     DATO         EQU     0x111
     Nclave       EQU     0x27
     retardo      EQU     0x26
     contador     EQU     0x28
     d1           EQU     0x29
     d2           EQU     0x2A
     d3           EQU     0x2B
     cblock       0x30
     dig1
     dig2
     dig3
     dig4
     dig5
     clavc1
     clavc2
     clavc3
     clavc4
     clavc5
     clavp1
     clavp2
     clavp3
     clavp4
     clavp5
     endc
     org      0x00
     goto     INICIO
     org      0x04
     goto     A_Teclado

INICIO
;************Configuracion-Teclado-LCD******
              BANKSEL  TRISB
              movlw    b'11110000'
              movwf    TRISB
              bcf      OPTION_REG, 7
              movlw    0x06
              movwf    ADCON1
              BANKSEL  PORTB
              clrf     PORTB
              call     LCD_PORT
              call     LCD_INI
              call     sms1
              call     linea2
              BANKSEL  PORTB
              bcf      INTCON, 0
              movlw    b'10001000'
              movwf    INTCON
              clrf     Nclave   
bucle         
              clrf     INTCON
              movlw    0x05
              subwf    Nclave, W
              movlw    b'10001000'
              movwf    INTCON
              btfss    STATUS, Z
              goto     bucle   
              goto     Comprobar
;**************Comprobar Clave*************************   
Comprobar
              clrf     INTCON
              movlw    d'1'
              subwf    dig1, w
              btfss    STATUS, Z
              goto     sms3
              movlw    d'1'
              subwf    dig2, w
              btfss    STATUS, Z
              goto     sms2
              movlw    d'1'
              subwf    dig3, w
              btfss    STATUS, Z
              goto     sms2
              movlw    d'1'
              subwf    dig4, w
              btfss    STATUS, Z
              goto     sms2
              movlw    d'1'
              subwf    dig5, w
              btfss    STATUS, Z
              goto     sms2
              goto     sms3
;**************SubRutina del Teclado*******************

A_Teclado
              btfss   INTCON, 0
              goto    Fin_Teclado
              call    Tecla_Op
              movf    Tecla, W
              call    Tabla
              call    LCD_DATOS
              incf    Nclave, 1
              call    Guardar
Fin_Teclado
              nop
              retfie
Tecla_Op     
              clrf    Tecla
              ;AQUI TUVE QUE ELIMINAR "incf Tecla, f" y era algo que lo tenia antes y me funcionaba ya que por logica debe ir :5]
              movlw   b'00001110'
              movwf   PORTB
              nop
Test_Col
             btfss    PORTB, 4
             goto     Suelta_Tecla
             incf     Tecla, 1
             
             btfss    PORTB, 5
             goto     Suelta_Tecla
             incf     Tecla, 1
             
             btfss    PORTB, 6
             goto     Suelta_Tecla
             incf     Tecla, 1
                         
Ultima_Tecla
              btfss   PORTB, 3
              goto    Tecla_Nula
              bsf     STATUS, C
              rlf     PORTB, 1
              goto    Test_Col
Tecla_Nula   
              clrf    Tecla
              bcf     INTCON, 0
              clrf    PORTB
              return
Suelta_Tecla 

Espera1         
              btfss   PORTB, 4
              goto    Espera1
Espera2         
              btfss   PORTB, 5
              goto    Espera2
Espera3         
              btfss   PORTB, 6
              goto    Espera3
Espera4         
              btfss   PORTB, 7
              goto    Espera4
              bcf     INTCON, 0
              clrf    PORTB
              return

Tabla
              addwf PCL,1
              DT "1","2", "3", "4", "5", "6", "7", "8", "9", "*", "0", "#"
;**************SubRutinas Complementarias para teclado*
Guardar
              movlw   0x01
              subwf   Nclave, w
              btfss   STATUS, Z
              goto    Comprobar2
              goto    Digito1
Comprobar2   
              movlw   0x02
              subwf   Nclave, w
              btfss   STATUS, Z
              goto    Comprobar3
              goto    Digito2
Comprobar3
              movlw   0x03
              subwf   Nclave, w
              btfss   STATUS, Z
              goto    Comprobar4
              goto    Digito3
Comprobar4
              movlw   0x04
              subwf   Nclave, w
              btfss   STATUS, Z
              goto    Comprobar5
              goto    Digito4
Comprobar5
              movlw   0x05
              subwf   Nclave, w
              btfss   STATUS, Z
              goto    Digito5
Digito1
              movf    Tecla, w
              call    Tabla
              movwf   dig1
              return
Digito2
              movf    Tecla, w
              call    Tabla
              movwf   dig2
              return
Digito3
              movf    Tecla, w
              call    Tabla
              movwf   dig3
              return
Digito4
              movf    Tecla, w
              call    Tabla
              movwf   dig4
              return
Digito5
              movf    Tecla, w
              call    Tabla
              movwf   dig5
              return

;**************SUBRUTINAS PARA EL LCD******************
sms1
              movlw    ' '
      call     LCD_DATOS
              movlw    ' '
      call     LCD_DATOS
              movlw    'I'
      call     LCD_DATOS
              movlw    'N'
      call     LCD_DATOS
              movlw    'G'
      call     LCD_DATOS
              movlw    'R'
      call     LCD_DATOS
              movlw    'E'
      call     LCD_DATOS
              movlw    'S'
      call     LCD_DATOS
              movlw    'E'
      call     LCD_DATOS
              movlw    ' '
      call     LCD_DATOS
              movlw    'S'
      call     LCD_DATOS
              movlw    'U'
      call     LCD_DATOS
              movlw    ' '
      call     LCD_DATOS
              movlw    'C'
      call     LCD_DATOS
              movlw    'L'
      call     LCD_DATOS
              movlw    'A'
      call     LCD_DATOS
              movlw    'V'
      call     LCD_DATOS
              movlw    'E'
      call     LCD_DATOS
      return
sms2     
;Mensaje M=malo   
              call     limpia
              movlw    'M'
              call     LCD_DATOS
              clrf     Nclave
              movlw    0x88
              movwf    INTCON
              goto     bucle
sms3
;Mensaje B= Bueno       
              call     limpia
              movlw    'B'
              call     LCD_DATOS
              clrf     Nclave
              movlw    0x88
              movwf    INTCON
              goto     bucle

LCD_PORT
              BANKSEL TRISC
              clrf    TRISC
              movlw   b'11111000'
              movwf   TRISA
              BANKSEL PORTA
              clrf    PORTA
              clrf    PORTC
              bcf     PORTA, 2
              bcf     PORTA, 0
              return
LCD_INI
              movlw   0x01 ; El comando 0x01 limpia la pantalla en el LCD
          movwf   PORTC
      call    comando    ; Se da de alta el comando
      movlw   0x0C       ; Se selecciona la primera linea
      movwf   PORTC
      call    comando    ; Se da de alta el comando
      movlw   0x3C       ; Se configura el cursor
      movwf   PORTC
      call    comando    ; Se da de alta el comando
      bsf     PORTA, 2   ; Rs se pone en 1 para deshabilitar el uso de comandos
              return 
LCD_REG       BCF     PORTA,2    ;Desactiva RS (Modo instruccion)
              MOVWF   PORTC      ;Saca el codigo de instruccion
              CALL    LCD_BUSY   ;Espera a que se libere el LCD
              GOTO    LCD_E
LCD_E         BSF     PORTA,0    ;Activa señal E
              NOP                ;Espera 1uS
              BCF     PORTA,0    ;Desactiva señal E
              RETURN
LCD_DATOS
              BCF     PORTA,2    ;Desactiva RS (Modo instrucci¢n)
              MOVWF   PORTC      ;Valor ASCII a sacar por RB
              CALL    LCD_BUSY   ;Espera a que se libere el LCD
              BSF     PORTA,2    ;Activa RS (Modo dato) 
              GOTO    LCD_E 
LCD_BUSY      BSF     PORTA,1    ;Pone el LCD en modo lectura
              BANKSEL TRISC      ;Selecciona el Banco 1
              MOVLW   0xFF 
              MOVWF   TRISC      ;Puerta B act£a de entrada
              BANKSEL PORTA      ;Selecciona el Banco 0
              BSF     PORTA,0    ;Activa el LCD (Señal E)
              NOP           
L_BUSY        BTFSC   PORTC,7    ;Chequea el bit BUSY
              GOTO    L_BUSY     ;Est  a "1" (Ocupado)
              BCF     PORTA,0    ;Desactiva el LCD (Se¤al E)
              BANKSEL TRISC      ;Selecciona el Banco 1
              CLRF    TRISC      ;Puerta B actua como salida
              BANKSEL PORTA      ;Selecciona el Banco 0
              BCF     PORTA,1    ;Pone el LCD en modo escritura
              RETURN 
comando
              bsf     PORTA, 0 ; Pone la señal E en 1, espera un tiempo y luego la regresa a
              call    delay
              call    delay
              bcf     PORTA, 0
      call    delay
      return 
delay       
          movlw   0xFF
              movwf   retardo
ciclo
   
              movlw   0xFF
      movwf   contador

ciclo2
      decfsz  contador
      goto    ciclo2
      decfsz  retardo
      goto    ciclo
              return
linea2
              bcf     PORTA, 2    ; rs en 0
              movlw   0xc0 ; selecciona linea 2 pantalla en el LCD
      movwf   PORTC
      call    comando      ; Se da de alta el comando
              movlw   0x0F
              movwf   PORTC
              call    comando
              return
     
limpia
          bcf     PORTA, 2    ; rs en 0
              movlw   0x01 ; limpia lcd pantalla en el LCD
      movwf   PORTC
      call    comando      ; Se da de alta el comando
              return
              END