Y si es un codigo, obviamente tenes que compararlo uno por uno. Vas a tener una funcion que lee el codigo completo. Supongamos 4 digitos 1234. Esos 4 digitos los vas a guardar como quieras:
como BCD 0x01 0x02 0x03 0x04
como BCD packed 0x12 0x34
O como binario 0x04 0xD2 (1234 en decimal)
Eso lo hace la funcion que obtiene los datos.
Y luego lo vas a comparar 1 por 1 con los codigos que tengas guardado.
Como comparas ? haciendo una resta. Y observando el flag Z, para que sea mas simple doy un ejemplo pero como si fuera solo 2 digitos en BCD packed
Supone que tenes estos 2 registros con los codigos
Codigo_ingresado
Mas registros con los codigos de los demas usuarios ( todos seguidos )
Codigo_usuario_1
Codigo_usuario_2
Codigo_usuario_3
Codigo_usuario_4
Comprobacion
CLRF usuario ;Registro que mantiene a el numero de usuario
incf usuario,f
movlw Codigo_usuario_1
movwf fsr ;Para 8 usuarios si las contraseñas las tenes en registros ( para que se puedan cambiar) cargo el puntero al primer registro
loop
movf indf,w ; Aqui tomo lo que apunta esa direccion
subwf Codigo_ingresado ; Comparo Codigo_usuario_1 con Codigo_ingresado
btfsc status,z ; Son iguales? , si son iguales Z = 1,
return ; Si son iguales vuelvo, el numero de usuario va a estar en "usuario"
incf fsr,f
incf usuario,f ;incremento el usuario y el lugar donde estaba guardado
movlw 0x05
subwf usuario,w ; Resto para ver si llego a todos los usuarios, es decir los 4
btfss status,z
goto loop ; No llego a hacer todos los usuarios, entonces sigo por el proximo
clrf usuario ; De pasar por todos los codigos guardados y no cincidir con ningun, usuario va a ser igual a 0, de esa forma saber que no coincidio
return
Entonces como llamar esa funcion?
ProgramaPrincipal
CALL ObtenerClave
CALL Comprobacion
MOVF usuario
BTFSS STATUS,Z ; En caso que usuario sea distitno de 0 quiere decir que el codigo es valido
CALL AccesoPermitido
GOTO ProgramaPrincipal
Esto es un ejemplo de pero de 8 bits, tendras que extenderlo a 16 y acomodarlo a tu programa, pero el concepto va a ser similar.