/*	PROGRAMA: KUPCTD.ASM
	DESCRIPCIÓN: CONTADOR PARA MONEDAS.
	REALIZACIÓN: VÍCTOR ALBERTO SALINAS REYES.
	EMPRESA: 7MAGICO.
	DIAGRAMA: NINGUNO.
	PARTE: U1.
	VERSIÓN: 3
=======================================
2010-09-15 00:39 REALIZACIÓN INICIAL.
2010-09-16 12:21 RUTINAS DEL EXHIBIDOR.
2010-09-16 12:21 RUTINA DE CONVERSIÓN DE BINARIO A BCD.
2010-09-16 18:34 RUTINAS DE CONTADOR, BOTONES, INICIO VERSIÓN 1.
2010-09-27 22:07 INVIERTE ENTRADA B1 Y B2, CONTADOR FLANCO DE SUBIDA, VERSIÓN 2.
2010-10-14 20:44 TERMINALES E/S NO USADAS CONFIGURADAS RESISTOR "PULL UP", MININIZACIÓN DE EMI, VERSIÓN 3.
*/
/*
	TENSIÓN DE OPERACIÓN:	5 V .
	RELOJ DE SISTEMA:		4 MHz .

* TERMINALES:
ASIGNACIÓN:

        --------_--------
       |                 |
   %  -|01 T0     VCC  40|- VCC
       |                 |
   T1 -|02 T1     PA0  39|- DUB
       |                 |
  DUC -|03 PB2    PA1  38|- DUA
       |                 |
  DUD -|04 PB3    PA2  37|- DUF
       |                 |
  DUE -|05 PB4    PA3  36|- DUG
       |                 |
%MOSI -|06 MOSI   PA4  35|- DDB
       |                 |
%MISO -|07 MISO   PA5  34|- DDA
       |                 |
 %SCK -|08 SCK    PA6  33|- DDF
       |                 |
  RST -|09 RESET* PA7  32|- DDG
       |                 |
 %RXD -|10 RXD    ICP  31|- #
       |                 |
 %TXD -|11 TXD    ALE  30|-
       |                 |
  DDC -|12 PD2    OC1B 29|-
       |                 |
  DDD -|13 PD3    PC7  28|- DCB
       |                 |
  DDE -|14 PD4    PC6  27|- DCA
       |                 |
  DCC -|15 PD5    PC5  26|- DCF
       |                 |
  DCD -|16 PD6    PC4  25|- DCG
       |                 |
  DCE -|17 PD7    PC3  24|- ML
       |                 |
 XTAL -|18 XTAL2  PC2  23|- %
       |                 |
 XTAL -|19 XTAL1  PC1  22|- B2
       |                 |
  GND -|20 GND    PC0  21|- B1
       |                 |
        -----------------

 % "OUTPUT ENABLE"
 # "PULL UP"

NOTAS:

T1 ENTRADA CONTADOR.
B1 BOTÓN CERO.
B2 BOTÓN MILES.
ML INDICADOR DE MILES.


CONECTOR:

 1 GND ALIMENTACIÓN.
 2 GND ALIMENTACIÓN.
 3 VCC ALIMENTACIÓN.
 4 VCC ALIMENTACIÓN.
 5 TXD.
 6 RXD.
 7 RESET.
 8 B1 BOTÓN CERO.
 9 B2 BOTÓN MILES.
10 T1 ENTRADA CONTADOR.
*/

.NOLIST
.INCLUDE "4414DEF.INC"
.LIST

;	******************
;	*** IGUALDADES ***
;	******************

.EQU	TOPSTK	= RAMEND	;DEFINE TOPE DE LA PILA.
.EQU	DCDLGT	= 60	;LONGITUD CÓDIGOS DEL DECOFIDICADOR.

;	********************
;	*** ASIGNACIONES ***
;	********************

	;R0 USO EN INSTRUCCIÓN LPM.
	;R1:R0 USO EN ALMACENAR EN MEMORIA DE PROGRAMA.
