

		

	LIST	P=16F876

	

	INCLUDE	P16F876.INC
	
		
	__config 0x3B31
	
	

#DEFINE RESET	PORTC,1
#DEFINE	MAS	PORTB,6
#DEFINE MENOS	PORTB,7
#DEFINE	SMAX1	PORTB,0
#DEFINE SMAX2	PORTB,1


HIPE	MACRO
	bcf	INTCON,RBIF
	bsf	INTCON,RBIE
	bsf	INTCON,GIE
	ENDM


DELAY		EQU	0X2A
Temporal_1	EQU	0X21
Temporal_2	EQU	0X22
TEMPORAL_10	EQU	0X23
TT		EQU	0X24
TA		EQU	0X25
REG_L  		EQU 	0X26
REG_H	 	EQU	0X27 
TEMP1		EQU 	0x28
TR		EQU	0X29
BCD_2		EQU	0X2C               
BCD_1		EQU	0X2D                  
BCD_0     	EQU	0X2E
TIEMPO_1        EQU	0X2F          
TEMP_1		EQU	0X30 
TEMPORAL	EQU	0X31
TEMP		EQU	0X32	
DELA		EQU	0X33
	
	ORG	0x00
	goto	INICIO
	ORG	0X04
	goto	INT
	

	INCLUDE VFD.INC
	

TABLA_HEX	addwf	PCL,F
		retlw	"0"
		retlw	"1"
		retlw	"2"
		retlw	"3"
		retlw	"4"
		retlw	"5"
		retlw	"6"
		retlw	"7"
		retlw	"8"
		retlw	"9"
		retlw	"A"
		retlw	"B"
		retlw	"C"
		retlw	"D"
		retlw	"E"
		retlw	"F"


;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes	movwf	PCL		;Calcula el desplazamiento sobre la tabla

;***********************************************************************************
;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga

Mens_0		equ	$		;Mens_0 apunta al primer carácter del mensaje 0
		dt	"                ",0x00

Mens_1		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"TM-",0x00

Mens_3		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"TA-",0x00
Mens_4_1	equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"    TEST *C*    ",0x00
Mens_4		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"    TEST *F*    ",0x00
Mens_5		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"   CAL  KM/H    ",0x00
Mens_6		equ	$		;Mens_1 apunta al primer carácter del mensaje 1
		dt	"   CAL  RPM     ",0x00
Mens_2		equ	$		;Mens_2 apunta al primer carácter del mensaje 2
		dt	"-KM/H  D-",0x00
Mens_7		equ	$
		dt	"AJUSTES  FABRICA",0X00
Mens_8		equ	$
		dt	" GRABANDO DATOS ",0X00
Mens_9		equ	$		;Mens_2 apunta al primer carácter del mensaje 2
		dt	"00 RPM D-",0x00

Mens_10		equ	$		;Mens_2 apunta al primer carácter del mensaje 2
		dt	"0 OHMS   ",0x00

Mensaje		movwf   Temporal_1      ;Salva posición de la tabla
Mensaje_1       movf    Temporal_1,W    ;Recupera posición de la tabla
                call    Tabla_Mensajes  ;Busca caracter de salida
                movwf   Temporal_2      ;Guarda el caracter
                movf    Temporal_2,F
                btfss   STATUS,Z        ;Mira si es el último
                goto    No_es_ultimo
                return
No_es_ultimo    call    VFD_DATA      ;Visualiza en el LCD
                incf    Temporal_1,F    ;Siguiente caracter
                goto    Mensaje_1
		
;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Byte_H y
;Byte_L y, en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2,
;siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por Microsystems
;Engineering

I_VFD	call	RES_VFD
	movlw	b'11000000'		;dig counter control
	call	VFD_DATA
	movlw	b'11100101'		;brightness control
	call	VFD_DATA
	movlw	b'10101111'		; BUFFER POINTER CONTROL
	call	VFD_DATA
	return

PVTA	movlw	b'10101111'
	call	VFD_DATA
	return


PVTR	movlw	b'10100111'
	call	VFD_DATA
	return

