Обсуждаем контроллеры компании Atmel.
Ответить

Двух-байтовое двоичной число в десятичное.

Вт янв 24, 2023 12:55:58

Всем доброго времени! Хочу составить на ассемблере программу для считывания данных с входов микросхемы и вывода на 4-разрядный индикатор, но не понимаю как. С 8-ми битовым числом всё легко, а вот с 16-ти... Дальше того, что считал данные с двух портов и записал их в регистры дело не пошло :? Помогите, кто может.
Последний раз редактировалось Hailmary Вт янв 24, 2023 17:46:03, всего редактировалось 1 раз.

Re: Двух-битовое двоичной число в десятичное.

Вт янв 24, 2023 13:17:43

А давайте вначале выучим, что бит - это одит разряд (binary digit), а байт - это 8 битов!
Затем выучим, что в 1 байте числа от 0 до 255. А в двух байтах 256×256 = 65536 чисел и они будут в диапазоне 0 - 65535.

Ну и после этого можно уже найти реализацию конвертера bin-to-bcd, то есть в поразрядную десятичную.
Чтобы отобразить число до 65535, нужно 5 разрядов десятичного числа. В каждом разряде будут числа 0 - 9, которые и будут показываться на пятиразрядном индикаторе.
Последний раз редактировалось MLX90640 Вт янв 24, 2023 13:31:41, всего редактировалось 1 раз.

Re: Двух-битовое двоичной число в десятичное.

Вт янв 24, 2023 13:31:21

Для начинающего более удобно или табличное преобразование или метод вычитания.
Деление со сдвигом конечно более оптимально - но там таки больше мороки...
Вычитаем десятки тысяч - складываем в байтик результат
Вычитаем тысячи - складываем в байтик результат
Вычитаем сотни - складываем в байтик результат
в остатке остаются десятки
Затем выполняем табличное перекодирование двоично-десятичных значений из байтиков результата в сегментные коды и выгружаем результат в наш дисплейчик.
8)
И таки 4-х разрядного индикатора для полного диапазона из двух байт маловато - у нас ведь максимум 65536 -
это ПЯТЬ разрядов индикации...
:wink:

Re: Двух-битовое двоичной число в десятичное.

Вт янв 24, 2023 13:40:00

Два байта на 4 сегмента (полностью) можно вывести только в HEX.
Тогда проблема резко упрощается - надо вывести "байт" на 2 разряда, и так сделать 2 раза (для первого и второго байтов).
Как вывести "байт" в 2 разряда? Пишется простая процедура перевода байта в HEX (т.е. 2 байта со значением 0-15). Потом эти два числа выводятся на два разряда индикатора, каждый в свой. Для упрощения можно использовать табличное преобразование числа 0-15 в символ 0-9-A-F.

Re: Двух-битовое двоичной число в десятичное.

Вт янв 24, 2023 14:49:17

Как вариант. Проще вновь написать, чем найти
Спойлер
Код:
; преобразование в BCD значения регистров R22:R21
   SER   ZL
   MOV   R5,ZL
   MOV   R6,ZL
   MOV   R7,ZL
   MOV   R8,ZL
;   MOV   R9,ZL
R5_10000:
   INC   R5
   SUBI   R22,BYTE1(10000)
   SBCI   R21,BYTE2(10000)
   BRCC   R5_10000

   SUBI   R22,BYTE1(-10000)
   SBCI   R21,BYTE2(-10000)
R6_1000:
   INC   R6
   SUBI   R22,BYTE1(1000)
   SBCI   R21,BYTE2(1000)
   BRCC   R6_1000

   SUBI   R22,BYTE1(-1000)
   SBCI   R21,BYTE2(-1000)
R7_100:
   INC   R7
   SUBI   R22,BYTE1(100)
   SBCI   R21,BYTE2(100)
   BRCC   R7_100

   SUBI   R22,BYTE1(-100)
   SBCI   R21,BYTE2(-100)
R8_10:
   INC   R8
   SUBI   R22,BYTE1(10)
   SBCI   R21,BYTE2(10)
   BRCC   R8_10

   SUBI   R22,BYTE1(-10)
   SBCI   R21,BYTE2(-10)

   MOV   R9,R22
;*************************************************
;гашение незначащих нулей
        CLR   R4
   LDI   R20,10
   
T_PROV10000:
   CP   R5,R4
   BRNE   T_PROV_OUT
   MOV   R5,R20
T_PROV1000:
   CP   R6,R4
   BRNE   T_PROV_OUT
   MOV   R6,R20
T_PROV100:
   CP   R7,R4
   BRNE   T_PROV_OUT
   MOV   R7,R20
T_PROV10:
   CP   R8,R4
   BRNE   T_PROV_OUT
   MOV   R8,R20
T_PROV_OUT:
; R9 значащий всегда
   RET

Re: Двух-байтовое двоичной число в десятичное.

Вт янв 24, 2023 17:50:09

Всех благодарю за ответы, особенно Вас, akl, уже второй раз выручаете!
Ответить