;.DEF		= R2	
;.DEF		= R3	
;.DEF		= R4	
;.DEF		= R5	
;.DEF		= R6	
;.DEF		= R7	
.DEF	GXL	= R8	;GENERAL DE PROGRAMA EXTRA 2 OCTETOS
.DEF	GXH	= R9	;.
.DEF	GIL	= R10	;GENERAL DE INTERRUPCIÓN 2 OCTETOS
.DEF	GIH	= R11	;.
.DEF	GPL	= R12	;GENERAL DE PROGRAMA 2 OCTETOS
.DEF	GPH	= R13	;.
.DEF	GPT	= R14	;GENERAL DE PROGRAMA.
.DEF	RAI	= R15	;ALMACÉN DE SREG EN INTERRUPCIÓN.
.DEF	TPP	= R16	;TRABAJO DE PROGRAMA.
.DEF	TII	= R17	;TRABAJO DE INTERRUPCIÓN.
.DEF	TPL	= R18	;TRABAJO DE PROGRAMA 2 OCTETOS
.DEF	TPH	= R19	;.
.DEF	TIL	= R20	;TRABAJO DE INTERRUPCIÓN 2 OCTETOS
.DEF	TIH	= R21	;.
.DEF	TPX	= R22	;TRABAJO DE PROGRAMA EXTRA.
.DEF	TIX	= R23	;TRABAJO DE INTERRUPCIÓN EXTRA.
.DEF	TWL	= R24	;OPERACIÓN INMEDIATA 2 OCTETOS
.DEF	TWH	= R25	;.
	;R25:R24 OPERANDOS EN ADIW, SBIW.
	;R27:R26 X APUNTADOR GENERAL.
	;R29:R28 Y APUNTADOR GENERAL.
	;R31:R30 Z APUNTADOR GENERAL.

;	************************
;	*** MEMORIA DE DATOS ***
;	************************

.DSEG
DSRTBL:			;COPIA DE TABLA DE DECODIFICACIÓN DE 7 SEGMENTOS EN SRAM.
DSRPAU:	.BYTE	10
DSRPBU:	.BYTE	10
DSRPAD:	.BYTE	10
DSRPDD:	.BYTE	10
DSRPCC:	.BYTE	10
DSRPDC:	.BYTE	10


;	***************************
;	*** MEMORIA DE PROGRAMA ***
;	***************************

.CSEG
.ORG 0
	RJMP	RESET
	RETI	;	RJMP	EXT_INT0
	RETI	;	RJMP	EXT_INT1
	RETI	;	RJMP	TIM1_CAPT
	RETI	;	RJMP	TIM1_COMPA
	RETI	;	RJMP	TIM1_COMPB
	RETI	;	RJMP	TIM1_OVF
	RJMP	TIM0_OVF
	RETI	;	RJMP	SPI_STC
	RETI	;	RJMP	UART_RXC
	RETI	;	RJMP	UART_DRE
	RETI	;	RJMP	UART_TXC
	RETI	;	RJMP	ANA_COMP

;	*******************************************
;	*** RUTINAS DE SERVICIO DE INTERRUPCIÓN ***
;	*******************************************

TIM0_OVF:	;SERVICIO DE INTERRUPCIÓN DE SOBREFLUJO DEL TEMPORIZADOR 0. 2010-09-16 16:08
	IN	RAI,SREG		;RESPALDAR REGISTRO DE ESTADO.
	IN	TIL,TCNT1L	;LEER EL CONTADOR DE PULSOS
	IN	TIH,TCNT1H	;.
	SUBI	TIL,LOW(1000)	;¿CONTADOR CON NÚMERO MENOR A 1000?
	SBCI	TIH,HIGH(1000)	;.
	BRLO	T0O1			;SÍ, SALTA.
	LDI	TIX,0B0000_1000	;INVERTIR TERMINAL PORTC3
	IN	TII,PORTC
	EOR	TII,TIX
	OUT	PORTC,TII		;.
	RJMP	T0OF
T0O1:	IN	TII,PORTC		;APAGAR LED TERMINAL PORTC3
	ORI	TII,0B0000_1000
	OUT	PORTC,TII		;.
T0OF:	OUT	SREG,RAI		;RECUPERAR REGISTRO DE ESTADO.
	RETI

;	***************************
;	*** INICIO DEL PROGRAMA ***
;	***************************

