MATEMATICAS_INC

La siguiente es la libreria de MATEMATICAS.INC para los cursos de digitales II y domotica

CBLOCK .97 ;UTILIZA 27 REGISTROS h_byte l_byte count mulcnd mulplr
 * registros de la multiplicacion

dividendo divisor cociente residuo cont1
 * registros de la division 1 byte/ 1 byte
 * registros de conersion 2 bytes a millar,centena
 * decena, unidad

digh0 ;millar digh1 ;centena digh2 ;decena digh3 ;unidad factor

datoh datol r18 dato val1
 * registros de conversion 1 byte a cent
 * decena y unidad

dividendoh dividendol divisorh divisorl cocientel
 * registros de la division de 2 bytes
 * entre 1 byte, resultado en dos bytes

cocienteh residuoacum ENDC

Multip clrf h_byte ;limpia el Byte alto clrf l_byte ;limpia el byte bajo movlw 8 ;carga el contador movwf count ; movf mulcnd,w ;multiplicanbdo se carga en W bcf STATUS,C ;limpia el carry ciclo rrf mulplr ;rota a la derecha btfsc STATUS,C ;Verifica el estado del carry addwf h_byte ;Si uno, agregar multiplicador al byte alto rrf h_byte ;Rotar a derecha byte alto rrf l_byte ;rotar a derecha´byte bajo decfsz count ;decrementa contador y verifica si es cero goto ciclo return

divi2 clrf cociente movf dividendo,W movwf residuo repitediv movf divisor,w subwf residuo,F btfss STATUS,C goto sum1div incf cociente goto repitediv sum1div movf divisor,w addwf residuo,F return
 * inicio funcion basica de division ---
 * fin funcion basica de division ---

decdatohh ;decodifica dato (hex) a decimal clrf cont1 clrf digh0 clrf digh1 clrf digh2 clrf digh3
 * inicio decdatohh convierte un hexadecimal a un decimal de cuatro cifras***

movlw 0ffh movwf factor

reiniciarfactor clrf cont1 movlw 0h ;Cargar para compararlo con xorwf datoh,W ;el decimal 0 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto cicloh ;Si no es igual, salir goto ciclohh ;si dato h es igual a cero, salte a solo verificar los bajos

cicloh movf factor,W xorwf cont1,W btfsc STATUS,Z goto saleh2 ;si dato1 es igual a cont1, debe terminar y cargar el nuevo ciclo incf digh3,F movlw 0ah ;Cargar para compararlo con xorwf digh3,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1 ;Si no es igual, salir clrf digh3 incf digh2,F movlw 0ah ;Cargar para compararlo con xorwf digh2,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1 ;Si no es igual, salir de la interrupci¢n clrf digh2 incf digh1,F movlw 0ah ;Cargar para compararlo con xorwf digh1,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1 ;Si no es igual, salir de la interrupci¢n clrf digh1 incf digh0,F movlw 0ah ;Cargar para compararlo con xorwf digh0,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1 ;Si no es igual, salir de la interrupci¢n clrf digh0

saleh1 incf cont1,F goto cicloh

saleh2 incf digh3,F movlw 0ah ;Cargar para compararlo con xorwf digh3,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto decrementardatoh ;Si no es igual, salir clrf digh3 incf digh2,F movlw 0ah ;Cargar para compararlo con xorwf digh2,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto decrementardatoh ;Si no es igual, salir de la interrupci¢n clrf digh2 incf digh1,F movlw 0ah ;Cargar para compararlo con xorwf digh1,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto decrementardatoh ;Si no es igual, salir de la interrupci¢n clrf digh1 incf digh0,F movlw 0ah ;Cargar para compararlo con xorwf digh0,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto decrementardatoh ;Si no es igual, salir de la interrupci¢n clrf digh0