Bits16_BCD	bcf	STATUS,C
		clrf	TEMP_1	
		bsf	TEMP_1,4	;Carga el contador con 16		
		clrf	BCD_0
		clrf	BCD_1
		clrf	BCD_2		;Puesta a 0 inicial

Loop_16		rlf	REG_L,F
		rlf	REG_H,F
		rlf	BCD_2,F
		rlf	BCD_1,F
		rlf	BCD_0,F		;Desplaza a izda. (multiplica por 2)
		decfsz	TEMP_1,F
		goto	Ajuste
		return

Ajuste		movlw	BCD_2
		movwf	FSR		;Inicia el índice
		call	Ajuste_BCD	;Ajusta el primer byte
		incf	FSR,F
		call	Ajuste_BCD	;Ajusta el segundo byte
		incf	FSR,F
		call	Ajuste_BCD
		goto	Loop_16

Ajuste_BCD	movf	INDF,W		
		addlw	0x03
		movwf	TEMPORAL	
		btfsc	TEMPORAL,3	;Mayor de 7 el nibble de menos peso ??
		movwf	INDF		;Si, lo acumula
		movf	INDF,W		
		addlw	0x30
		movwf	TEMPORAL
		btfsc	TEMPORAL,7	;Mayor de 7 el nibble de menos peso ??
		movwf	INDF		;Si, lo acumula
		return

C_A_D		clrf	REG_L
		clrf	REG_H
		clrf	ADRESH
		bsf	STATUS,RP0	;ACTIVAR CONVERTIDOR ANALOGICO DIGITAL
		bcf	STATUS,RP1
		movlw	b'00101000'
		movwf	TRISA
		movlw	b'00000001'
		movwf	ADCON1
		bcf	STATUS,RP0
		movlw	b'10100001'
		movwf	ADCON0
		movlw	.25
		movwf	DELAY
		call	DELAY_3
		bcf	PIR1,ADIF
		bsf	ADCON0,GO
ADC_WA		btfss	PIR1,ADIF
		goto	ADC_WA
		bsf	STATUS,RP0
		bcf	STATUS,RP1
		movlw	b'00000110'	; PA E/S DIGITALES
		movwf	ADCON1
		bcf	STATUS,RP0
		movf	ADRESH,W
		movwf	TA
		return



DISP_A_D	movf	REG_H,W
		andlw	0x0F
		btfsc	STATUS,Z
		movlw	" "
		btfss	STATUS,Z
		iorlw	0x30		;Convierte a ASCII el nible de menos peso
		call	VFD_DATA	;Lo visualiza
		swapf	REG_L,W
		andlw	0x0F
		iorlw	0x30		;Convierte a ASCII el nible de más peso
		call	VFD_DATA	;Lo visualiza
		movf	REG_L,W
		andlw	0x0F
		iorlw	0x30		;Convierte a ASCII el nible de menos peso
		call	VFD_DATA	;Lo visualiza
		movlw	"C"
		andlw	b'01111111'
		call	VFD_DATA
		return	


NUM_BCD		clrf	REG_L		;Pone el registro 0x10 a 0
		clrf	REG_H		;Pone el registro 0x11 a 0

NUM_BCDA	addlw	0xf6		;Dado que 0xf6 es 246 en decimal el dato que
					;sumes de W con 0xf6 da un registro de resta con 
					;10 por suma de complemento a 2 en W, con 
					;Carry en ESTADO,C
		btfss	STATUS,0	;?Hay Acarreo¿, es decir la suma anterior dio un 
					;resultado superior a 255 
		goto	NUM_BCDC	;No
		movwf	TEMP1		;Si, mueve el valor de W a TEMP1
		incf	REG_L,F		;Incrementa en 1 el valor de REG_L
		movf	REG_L,W		;Mueve el valor de REG_H a W
		xorlw	b'00001010'	;Pasa el registro W por la mascara 00001010
		btfss	STATUS,2	;Es 0 el resultado de la operacion control de
					;ESTADO,Z
		goto	NUM_BCDB	;No 
		clrf	REG_L		;Si poner a cero el registro
		incf	REG_H,1		;Incrementa el valor y lo pone en REG_H