RESET:	;2010-10-14 20:44 2010-09-15 00:39
	LDI	TPP,HIGH(TOPSTK)	;INICIALIZAR APUNTADOR DE PILA
	OUT	SPH,TPP
	LDI	TPP,LOW(TOPSTK)
	OUT	SPL,TPP
	LDI	TPP,0B1111_1111	;CONFIG. PUERTO A.
	OUT	DDRA,TPP
	LDI	TPP,0B1111_1111
	OUT	PORTA,TPP
	LDI	TPP,0B0001_1100	;CONFIG. PUERTO B.
	OUT	DDRB,TPP
	LDI	TPP,0B1111_1111
	OUT	PORTB,TPP
	LDI	TPP,0B1111_1000	;CONFIG. PUERTO C.
	OUT	DDRC,TPP
	LDI	TPP,0B1111_1111
	OUT	PORTC,TPP
	LDI	TPP,0B1111_1100	;CONFIG. PUERTO D.
	OUT	DDRD,TPP
	LDI	TPP,0B1111_1111
	OUT	PORTD,TPP
	RCALL	TDCCPA		;PREPARAR TABLA DE DECODIFICACIÓN DE 7 SEGMENTOS.
	LDI	TPP,0B0000_0111	;CONFIGURAR TCNT1 (111 = FLANCO DE SUBIDA).
	OUT	TCCR1B,TPP
	LDI	TPP,0B0000_0101	;CONFIGURAR TCNT0
	OUT	TCCR0,TPP		;.
	LDI	TPP,0B0000_0010	;CONFIGURAR INTERRUCIONES DE TC0 Y TC1
	OUT	TIMSK,TPP		;.
	SEI			;HABILITAR INTERRUPCIONES.

;	************************
;	*** RUTINA PRINCIPAL ***
;	************************

PCP:	;2010-09-16 16:01
	CLI			;DESHABILITAR INTERRUPCIONES.
	IN	TPL,TCNT1L	;LEER EL CONTADOR DE PULSOS
	IN	TPH,TCNT1H	;.
	SEI			;HABILITAR INTERRUPCIONES.
	RCALL	BNRBCD		;CONVERTIR DE BINARIO A BCD.
	SBIS	PINC,0		;EXHIBIR RESULTADO
	RCALL	EHBCAT		;CONSIDERANDO ESTADO DE B1
	SBIC	PINC,0
	RCALL	EHBCBJ		;.
	SBIC	PINC,1		;INDAGAR ESTADO DE B2.
	RJMP	PCP1			;NO PULSADO, SALTA.
	CLR	TPP		;PREPARAR PARA PONER A CERO.
	CLI			;DESHABILITAR INTERRUPCIONES.
	OUT	TCNT1H,TPP	;PONER EN CERO CONTADOR T1
	OUT	TCNT1L,TPP	;.
	SEI			;HABILITAR INTERRUPCIONES.
PCP1:	RJMP	PCP

;	**********************
;	*** INICIALIZACIÓN ***
;	**********************

TDCCPA:	;DESCRIPCIÓN: COPIA TABLA DE DECODIFICACIÓN DE EXHIBIDOR DE FLASH A SRAM.
	;UTILIZA:  R0 X XH XL ZH ZL TPP
	;ETIQUETAS: TDCCPA: TDCCPA1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS:
	; 2010-09-15 01:52
	LDI	ZL,LOW(2*DCDTBF)	;APUNTAR A TABLAS EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(2*DCDTBF)	;.
	LDI	XL,LOW(DSRTBL)	;APUNTAR A TABLAS EN MEMORIA DE DATOS
	LDI	XH,HIGH(DSRTBL)	;.
	LDI	TPP,DCDLGT	;CONTADOR CON LOGITUD TOTAL DE TABLAS.
TDCCPA1:	LPM			;CARGAR DE MEMORIA DE PROGRAMA.
	ADIW	ZH:ZL,1		;ACTUALIZAR APUNTADOR.
	ST	X+,R0		;ALMACENAR EN MEMORIA DE DATOS, ACTUALIZAR APUNTADOR.
	DEC	TPP		;ACTUALIZAR CONTADOR.
	BRNE	TDCCPA1		;¿TERMINADO?. NO, SALTA.
	RET

