[an error occurred while processing this directive]
|
Аргумент - в r16
Результат - в r18 - число от 1 до 100, равное round(r16 * 100 / 256)
ldi 17, 28
ldi r18, 0
loop: subi r17, LOW(-100)
sbci r18, HIGH(-100)
subi r16, 1
brnc loop
Не компилировал и на симуляторе не прогонял - но не думаю, что есть серьезные ошибки, кроме текстуальных. Все-таки несколько месяцев на ассемблере AVR уже не писал :)
Чтобы получить две десятичные цифры в двух регистрах в двоичном представлении или в виде ASCII кодов
Аргумент - в r16
Результат - в r18 - младшая цифра, в r19 - старшая
ldi r17, 28
ldi r18, LOW(-10)
ldi r19, 0 ; '0' для ASCII
loop: subi r17, LOW(-100)
sbci r18, HIGH(-100)
brne skipHDigit
ldi r18, LOW(-10)
inc r19
skipHDigit:
subi r16, 1
brnc loop
subi r18, LOW(-10) ; LOW(-'0' - 10) для ASCII
Ах, да... В последнем алгоритме страшая цифра будет равна 10 (или '9'+1, уж не помню, какой там символ), если на индикатор нужно вывести 100%. Что поделаешь, неувязочка, но не слишком принципиальная - проанализировать цифру на равенство 10 после алгоритма проще, чем тащить третий регистр внутрь цикла, дополнительный код тривиален. Да и ведущие нули все равно гасить нужно.
У последнего алгоритма максимальное время выполнения - 1805 циклов. Это, конечно, сильно больше, чем при побитовом умножении, но все равно сильно меньше, чем время реакции глаза при всех разумных тактовых частотах. :)
E-mail: info@telesys.ru