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
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