;	**********************
;	*** ENTRADA SALIDA ***
;	**********************

EHBCAT:	;DESCRIPCIÓN: EXHIBIR CUARTETO ALTO DE CONVERSIÓN BCD.
	;UTILIZA:  GPH GPT TPP
	;ETIQUETAS: EHBCAT: 
	;ENTRADA: GPT:PGH < OCTETOS 4:3 DE BCD .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS:
	; 2010-09-16 14:06
	RCALL	SMTAPG		;APAGAR TODOS LOS SEGMENTOS.
	MOV	TPP,GPH		;OBTENER OCTETO 3 DE BCD.
	SWAP	TPP
	ANDI	TPP,$0F		;.
	RCALL	SSU		;EXHIBIR.
	MOV	TPP,GPT		;OBTENER OCTETO 4 DE BCD.
	ANDI	TPP,$0F		;.
	RCALL	SSD		;EXHIBIR.
	RET

EHBCBJ:	;DESCRIPCIÓN: EXHIBIR CUARTETO BAJO DE CONVERSIÓN BCD.
	;UTILIZA:  GPL GPH TPP
	;ETIQUETAS: EHBCBJ: 
	;ENTRADA: GPH:PGL < OCTETOS 2:1:0 DE BCD .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS:
	; 2010-09-16 14:06
	RCALL	SMTAPG		;APAGAR TODOS LOS SEGMENTOS.
	MOV	TPP,GPL		;OBTENER OCTETO 0 DE BCD
	ANDI	TPP,$0F		;.
	RCALL	SSU		;EXHIBIR.
	MOV	TPP,GPL		;OBTENER OCTETO 1 DE BCD.
	SWAP	TPP
	ANDI	TPP,$0F		;.
	RCALL	SSD		;EXHIBIR.
	MOV	TPP,GPH		;OBTENER OCTETO 2 DE BCD.
	ANDI	TPP,$0F		;.
	RCALL	SSC		;EXHIBIR.
	RET

SMTAPG:	;DESCRIPCIÓN: APAGAR TODO LOS SEGMENTOS.
	;UTILIZA:  TPP TPX
	;ETIQUETAS: SMTAPG: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS:
	; 2010-09-15 14:07
	LDI	TPX,0B1111_1111	;APAGAR SEGMENTOS DEL PUERTOA
	IN	TPP,PORTA
	OR	TPP,TPX
	OUT	PORTA,TPP		;.
	LDI	TPX,0B0001_1100	;APAGAR SEGMENTOS DEL PUERTOB
	IN	TPP,PORTB
	OR	TPP,TPX
	OUT	PORTB,TPP		;.
	LDI	TPX,0B1111_0000	;APAGAR SEGMENTOS DEL PUERTOC
	IN	TPP,PORTC
	OR	TPP,TPX
	OUT	PORTC,TPP		;.
	LDI	TPX,0B1111_1100	;APAGAR SEGMENTOS DEL PUERTOD
	IN	TPP,PORTD
	OR	TPP,TPX
	OUT	PORTD,TPP		;.
	RET

SSC:	;DESCRIPCIÓN: EXHIBIR CENTENAS.
	;UTILIZA:  R0 ZH ZL TPX TPP
	;ETIQUETAS: SSC: 
	;ENTRADA: TPP < DIGITO BCD [0-9] .
	;SALIDA: NINGUNA (TPP SIN MODIFICAR) .
	;USO:
	;NOTAS: TABLAS; DSRPCC DSRPDC
	; 2010-09-16 12:21
	LDI	ZL,LOW(DSRPCC)	;APUNTAR A TABLA DE DECODIFICACIÓN, PUERTO1
	LDI	ZH,HIGH(DSRPCC)	;.
	RCALL	SSA		;CONSEGUIR CÓDIGO.
	IN	TPX,PORTC		;ACTUALIZAR PUERTO
	AND	TPX,R0
	OUT	PORTC,TPX		;.
	LDI	ZL,LOW(DSRPDC)	;APUNTAR A TABLA DE DECODIFICACIÓN, PUERTO2
	LDI	ZH,HIGH(DSRPDC)	;.
	RCALL	SSA		;CONSEGUIR CÓDIGO.
	IN	TPX,PORTD		;ACTUALIZAR PUERTO
	AND	TPX,R0
	OUT	PORTD,TPX		;.
	RET

