8 Bits Division Display
8 Bits Division Display
; 8bits_display.asm
;
; Created: 2/6/2018 18:25:07
; Author : georg
;
in tempo, mcucr
andi tempo, 0b11101111
out mcucr, tempo
programa:
in tempo, pina
mov dd8u, tempo
in tempo, pinb
mov dv8u, tempo
div8u:
sub drem8u,drem8u ; clear remainder and carry
ldi dcnt8u,9 ; init loop counter
d8u_1:
rol dd8u ; shift left dividend
dec dcnt8u ; decrement counter
brne d8u_2 ; if done
rjmp fraccionaria ; return
d8u_2:
rol drem8u ; shift dividend into remainder
sub drem8u,dv8u ; remainder = remainder - divisor
brcc d8u_3 ; if result negative
add drem8u,dv8u ; restore remainder
clc ; clear carry to be shifted into result
rjmp d8u_1 ; else
d8u_3:
sec ; set carry to be shifted into result
rjmp d8u_1
fraccionaria:
ldi tempo, 10
mul drem8u, tempo
ldi aux, 3
div16u: clr drem16uL ;clear remainder Low byte
sub drem16uH,drem16uH;clear remainder High byte and carry
ldi dcnt16u,17 ;init loop counter
d16u_1: rol dd16uL ;shift left dividend
rol dd16uH
dec dcnt16u ;decrement counter
brne d16u_2 ;if done
dec aux
cpi aux,2
breq cargar_dato
cpi aux,1
breq cargar_dato1
cpi aux,0
breq cargar_dato2
ret ; return
next:
ldi tempo, 10
mul drem16uL, tempo
rjmp div16u
cargar_dato:
mov r4,r0
rjmp next
cargar_dato1:
mov r3,r0
rjmp next
cargar_dato2:
mov r2,r0
rjmp fraccion
fraccion:
mov tempo, r4
cpi tempo, 2
brcs menor
breq menor
brcc mayor
mayor:
ldi tempo, 10
mul r4, tempo
mov aux, r0
add aux, r3
rjmp num
menor:
ldi tempo, 100
mul r4, tempo
mov aux, r0
mov tempo, r3
cpi tempo, 5
breq menor1
brcs menor1
ldi tempo, 10
mul r4, tempo
mov aux, r0
add aux, r3
rjmp num
menor1:
ldi tempo, 10
mul r3, tempo
add aux, r0
cpi aux, 250
breq suma
add aux, r2
rjmp num
suma:
mov tempo, r2
cpi tempo, 5
brcs menor2
ldi tempo, 0
mul r2, tempo
add aux, r0
rjmp num
menor2:
add aux, r2
rjmp num
num:
in tempo, pinc
andi tempo, 0b10000000
cpi tempo, 0
breq entera
mov tempo, aux
andi tempo, 0b00001111
ldi zh,high(tabla7seg<<1)
ldi zl, low(tabla7seg<<1)
add zl, tempo
clr tempo
adc zh, tempo
lpm tempo, z
com tempo
ori tempo, 0b10000000
out portc, tempo
mov tempo, aux
andi tempo, 0b11110000
swap tempo
ldi zh,high(tabla7seg<<1)
ldi zl, low(tabla7seg<<1)
add zl, tempo
clr tempo
adc zh, tempo
lpm tempo, z
com tempo
ori tempo, 0b10000000
out portd, tempo
rjmp programa
entera:
mov tempo, dd8u
andi tempo, 0b00001111
ldi zh,high(tabla7seg<<1)
ldi zl, low(tabla7seg<<1)
add zl, tempo
clr tempo
adc zh, tempo
lpm tempo, z
com tempo
ori tempo, 0b10000000
out portc, tempo
mov tempo, dd8u
andi tempo, 0b11110000
swap tempo
ldi zh,high(tabla7seg<<1)
ldi zl, low(tabla7seg<<1)
add zl, tempo
clr tempo
adc zh, tempo
lpm tempo, z
com tempo
andi tempo, 0b01111111
out portd, tempo
rjmp programa
tabla7seg:
.db 0b10111111, 0b10000110
.db 0b11011011, 0b11001111
.db 0b11100110, 0b11101101
.db 0b11111101, 0b10000111
.db 0b11111111, 0b11101111
.db 0b11110111, 0b11111100
.db 0b10111001, 0b11011110
.db 0b11111001, 0b11110001
EJEMPLO UTILIZADO
PORT A=178
PORT B=11
ENTERO= 16
FRACCION=18