;----------------------------------------------------------------
;Turnero electrónico para siete puestos y 99 turnos
;Rev. 1 - Fecha 02/05/2002
;----------------------------------------------------------------
estado	equ	0x03		;Registro de estados del micro
carry	equ	0		;bandera de carry del cpu
zero	equ	2		;bandera de cero del cpu
pagina	equ	5		;Bit selector de banco de memoria
ptoa	equ	0x05		;Puerto A se encuentra en 05h
ptob	equ	0x06		;Puerto B se encuentra en 06h
cp	equ	0x02		;Contador de programa en posicion 02h
reg1	equ	0x10		;variables utilizadas para
reg2	equ	0x11		;las temporizaciones
reg3	equ	0x12
loops	equ	0x17
rebote	equ	d'250'		;Define el tiempo de anti rebote
uni	equ	0x13		;acumuladores de cuenta
dec	equ	0x14
pto	equ	0x15		;indica el puesto que llamo

	org	0		;Hace que el cont. de programa inicie
	goto	inicio		;salta a la etiqueta inicio
	org	5		;use desde 5h en adelante

inicio	movlw	0x1c		;Configuracion del puerto A
	tris	ptoa		;0,1=SAL / 2,3,4=ENT
	movlw	0x00		;Configuracion del puerto B
	tris	ptob		;Todo SALIDA
	movwf	ptoa		;Apaga todos los transistores
	movwf	ptob		;Apaga todos los segmentos
	clrf	uni		;Inicializa contadores
	clrf	dec
	movlw	0x0d		;Carga puesto con el (-)
	movwf	pto

ciclo	btfss	ptoa,4		;se fija si se presiona algun pulsador
	call	pulsa
	btfss	ptoa,3
	call	pulsa
	btfss	ptoa,2
	call	pulsa
	call	display		;pone los numeros en los displays
	goto	ciclo

display	movf	uni,0		;Carga W con el valor de unidad
	call	tabla		;Vuelve W con los bits para formar el digito
	movwf	ptob		;manda el digito al puerto B
	bsf	ptoa,1		;enciende el bit 1 del puerto A
	call	tiempo		;Espera para que se persiva el digito
	bcf	ptoa,1		;apaga el bit 1 del puerto A

	movf	dec,0		;Carga W con el valor de decena
	call	tabla		;Vuelve W con los bits para formar el digito
	movwf	ptob		;Mando el digito al puerto B
	bsf	ptoa,0		;Enciende el bit 0 del puerto A
	call	tiempo		;Espera para que se persiva el digito
	bcf	ptoa,0		;apaga el bit 0 del puerto A

	movf	pto,0		;Carga W con el valor del puesto actual
	call	tabla		;Vuelve W con los bits para formar el digito
	movwf	ptob		;Manda el digito al puerto B
	bsf	ptob,7		;Enciende el bit 7 del puerto B
	call	tiempo		;Espera para que se persiva el digito
	bcf	ptob,7		;apaga el bit 7 del puerto B

	return			;vuelve al programa principal

tabla	addwf	cp,1		;Agrega al contador de programa el cont. de W
	retlw	b'01110111'	;0
	retlw	b'01000001'	;1
	retlw	b'00111011'	;2
	retlw	b'01101011'	;3
	retlw	b'01001101'	;4
	retlw	b'01101110'	;5
	retlw	b'01111110'	;6
	retlw	b'01000011'	;7
	retlw	b'01111111'	;8
	retlw	b'01101111'	;9
	retlw	b'01011101'	;H
	retlw	b'01011111'	;L
	retlw	b'00110100'	;A
	retlw	b'00001000'	;-
	retlw	b'00001111'	;º
	retlw	b'00000000'	;Display apagado

pulsa	clrf	pto		;Determina el numero de puesto
	btfss	ptoa, 2		;pasa el bit de menos peso
	bsf	pto, 0
	btfss	ptoa, 3		;pasa el bit intermedio
	bsf	pto, 1
	btfss	ptoa, 4		;pasa el bit de mayor peso
	bsf	pto, 2

	incf	uni,1		;incrementa unidades
	movf	uni,0		;carla w con UNI
	sublw	d'10'		;Hace W = W - 10
	btfsc	estado, zero	;Si da cero (llego a diez)...
	call	mas10		;llama a aumentar una decena
	movlw	rebote		;Delay entre pulsaciones para
	movwf	loops		;evitar rebotes y disparos erraticos
	call	tiempo
	decfsz	loops
	goto	$-2
	return

mas10	clrf	uni		;pone a cero el acumulador de unidades
	incf	dec,1		;incrementa el acumulador de decenas
	movf	dec,0		;Carga w con DEC
	sublw	d'10'		;Hace W = W - 10
	btfsc	estado, zero	;Si da cero (llego a diez)...
	clrf	dec		;Pone a cero el acumulador de decenas
	return

tiempo	movlw	3		;Cargo W con 3
	movwf	reg1		;eso lo guardo en la variable Reg1
tres	movlw	10		;Cargo W con 10
	movwf	reg2		;eso lo guardo en la variable Reg2
dos	movlw	12		;Cargo W con 12
	movwf	reg3		;eso lo cargo en la variable Reg3
uno	decfsz	reg3		;resto 1 a REG3 saltea siguiente si llega a cero
	goto	uno		;vuelve a uno
	decfsz	reg2		;resta 1 a REG2	saltea siguiente si llega a cero
	goto	dos		;vuelve a dos
	decfsz	reg1		;resta 1 a REG3 saltea siguiente si llega a cero
	goto	tres		;vuelve a tres
	return			;Termino el tiempo, sale de la subrutina.

	end			;Indica al compilador que termino el prog.