SSD:	;DESCRIPCIÓN: EXHIBIR DECENAS.
	;UTILIZA:  R0 ZH ZL TPX TPP
	;ETIQUETAS: SSD: 
	;ENTRADA: TPP < DIGITO BCD [0-9] .
	;SALIDA: NINGUNA (TPP SIN MODIFICAR) .
	;USO:
	;NOTAS: TABLAS; DSRPAD DSRPDD
	; 2010-09-16 12:21
	LDI	ZL,LOW(DSRPAD)	;APUNTAR A TABLA DE DECODIFICACIÓN, PUERTO1
	LDI	ZH,HIGH(DSRPAD)	;.
	RCALL	SSA		;CONSEGUIR CÓDIGO.
	IN	TPX,PORTA		;ACTUALIZAR PUERTO
	AND	TPX,R0
	OUT	PORTA,TPX		;.
	LDI	ZL,LOW(DSRPDD)	;APUNTAR A TABLA DE DECODIFICACIÓN, PUERTO2
	LDI	ZH,HIGH(DSRPDD)	;.
	RCALL	SSA		;CONSEGUIR CÓDIGO.
	IN	TPX,PORTD		;ACTUALIZAR PUERTO
	AND	TPX,R0
	OUT	PORTD,TPX		;.
	RET

SSU:	;DESCRIPCIÓN: EXHIBIR UNIDADES.
	;UTILIZA:  R0 ZH ZL TPX TPP
	;ETIQUETAS: SSU: 
	;ENTRADA: TPP < DIGITO BCD [0-9] .
	;SALIDA: NINGUNA (TPP SIN MODIFICAR) .
	;USO:
	;NOTAS: TABLAS; DSRPAU DSRPBU
	; 2010-09-16 12:21
	LDI	ZL,LOW(DSRPAU)	;APUNTAR A TABLA DE DECODIFICACIÓN, PUERTO1
	LDI	ZH,HIGH(DSRPAU)	;.
	RCALL	SSA		;CONSEGUIR CÓDIGO.
	IN	TPX,PORTA		;ACTUALIZAR PUERTO
	AND	TPX,R0
	OUT	PORTA,TPX		;.
	LDI	ZL,LOW(DSRPBU)	;APUNTAR A TABLA DE DECODIFICACIÓN, PUERTO2
	LDI	ZH,HIGH(DSRPBU)	;.
	RCALL	SSA		;CONSEGUIR CÓDIGO.
	IN	TPX,PORTB		;ACTUALIZAR PUERTO
	AND	TPX,R0
	OUT	PORTB,TPX		;.
	RET

SSA:	;DESCRIPCIÓN: AUXILIAR DE EXHIBIR.
	;UTILIZA:  R0 Z ZH ZL TPP TPX
	;ETIQUETAS: SSA: 
	;ENTRADA: TPP < DESPLAZAMIENTO . ZH:ZL < APUNTADOR A CÓDIGO .
	;SALIDA: ZH:ZL < APUNTANDOR A CÓDIGO . R0 < CÓDIGO .
	;USO:
	;NOTAS: AUXILIAR DE LAS RUTINAS DE EXHIBIR NÚMERO.
	; 2010-09-16 12:21
	CLR	TPX		;DESPLAZAR HACIA CÓDIGO CORRESPONDIENTE
	ADD	ZL,TPP
	ADC	ZH,TPX		;.
	LD	R0,Z		;CARGAR CÓDIGO.
	RET

;	********************
;	*** CONVERSIONES ***
;	********************

