Двух-байтовое двоичной число в десятичное.
Двух-байтовое двоичной число в десятичное.
Всем доброго времени! Хочу составить на ассемблере программу для считывания данных с входов микросхемы и вывода на 4-разрядный индикатор, но не понимаю как. С 8-ми битовым числом всё легко, а вот с 16-ти... Дальше того, что считал данные с двух портов и записал их в регистры дело не пошло
Помогите, кто может.
Последний раз редактировалось Hailmary Вт янв 24, 2023 17:46:03, всего редактировалось 1 раз.
- Реклама
Re: Двух-битовое двоичной число в десятичное.
А давайте вначале выучим, что бит - это одит разряд (binary digit), а байт - это 8 битов!
Затем выучим, что в 1 байте числа от 0 до 255. А в двух байтах 256×256 = 65536 чисел и они будут в диапазоне 0 - 65535.
Ну и после этого можно уже найти реализацию конвертера bin-to-bcd, то есть в поразрядную десятичную.
Чтобы отобразить число до 65535, нужно 5 разрядов десятичного числа. В каждом разряде будут числа 0 - 9, которые и будут показываться на пятиразрядном индикаторе.
Затем выучим, что в 1 байте числа от 0 до 255. А в двух байтах 256×256 = 65536 чисел и они будут в диапазоне 0 - 65535.
Ну и после этого можно уже найти реализацию конвертера bin-to-bcd, то есть в поразрядную десятичную.
Чтобы отобразить число до 65535, нужно 5 разрядов десятичного числа. В каждом разряде будут числа 0 - 9, которые и будут показываться на пятиразрядном индикаторе.
Последний раз редактировалось MLX90640 Вт янв 24, 2023 13:31:41, всего редактировалось 1 раз.
Re: Двух-битовое двоичной число в десятичное.
Для начинающего более удобно или табличное преобразование или метод вычитания.
Деление со сдвигом конечно более оптимально - но там таки больше мороки...
Вычитаем десятки тысяч - складываем в байтик результат
Вычитаем тысячи - складываем в байтик результат
Вычитаем сотни - складываем в байтик результат
в остатке остаются десятки
Затем выполняем табличное перекодирование двоично-десятичных значений из байтиков результата в сегментные коды и выгружаем результат в наш дисплейчик.

И таки 4-х разрядного индикатора для полного диапазона из двух байт маловато - у нас ведь максимум 65536 -
это ПЯТЬ разрядов индикации...

Деление со сдвигом конечно более оптимально - но там таки больше мороки...
Вычитаем десятки тысяч - складываем в байтик результат
Вычитаем тысячи - складываем в байтик результат
Вычитаем сотни - складываем в байтик результат
в остатке остаются десятки
Затем выполняем табличное перекодирование двоично-десятичных значений из байтиков результата в сегментные коды и выгружаем результат в наш дисплейчик.
И таки 4-х разрядного индикатора для полного диапазона из двух байт маловато - у нас ведь максимум 65536 -
это ПЯТЬ разрядов индикации...
Re: Двух-битовое двоичной число в десятичное.
Два байта на 4 сегмента (полностью) можно вывести только в HEX.
Тогда проблема резко упрощается - надо вывести "байт" на 2 разряда, и так сделать 2 раза (для первого и второго байтов).
Как вывести "байт" в 2 разряда? Пишется простая процедура перевода байта в HEX (т.е. 2 байта со значением 0-15). Потом эти два числа выводятся на два разряда индикатора, каждый в свой. Для упрощения можно использовать табличное преобразование числа 0-15 в символ 0-9-A-F.
Тогда проблема резко упрощается - надо вывести "байт" на 2 разряда, и так сделать 2 раза (для первого и второго байтов).
Как вывести "байт" в 2 разряда? Пишется простая процедура перевода байта в HEX (т.е. 2 байта со значением 0-15). Потом эти два числа выводятся на два разряда индикатора, каждый в свой. Для упрощения можно использовать табличное преобразование числа 0-15 в символ 0-9-A-F.
Re: Двух-битовое двоичной число в десятичное.
Как вариант. Проще вновь написать, чем найти
Спойлер
Код: Выделить всё
; преобразование в 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: Двух-байтовое двоичной число в десятичное.
Всех благодарю за ответы, особенно Вас, akl, уже второй раз выручаете!