decrementardatoh decfsz datoh,F goto reiniciarfactor ;no es cero el decremento de dato h clrf cont1 ;termino de multiplicar el dato alto por 255 ciclohh movf datol,W xorwf cont1,W btfsc STATUS,Z goto saleh2h ;si datoh es igual a cont1, debe terminar y cargar el nuevo ciclo incf digh3,F movlw 0ah ;Cargar para compararlo con xorwf digh3,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1h ;Si no es igual, salir clrf digh3 incf digh2,F movlw 0ah ;Cargar para compararlo con xorwf digh2,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1h ;Si no es igual, salir de la interrupci¢n clrf digh2 incf digh1,F movlw 0ah ;Cargar para compararlo con xorwf digh1,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1h ;Si no es igual, salir de la interrupci¢n clrf digh1 incf digh0,F movlw 0ah ;Cargar para compararlo con xorwf digh0,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto saleh1h ;Si no es igual, salir de la interrupci¢n clrf digh0

saleh1h incf cont1,F goto ciclohh

saleh2h movlw 0ffh ;Cargar para compararlo con xorwf datol,W ;el decimal 255 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto salirdedecdatohh ;Si no es igual, salir incf digh3,F movlw 0ah ;Cargar para compararlo con xorwf digh3,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto salirdedecdatohh ;Si no es igual, salir clrf digh3 incf digh2,F movlw 0ah ;Cargar para compararlo con xorwf digh2,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto salirdedecdatohh ;Si no es igual, salir de la interrupci¢n clrf digh2 incf digh1,F movlw 0ah ;Cargar para compararlo con xorwf digh1,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto salirdedecdatohh ;Si no es igual, salir de la interrupci¢n clrf digh1 incf digh0,F movlw 0ah ;Cargar para compararlo con xorwf digh0,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto salirdedecdatohh ;Si no es igual, salir de la interrupci¢n clrf digh0 salirdedecdatohh retlw 0


 * Fin decdatohh convierte un hexadecimal a un decimal de cuatro cifras***

decdato ;decodifica dato (hex) a decimal clrf cont1 clrf digh1 clrf digh2 clrf digh3 movlw 0ffh ;inicia operación de resta movwf r18 movf val1,W subwf r18,W

ciclo11 movf dato,W xorwf cont1,W btfsc STATUS,Z goto sale22 incf digh3,F movlw 0ah ;Cargar para compararlo con xorwf digh3,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto sale11 ;Si no es igual, salir clrf digh3 incf digh2,F movlw 0ah ;Cargar para compararlo con xorwf digh2,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto sale11 ;Si no es igual, salir de la interrupci¢n clrf digh2 incf digh1,F movlw 0ah ;Cargar para compararlo con xorwf digh1,W ;el decimal 10 btfss STATUS,Z ;Verificar resultado de la comparaci¢n goto sale11 ;Si no es igual, salir de la interrupci¢n clrf digh1

sale11 incf cont1,F goto ciclo11

sale22 retlw 0

divi1 clrf cocientel clrf cocienteh clrf residuoacum

movlw 04h subwf dividendoh,W btfsc STATUS,Z goto igualesdividenha4

movf dividendoh,W movwf residuoacum goto seguirdividiendo

igualesdividenha4 clrf residuoacum seguirdividiendo movf dividendoh, btfss STATUS,Z goto noescerodividenh goto escerodividenh
 * movlw 00h
 * movwf residuoacum

noescerodividenh movlw d'255' movwf dividendo call divi2 movf residuo,W addwf residuoacum,F
 * despues de llamar a divi2 ya existe un cociente y un residuo
 * por ello hay que incrementar cocientel y cocienteh

movf cociente,W addwf cocientel,F btfsc STATUS,C incf cocienteh,F ;si existe carry=1 entonces incrementa decf dividendoh,F movf dividendoh,F btfss STATUS,Z goto noescerodividenh goto escerodividenh
 * si no existe carry debe al igual que en linea anterio a decrementar

escerodividenh noescerodividenl movf dividendol,w movwf dividendo call divi2 movf residuo,W addwf residuoacum,F
 * despues de llamar a divi2 ya existe un cociente y un residuo
 * por ello hay que incrementar cocientel y cocienteh

movf cociente,W addwf cocientel,F btfsc STATUS,C incf cocienteh,F ;si existe carry=1 entonces incrementa
 * si no existe carry debe al igual que en linea anterio a decrementar

movf residuoacum,W movwf dividendo call divi2
 * despues de llamar a divi2 ya existe un cociente y un residuo
 * por ello hay que incrementar cocientel y cocienteh

movf cociente,W addwf cocientel,F btfsc STATUS,C incf cocienteh,F ;si existe carry=1 entonces incrementa

return