NUM_BCDB	movf	TEMP1,0		;Mueve el valor de REG_L A W
		goto	NUM_BCDA	;Repite la operacion

NUM_BCDC	addlw	0x0a		;suma 10 al valor de W
		swapf	REG_L,1		;Intercambio de los 4 bits de menos pero por los					;4 de mas peso
		iorwf	REG_L,1		;Se realiza la operacion logica OR y se carga F

		return



	
SEC		movlw	.1
		movwf	DELA
DELAY_5		movlw	.195
		movwf	TMR0
		bcf	INTCON,T0IF
DELAY_6		clrwdt
		btfss	INTCON,T0IF
		goto	DELAY_6
		decfsz	DELA,F
		goto	DELAY_5
		return










SEC1		movlw	.25
		movwf	DELAY
DELAY_3		movlw	.195
		movwf	TMR0
		bcf	INTCON,T0IF
DELAY_4		clrwdt
		btfss	INTCON,T0IF
		goto	DELAY_4
		decfsz	DELAY,F
		goto	DELAY_3
		return



		
INT	btfss	INTCON,RBIF
	retfie
	btfss	MAS
	goto 	A_T
	btfss	MENOS
	goto	M_T
	bcf	INTCON,RBIF
	retfie

A_T	call	SEC
	btfsc	MAS
	retfie
	movlw	.150
	xorwf	TR,W
	btfss	STATUS,Z
	incf	TR,F
	bcf	INTCON,RBIF
	retfie
M_T	call	SEC
	btfsc	MENOS
	retfie
	movlw	0x00
	xorwf	TR,W
	btfss	STATUS,Z
	decf	TR,F
	bcf	INTCON,RBIF
	bcf	SMAX2
	retfie



		
		


INICIO	bsf	STATUS,RP0	;paso banco1
	bcf	STATUS,RP1
	movlw	b'00000110'	; PA E/S DIGITALES
	movwf	ADCON1
	movlw	b'00111111'
	clrf	TRISA		; PA SALIDAS
	movlw	b'11110000'
	movwf	TRISB		; PB SALIDAS
	movlw	b'11010000'
	movwf	TRISC		; pc ent sal
	
	movlw	b'00000111'	; CONF. TMR0
	movwf	OPTION_REG
	movlw	b'01000000'
	movwf	SSPSTAT
	
	bcf	STATUS,RP0	; PASO BANCO 0	
	clrf	PORTB
	bsf	RESET
	movlw	b'00110010'	; configuracion spi
	movwf	SSPCON
	call	I_VFD
	movlw	Mens_0
	call	Mensaje
	movlw	.25
	movwf	TR
	bcf	SMAX1
	bcf	SMAX2
	movlw	b'10001000'
	movwf	INTCON
REPETIR	call	PVTA
	movlw	Mens_1
	call	Mensaje
	movf	TR,W
	call	NUM_BCD
	call	DISP_A_D
	call	PVTR
	movlw	Mens_3
	call	Mensaje
	call	C_A_D
	call	NUM_BCD
	call	DISP_A_D
	movf	TR,W
	subwf	TA,W
	btfsc	STATUS,C	;mayor que la max
	goto	SUP_MAX
	nop
	bcf	SMAX1
	btfss	SMAX2		;PREGUNTAMOS POR CHIVATO 2 SI ESTA ENCENDIDO
	goto	CONTT
	movf	TT,W
	subwf	TA,W
	btfss	STATUS,C	;mayor que la max-2
	bcf	SMAX2		;2 MENOR QUE LA MAXIMA ACTUAL
CONTT	goto	REPETIR
		
SUP_MAX	bsf	SMAX1
	bsf	SMAX2
	movlw	0x01		;RESTA 1 GRADOS PARA APAGAR OTRO CHIVATO
	subwf	TR,W
	movwf	TT
	goto	REPETIR



	END