;********************************* Aritmetica_14.asm ************************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
;
; Programa ejemplo de utilización de subrutinas aritméticas. En el LCD se visualizará una
; división en decimal. Por ejemplo:
; - En la primera línea del LCD: "35089÷108=324".
; - En la segunda línea del LCD: "Resto = 97" 
;
; Utiliza la subrutina Arit_Divide_16Bit de la libreria Aritmetica.inc que realiza la
; división como se indica mediante los siguientes registros:
; (Arit_Dividendo_H, Arit_Dividendo_L) / (Arit_Divisor) = (Arit_Cociente_H, Arit_Cociente_L)
; y el resto en (Arit_Resto).
;
; La división se hará sin signo y el divisor será de 7 bits, es decir su valor máximo será:
; b'01111111'=0x7F=d'127'. El máximo valor posible del dividendo será 65535.
;
; ZONA DE DATOS *************************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK	0x0C
	GuardaResto
	ENDC

DIVIDENDO	EQU	.35089				; Por ejemplo utilizará estos números.
DIVISOR		EQU	.108

; ZONA DE CÓDIGOS ***********************************************************************

	ORG 	0
Inicio
	call	LCD_Inicializa
	movlw	DIVISOR					; Carga el divisor y comprueba que no es igual a cero.
	movwf	Arit_Divisor
	movf	Arit_Divisor,F
	btfss	STATUS,Z
	goto	VisualizaDividendo
	movlw	MensajeError			; Si el divisor es cero, visualiza un mensaje de error.
	call	LCD_Mensaje
	goto	Fin
VisualizaDividendo
	movlw	HIGH DIVIDENDO			; Visualiza dividendo en decimal.
	movwf	Arit_Binario_H
	movlw	LOW DIVIDENDO
	movwf	Arit_Binario_L
	call	Arit_Bin_BCD_16Bit		; Pasa de binario natural en 16 bits a BCD de 5 digitos.
	call	Arit_VisualizaBCD		; Lo visualiza.
	movlw	0xFD					; Posición del signo de la división para LCD,
	call	LCD_Caracter			; (ver tabla de la figura 13-4 del libro).
	clrf	Arit_Binario_H			; Visualiza el divisor en decimal.
	movlw	LOW DIVISOR
	movwf	Arit_Binario_L
	call	Arit_Bin_BCD_16Bit		; Pasa de binario natural en 16 bits a BCD de 5 digitos.
	call	Arit_VisualizaBCD		; Lo visualiza
	movlw	'='						; Visualiza signo de igualdad.
	call	LCD_Caracter
;
	movlw	HIGH DIVIDENDO			; Carga todos los registros para realizar la división.
	movwf	Arit_Dividendo_H
	movlw	LOW DIVIDENDO
	movwf	Arit_Dividendo_L
	movlw	DIVISOR
	movwf	Arit_Divisor
	call	Arit_Divide_16Bit		; Realiza la división.
;
	movwf	GuardaResto				; Salvaguarda el valor del resto.
	movf	Arit_Cociente_H,W		; Y ahora visualiza el cociente.
	movwf	Arit_Binario_H
	movf	Arit_Cociente_L,W
	movwf	Arit_Binario_L
	call	Arit_Bin_BCD_16Bit		; Pasa de binario natural en 16 bits a BCD de 5 digitos.
	call	Arit_VisualizaBCD		; Visualiza el cociente.
;
	call	LCD_Linea2				; Ahora visualiza el resto en la segunda línea.
	movlw	MensajeResto
	call	LCD_Mensaje
	clrf	Arit_Binario_H
	movf	GuardaResto,W			; Recupera el valor del resto.
	movwf	Arit_Binario_L
	call	Arit_Bin_BCD_16Bit		; Pasa de binario natural en 16 bits a BCD de 5 digitos.
	call	Arit_VisualizaBCD		; Visualiza el resto.
Fin	sleep							; Pasa a modo de bajo consumo.

Mensajes
	addwf	PCL,F
MensajeError
	DT "Divide por CERO!",0x00
MensajeResto
	DT "Resto = ", 0x00

	INCLUDE	<ARITMETICA.INC>
	INCLUDE	<RETARDOS.INC>
	INCLUDE	<LCD_4BIT.INC>
	INCLUDE <LCD_MENS.INC>
	END
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