BNRBCD:	;DESCRIPCIÓN: CONVERTIR DE BINARIO A BCD (16 DÍGITOS).
	;UTILIZA:  GPL GPH GPT TPP TPL TPH TPX
	;ETIQUETAS: BNRBCD: BNRBCD1: BNRBCDF: BNRBCDA: 
	;ENTRADA: TPH:TPL < NUMERO BINARIO (16 DÍGITOS) .
	;SALIDA: GPT:GPH:GPL < BCD . TPH:TPL < $0000
	;USO:
	;NOTAS: TPH:TPL SE MODIFICAN.
	; 2010-09-16 12:21
	LDI	TPX,16		;PREPARAR CONTADOR DE REITERACIÓN.
	CLR	GPT		;LIMPIAR OCTETOS DE RESULTADOS
	CLR	GPH
	CLR	GPL		;.
BNRBCD1:	LSL	TPL		;DESPLAZAR DÍGITOS DE LOS OCTETOS.
	ROL	TPH
	ROL	GPL
	ROL	GPH
	ROL	GPT		;.
	DEC	TPX		;DECREMENTAR CONTADOR DE REITERACIÓN.
	BREQ	BNRBCDF		;¿FIN DE PROCESO?, SÍ SALTA.
	MOV	TPP,GPT		;COPIA DE OCTETO.
	RCALL	BNRBCDA		;RUTINA AUXILAR DE CORRECCIÓN PARCIAL.
	MOV	GPT,TPP		;	SÍ, SOBRESCRIBIR OCTETO.
	MOV	TPP,GPH		;COPIA DE OCTETO.
	RCALL	BNRBCDA		;RUTINA AUXILAR DE CORRECCIÓN PARCIAL.
	MOV	GPH,TPP		;	SÍ, SOBRESCRIBIR OCTETO.
	MOV	TPP,GPL		;COPIA DE OCTETO.
	RCALL	BNRBCDA		;RUTINA AUXILAR DE CORRECCIÓN PARCIAL.
	MOV	GPL,TPP		;	SÍ, SOBRESCRIBIR OCTETO.
	RJMP	BNRBCD1		;CONTINUAR CON DESPLAZAMIENTOS.
BNRBCDF:	RET

BNRBCDA:	;DESCRIPCIÓN: AUXILIAR CONVERTIR DE BINARIO A BCD (16 DÍGITOS).
	;UTILIZA:  TPP
	;ETIQUETAS: BNRBCDA: 
	;ENTRADA: TPP < CORECCIÓN PARCIAL DE BINARIO A BCD .
	;SALIDA: TPP < OCTETO CORREGIDO PARCIALMENTE .
	;USO:
	;NOTAS: EN EL ALGORITMO EL RESULTADO DEBE SER MULTIPLICADO POR 2.
	; 2010-09-16 12:21
	SUBI	TPP,-$03		;SUMAR $03 (CUARTETO INFERIOR).
	SBRS	TPP,3		;¿ES CORRECTO?.
	SUBI	TPP,$03		;NO, DESHACER SUMA.
	SUBI	TPP,-$30		;SUMAR $30 (CUARTETO SUPERIOR).
	SBRS	TPP,7		;¿ES CORRECTO?.
	SUBI	TPP,$30		;NO, DESHACER SUMA.
	RET			;FIN DE PROCESO.

;	**************
;	*** TABLAS ***
;	**************

;CÓDIGOS DE PUERTO PARA EXHIBIDORES DE 7 SEGMENTOS (GENERADOS POR SCRIPT KUPCTD.AHK)
DCDTBF:
	.DB $F8, $FE, $F4, $F4, $F2, $F1, $F1, $FC, $F0, $F0	;UNIDADES PUERTOA.
	.DB $E3, $FB, $E7, $F3, $FB, $F3, $E3, $FB, $E3, $F3	;UNIDADES PUERTOB.
	.DB $8F, $EF, $4F, $4F, $2F, $1F, $1F, $CF, $0F, $0F	;DECENAS PUERTOA.
	.DB $E3, $FB, $E7, $F3, $FB, $F3, $E3, $FB, $E3, $F3	;DECENAS PUERTOD.
	.DB $1F, $7F, $2F, $2F, $4F, $8F, $8F, $3F, $0F, $0F	;CENTENAS PUERTOC.
	.DB $1F, $DF, $3F, $9F, $DF, $9F, $1F, $DF, $1F, $9F	;CENTENAS PUERTOD.

.EXIT
