contador 0 a 100,000 con lcd

Hola que tal he estado trabajando ya casi una semana en un programa para poder hacer un contador con un AVR (atmega32) y un LCD 2*16, cada vez que se presione un push botton, inicia y logre que contara hasta 9 (por cierto lo estoy haciendo en ensamblador), el problema es que al momento que llega a 9 debe avanzar un espacio para el otro digito, lo cual tambien lo hace, lo que no puedo conseguir es como retroceder al digito anterior y ponerlo a uno, y de nuevo cada vez que llegue a 9, incremente el anterior para contar a 2, osea un veinte :confused:, esto si me tiene algo confundido..espero que alguien pueda ayudarme a concluirlo, tambien si alguien tiene una propuesta similar en C, es bienvenido gracias saludos banda.
bien les dejo el codigo y el archivo en proteus, ok
http://cid-ab8ef72f672ad64b.skydrive.live.com/browse.aspx/.Public?uc=1&isFromRichUpload=1

ENLACE correcto oops:rolleyes:

Código:
http://cid-ab8ef72f672ad64b.skydrive.live.com/browse.aspx/.Public
 
Última edición:
que complicada la bajada... lo hubieras dejado directamente aqui... deja reviso en donde te fallo la logica.
 
ok gracias, pondre el codigo por aqui para que no sea tanto rollo la descarga, saludos

Código:
.include "m32def.inc"
;contador 0 a 9, proximamente hasta 999
.org 0000

;configura puertos
	ser r16			
	out DDRB,r16	;salida
	out DDRD,r16	;salida
	ldi r17,$FE		;como entrada una sola pata FE		
	out DDRC,r17	
	rcall unseg		
	clr r16
	clr r17
;configuracion LCD 2x16

	ldi r16,$38		;configura de 8 bits a dos lineas
	rcall instru	
	ldi r16,$0e		;manda el cursor abajo
	rcall instru 	
	ldi r16,$02		
	rcall instru	
	ldi r16,$01		;limpia lcd
	rcall instru	

;escribe 0-9
cero:
	ldi r20,$30		;carga $30=48d, 110000bin. CERO EN ASCII
	mov r16,r20		
	rcall dato		;manda ASCII a LCD
	;rcall unseg		
	;ldi r16,$80		;Regreso a home
		
condicion:
	ldi r24,$01
	out portC,r24	
	in r23,pinC		;lee el pin
	cpi r23,$00		;si es 0 empieza el conteo
	breq loopu
	brne condicion

loopu:
	rcall clear
	inc r20
	mov r16,r20
	rcall dato
	rcall unseg

	cpi r16,$39
	breq avanza

	rjmp condicion
avanza:
	rcall cero
	clr r16
	cbi portD,0 ;pin D0 q va a RS
	ldi r16,$14
	out portB,r16
	sbi portD,1 	;por la pata uno q es la q va a E
	cbi portD,1
	;rcall dosms

	rjmp cero
	
	rjmp condicion
	;ret
	
;limpia el lcd
clear:
	clr r16
	cbi portD,0 ;pin D0 q va a RS
	ldi r16,$10
	out portB,r16
	sbi portD,1 	;por la pata uno q es la q va a E
	cbi portD,1
	rcall dosms
	ret

;subrutina:instruccion a LCD
instru:
	cbi portD,1		;RS igual a 0, CBI pone a 0 el reg
	rjmp envio
;subrutina dato a lcd
dato:
	sbi portD,0		;RS igual a 1 
	rjmp envio
;subrutina envia dato a lcd
envio:
	sbi portD,1		;E= 1, SBI pone a 1 el reg
	out portB,r16	
	rcall dosms		;espera 2 ms escritura
	cbi portD,1		;E=0  
	rcall dosms		
	ret

					;retorno a subrutina

;****************************************************************
;subrutina de 2ms
;8000 ciclos. delayin 7998 cycles
dosms:
	ldi r17,$1f		;carga con 31 decimal y 11111 binario
WGLOOP0:
	ldi r18,$55		;$55 = 85d = 1010101 bin
WGLOOP1:
	dec r18
	brne WGLOOP1
	dec r17
	brne WGLOOP0
	;delaying 2 cycles
	nop 
	ret
;========================================================================================
;subrutina de 1seg
;4,000,000 cyclos
;delayin 3 999 996 cycles
unseg:
	ldi r17,$04		;24
WGLOOP3:
	ldi r18,$BC		;$BC=188d=10111100bin
WGLOOP4:
	ldi r19,$C4		;$C4=196d=11000100bin
WGLOOP5:
	dec r19
	brne WGLOOP5
	dec r18
	brne WGLOOP4
	dec r17
	brne WGLOOP3
;delayin 3cycles
	ldi r17,$01
WGLOOP6:
	dec r17
	brne WGLOOP6
;delaying 1 cycle
	ret
;---------------------------------------------------------------------------------------
 
A ver... Esto quiza te ayude... Supongamos que quieres contar hasta 999...
Lo que debes hacer es mostrar la unidad, hasta que llegues a 9...
Cuando ahora deba poner 10, primero muestras la decena (1) y luego la unidad (0)...
Se entiende??? Escribes de izquierda a derecha... No pienses que por mostrar primero la decena vas a llegar a ver 19 y luego 10... Si los tiempos son correctos no llegaras a notar el 19 y el paso de 09 a 10, lo hará instantaneamente...
Me explico?
Lo mismo cuando llegues a 99 y luego debas mostrar el 100...
Primero muestras la centena (1), luego la decena (0) y por ultimo la unidad(0)...
Si no se entiende mandame un mp...
Saludos!
 
Hola
aqui te dejo un ejemplo para incrementar el tiempo de un reloj:

;*************************************************************
;****************** INCREMENTAR TIEMPO *************************
;*************************************************************
Incrementar_Tiempo
;Sumar_Unidad_Segundo
incf Unidad_Segundo,F ; rutina de incremento
movf Unidad_Segundo,W ; incremento las unidades
sublw 0x0A ; realizo la resta 10-unidades_Minuto
btfss STATUS,Z ; si W=10, entonces Z=0
goto Fin_Incrementar
;Sumar_Decenas_Segundo
clrf Unidad_Segundo ;como unidades_minuto vale 10, lo pongo a 0
incf Decena_Segundo,F ; rutina de incremento
movf Decena_Segundo,W ; incremento las decenas
sublw 0x06 ; realizo la resta 6-decena_segundo
btfss STATUS,Z ; si W=6, entonces Z=0
goto Fin_Incrementar
;Sumar_Unidad_Minuto
clrf Decena_Segundo ;como unidades_segundo vale 6, lo pongo a 0
incf Unidad_Minuto,F ; rutina de incremento
movf Unidad_Minuto,W ; incremento las unidades
sublw 0x0A ; realizo la resta 10-unidades_Minuto
btfss STATUS,Z ; si W=10, entonces Z=0
goto Fin_Incrementar

;sumar_Decenas_Minuto
clrf Unidad_Minuto ;como unidades_minuto vale 10, lo pongo a 0
incf Decena_Minuto,F ; rutina de incremento
movf Decena_Minuto,W ; incremento las decenas
sublw 0x0A ; realizo la resta 10-decenas de minuto
btfss STATUS,Z ; si W=10, entonces Z=0
goto Fin_Incrementar
clrf Decena_Minuto ; como unidades_minuto vale 10, lo pongo a 0

Fin_Incrementar nop
call Visualizar_Tiempo
goto Comparar_Tiempo
 
Atrás
Arriba