Коментирую:
Код: Выделить всё
; мах 80 светодиодов
; вход tmp=[скорость/число светодиодов]
; время вывода 80 сегментов 81,9 мкс
;========================
.equ BAR_PORT = PORTC
.equ bar_res = PC4
.equ bar_clk = PC3
.def bar1 = r17
.def bar2 = r18
.def bar_res = r19
bar:
push bar_res
push bar1
push bar2
clr bar_res
clr bar1
clr bar2
; вычисление числа сегментов V*10/25
; поскольку цена деления 200/80=2,5 км/ч, т.е 200/2,5=80 <=> 2000/25=80
; умножаем на 10
ldi tmp,10
mov bar1,speed
mul bar1,tmp
mov bar1,r0
mov bar2,r1
; делим на 25
ldi tmp,25
div16x8:
sub bar1,tmp
sbci bar2,0
brcs end_div16x8
inc bar_res
rjmp div16x8
end_div16x8:
;загружается общее число светодиодов 80
ldi tmp,80
; и вычисляем число св.диодов которые надо выключить 80-N
sub tmp,bar_res
mov bar_res,tmp
; сборос линейки
cbi BAR_PORT,bar_res
nop
sbi BAR_PORT,bar_res
nop
; выдача тактовых импульсов
; выдаем 80-N тактовых импульсов для записи 1 в регистр.
bar_next:
sbi BAR_PORT,bar_clk
nop
cbi BAR_PORT,bar_clk
dec bar_res
brne bar_next
pop bar2
pop bar1
pop bar_res
ret
Соответственно если надо другое кол-во св.диодов, то делаем так:
Vmax/N - получаем цену деления
дальше где надо вставляем нужное значение цены деления и N
главное не вылезти за размер переменных.