Primero vamos a poner bien el programa, o al menos intentarlo, y haber que hace, despues ya nos pondremos con el srf05.
Una pregunta, este es un trabajo urgente para la universidad, y solo quieres presentarlo aprobar y ya esta, o tienes tiempo y ganas para aprender y saber hacerlo
lo digo porque empieza la epoca de los trabajos de la universidad y bueno...
Claro que se va a 255 porquq no le dices que pare en un numero determinado como en los otros, prueba este que te pongo corregido, porque lo vuelves a tener mal.
este es el tuyo:
tre incf dig1,0
movwf dig1
xorlw .10
btfss 3,2
goto va
clrf dig1
incf dig2,0
movwf dig2
xorlw .10
btfss 3,2
goto va
clrf dig2
incf dig3,1 ;este si se va hasta 255
Este deberia funcionar, no lo simule pero deberia ir:
tre incf dig1,1
movf dig1,0
xorlw .10
btfss 3,2
goto va
clrf dig1
incf dig2,1
movf dig2,0
xorlw .10
btfss 3,2
goto va
clrf dig2
incf dig3,1
movf dig3,0
xorlw .10
btfss 3,2
goto va
clrf dig3
Esta es una tabla para 7 segmentos, en el programa principal tienes que hacer "movf reg,0" a continuacion "call BCD7SEG" y te volvera al programa principal con el codigo para mostrar el numero.
Fijate "movf reg,0" esto es mover un reg a W y el valor queda en W, en esta instruccion igual que en "incf" y otras muchas ese "0" indica que el resultado se queda en W si pones un 1 el resultado se va al reg y la tabla te dara un resultado erroneo, incluso se desbordara, cuando haces "incf reg1,1" incrementas el valor del reg. y lo guardas en ese reg. porque si aqui le pones 0 el reg queda como estaba y no se incrementa. Te explico esto porque lo has vuelto a hacer mal. En tu tabla tambien lo haces mal.
movf dig3,1 ;tabla para centenas
xorlw .8
btfss 3,2
Aqui es movf dig3,0. Y es ",0" porque el valor del reg tiene que quedarse en W para despues hacer la "xor" con el 8 que le pones , y btfss 3,2=STATUS,Z este flag se pondra a 1 si el resultado es 0
BCD7SEG:
addwf PCL,1
retlw 0x3F
retlw 0x06
retlw 0x5B
retlw 0x4F
retlw 0x66
retlw 0x6D
retlw 0x7D
retlw 0x07
retlw 0xFF
retlw 0x6F
clrf contador
retlw 0x3F
Tambien se puede poner asi:
BCD7SEG ; para display catodo comun
addwf PCL,1 ; Se incrementa el contador del programa.-
DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
esto es un multiplexado de tres displays, gentileza de Suki
;**** Se multiplexan los Display ****
Actualizo_Display
movlw d'10' ; Cargo Contador = 10
movwf Contador ; Para repeticiones de visualizacion del mismo valor
; durante 150 ms.-
Refresco
movfw Unidad ; Obtengo codigo de 7 Segmentos para Unidad.-
call BCD7SEG ;
bcf PORTA,MuestroC ; Apago Display de Centena, Se entiende al mirar rutina.-
movwf PORTB ; Cargo unidad en PORTB .-
bsf PORTA,MuestroU ; Enciendo Display de Unidad.-
call Demora_5ms
movfw Decena ; Obtengo codigo 7 Segmentos para Decena.-
call BCD7SEG
bcf PORTA,MuestroU ; Apago Display de Unidad.-
movwf PORTB ; Cargo PORTB con Decena.-
bsf PORTA,MuestroD ; Enciendo Display de Decena.-
call Demora_5ms
movfw Centena ; Obtengo codigo de 7 Segmentos para Centena.-
call BCD7SEG
bcf PORTA,MuestroD ; Apago Display de Decena.-
movwf PORTB ; Cargo PORTB con Centena.-
bsf PORTA,MuestroC ; Enciendo Display Centena.-
call Demora_5ms
decfsz Contador,1 ; Pregunto si ya se ha repetido 10 veces el ciclo?
goto Refresco ; No, repito.-
goto Bucle ; Si, actualizo cuenta.-
;**** Demora ****
Demora_5ms
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x05 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
end