Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

214 Часть 11. Программирование микроконтроллеров АVR на ассемблере не от О до 9 преобразуется в символьный код простым прибавлением к ее значению числа $ 3 0 (десятичное 48 - код символа цифры О в таблице ASCII), то для числа необходимо уже преобразование в строку. Требуется для наших целей это доста­ точно редко, но вывести что-то понятное в такие программы, как монитор порта Arduino, можно только таким способом (нормальные программы-терминалы, в от­ личие от монитора порта, принимают числа в любой форме) . Процедура (лис­ тинг 8 . 1 4) переводит упакованные ВСD-значения, а для перевода обычных чисел (понятно, что только в диапазоне от О до 99) их предварительно надо перевести в BCD процедурой Ьin2bcd8 . · ; на входе в temp упакованное ВСD-значение ; на выходе в templ : temp ASCI I -cтpoкa bcd2txt : ; bcd -> текст максимум 2 разряда mov templ , temp andi templ , OЫl l l O O O O ; выделяем старший swap templ ; меняем тетрады местами в старшем suЬi templ , -$ 3 0 ; старший в templ andi temp, ObO O O O l l l l ; выделяем младший suЬi temp , -$ 3 0 ;младший в . temp ret Есть, конечно, и другие способы преобразования . В языке С, например, иногда ис­ пользуют такие хитрые процедуры в одну строку: uint8_t bcd2Ьin ( uint8_t val ) { return val - 6 * ( val >> 4 ) ; } uint8_t Ьin2bcd ( uint8_t val ) { return val + 6 * ( val / 1 0 ) ; } Если вы, восхищенные подобной лаконичностью, попытаетесь перевести это на ассемблер, то получите в результате код, не сильно отличающийся по объему от того, что мы здесь привели, и тоже содержащий операции аппаратного умножения, причем в обоих случаях. Потому мы не станем терять время на рассмотрение раз­ ных вариантов, а двинемся дальше. Более громоздкая задача- преобразование многоразрядных чисел. hреобразовы­ вать ВСD-числа, состоящие более чем из одного байта, обратно в НЕХ-формат приходится крайне редко, зато задача прямого преобразования возникает на каж­ дом шагу - при выводе на дисплей или при преобразовании в ту же АSСП-строку цифровых символов для передачи через UART. Преобразование 1 6-разрядного числа в общем случае займет 5 десятичных разря­ дов, и соответствующая процедура ( Ьin2BCD1 6 ) приведена в «аппноте» АVR204. Если числа укладываются в диапазон 3 -х десятичных разрядов (от О до 999 = $ 03Е7 ) , то можно упростить эту процедуру, сократив количество используемых регистров. Такой вариант процедуры (назовем его Ьin2bcdl O ) может потребоваться достаточно часто, т. к. результаты различных измерений: температуры, давления, расстояния, напряжения - чаще всего удобно представлять именно в виде трех.разрядного де-

RkJQdWJsaXNoZXIy MTExODQxMg==