Evgenii Legotckoi
23 августа 2015 г. 7:00

BCD формат на Assembler в AVR Atmega

Десятичные числа на машинном языке могут быть представлены в виде восьмиразрядных последовательностей единиц и нулей, то есть байтов. При этом существует два вида форматов представления десятичных чисел. Это упакованный формат ( BCD ) и распакованный.

Распакованный формат

В данном формате один разряд десятичного числа помещается в один байт. А именно в младшую тетраду байта, тогда как старшая тетрада (именуемая зоной) заполняется единицами. К примеру число 157 будет выглядеть следующим образом.


Упакованный формат - BCD

В упакованном формате байт содержит два разряда десятичного числа и также может содержать код знака. Как в ниже следующем примере, в котором представлено число "-1574".

Преобразование числа в BCD в шестнадцатеричный вид и обратно

При работе с микроконтроллерами Atmega может понадобиться преобразование числа в шестнадцатеричном виде в формат упакованного десятичного числа, то есть в BCD формат:

  1. ;======= Преобразование из BCD в HEX ===================================================
  2. BCD_to_HEX:
  3. push r16 ; Помещаем преобразуемую величину в стек
  4. andi r16,0b11110000 ; Маскируем регистр r16, как старший разряд
  5. swap r16 ; Меняем тетрады местами
  6. ldi r17,10 ; Записываем во вспомогательный регистр значение 10
  7. mul r16,r17 ; Умножаем значение регистра r16 на 10, результат сохраняется
  8. ; в регистры r1, r0
  9. pop r16 ; Изымаем сохраненную величину из стека
  10. andi r16,0b00001111 ; Маскируем регистр r16, как младший разряд
  11. add r16,r0 ; Производим сложение регистра r16 с регистром r0,
  12. ; в результате получаем двоичное число от 0 до 99
  13. ret

А также обратное преобразование:

  1. ;======= Преобразование из HEX в BCD ====================================================
  2. HEX_to_BCD:
  3. clr r17 ; Очищаем регистр help
  4. HEX_to_BCD_l:
  5. subi r16,10 ; temp = temp 10
  6. brcs HEX_to_BCD_2 ; Прервать, если перенос установлен
  7. inc r17 ; Инкрементируем r17
  8. rjmp HEX_to_BCD_l ; Проходим по циклу проверки заново
  9. HEX_to_BCD_2:
  10. subi r16,-10 ; компенсируем отрицательное значение в r16
  11. swap r17 ; Меняем тетрады местами
  12. or r16,r17 ; Объединяем полученные значения в Упакованный BCD
  13. ret

Как Вы уже заметили, работа производится в этих программах с четырьмя регистрами: r0, r1, r16, r17. Целевым регистром в данном случае выступает регистр r16. Также эти программки работают с числами от 0 до 99.

Внимание. Также для работы библиотеки требуется инициализировать Стек микроконтроллера. Например следующим образом:

  1. ;======= Макросы ========================================================================
  2. ; Макрос вывода в порт или регистр
  3. .macro outi
  4. ldi r16, @1
  5. out @0,R16
  6. .endm
  7. ;========================================================================================
  8. RESET:
  9. outi SPL,Low(RAMEND) ; Инициализация стека
  10. outi SPH,High(RAMEND)

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь