PDA

Просмотр полной версии : Ассемблер i8080, семисегментные индикаторы.



Elvys
06.06.2016, 13:37
Подскажите пожалуйста, как средствами ассемблера для
i8080 преобразовывать шестнадцатеричный код в код
семисегментного индикатора? Что бы без использования
всяких дополнительных дешифраторов выводить на семиэлементных
индикаторах символы от 0 до F и любые другие. Моих "познаний"
в ассемблере никак не хватает, что бы понять, по какому принципу
делать алгоритм преобразования HEX to 7-LED.

Vladimir_S
06.06.2016, 14:02
Elvys, Множество способов, к примеру преобразовать число 2(в аккумуляторе).

Elvys
06.06.2016, 14:04
Я может туплю, но в данном примере метка 7-LED: это всегда адрес первой ячейки из массива db ?
И, подлежащее преобразованию число из аккумулятора, используется как смещение для вычисления
адреса нужного байта данных из массива db ?
Извините, если что. Я в ассемблере очень уж начинающий.:v2_blush:

Vladimir_S
06.06.2016, 14:29
Elvys, Да, какое число в аккумуляторе, настолько и сдвиг по массиву.

- - - Добавлено - - -

Тут в адресе массива есть один подводный камень - для примера адрес 11FE, сложение с аккумулятором может завести не туда.



Зато сам ошибся.

Elvys
06.06.2016, 21:08
У меня получилась такая процедура:


mvi a, 0Fh ;Преобразуемое число
;Программа
lxi b, seg
add c
mov e, a
mov a, b
adc a
mov d, a
ldax d
;Вывод результата
out .....
;Таблица
seg: db 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h
db 7Fh, 6Fh, 77h, 7Ch, 39h, 5Eh, 79h, 71h


Не знаю, на сколько она корректна. По результатам
насилия симулятора, промахов мимо таблицы не случалось,
независимо от состояния флага переноса.
Это я о подводном камне из вложения
http://zx-pk.ru/attachment.php?attachmentid=57322&d=1465210930
На момент готовности своего варианта процедуры "перекодировки"
я еще не видел других вложений с кодом.
С ними так же буду пробовать разобраться.

Update:
Посмотрев другие вложения, составил новый код процедуры.
Предыдущий код оказывал влияние на флаг переноса С,
и пришлось делать извращение, что бы его учесть.
Новый код никак не влияет на состояние флага С, и
при этом корректно формирует адрес обращения к
таблице "перекодировки".


mvi a, 0Fh ;Преобразуемое число
;Программа
lxi h, 0000h
add l
mov l, a
lxi d, seg
dad d
xchg
ldax d
;Вывод результата
out .....
;Таблица
seg: db 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h
db 7Fh, 6Fh, 77h, 7Ch, 39h, 5Eh, 79h, 71h

В любом случае, не ручаюсь за корректность, т.к. сильно начинающий
в программировании и оба этих примера родились исключительно благодаря
помощи от уважаемого Vladimir_S
И да, эти состряпанные мной процедуры никак не учитывают, что
1. Выводится на индикаторы, обычно, результат каких-то действий,
представляющий собой 8 бит в аккумуляторе, а это значит что вывод
нужно делать на два индикатора - по полубайту на каждый.
2. Для вывода я использовал OUT, имея ввиду что индикаторы это порты В/В.
Однако, возможно использование STAX, и это даже сократило бы код.

PATHNK
06.06.2016, 22:27
Elvys
Извините а зачем вам это нужно?
У вас некое устройство, процессор будет записывать число в порт. Намного легче поставить дешифратор.

krt17
06.06.2016, 22:33
Парни вы ппц.

Elvys
06.06.2016, 22:56
Намного легче поставить дешифратор
Вот как раз от использования дешифратора и хочется уйти.
Это имеет отношение к расширению возможностей индикации для "ЮТ-88".

krt17
06.06.2016, 23:03
По результатам насилия симулятора, промахов мимо таблицы не случалось,
Откомпилируйте и запустите не в нулевых адресах, а немного повыше, а лучше подумайте а не копируйте и переделывайте чужое. Весь код в этой теме либо не рабочий, либо с жуткой избыточностью.



;
adi led&#ff
mov l,a
aci led/#100
sub l
mov h,a
mov a,m
;
lxi h,led
mvi b,0
mov c,a
dad b
mov a,m

Elvys
07.06.2016, 00:36
Если код работает при запуске хоть с одного какого-то адреса, его нельзя назвать нерабочим.
В нем просто есть bug ... И вообще, я только учусь....
Человек просто подкинул мне пару примеров. Я с ними помучился и имею представление,
в каком направлении решать нужную мне задачу.

scaraby
07.06.2016, 11:14
В этом примере исходный байт преобразовывается в два семисегментных кода. Значение адреса, по которому располагается "знакогенератор", не важно.


;ПК8000
;Прекрасный ассемблер КР580ВМ80А
;http://asdasd.rpg.fi/~svo/i8080/

.binfile hex7led.bin
.org 4000h ;начальный адрес программы в ОЗУ

;--------------------------------------------------------------------------------
; Константы ;
;--------------------------------------------------------------------------------




;--------------------------------------------------------------------------------
; Переменные ;
;--------------------------------------------------------------------------------

;массив кодов символов семисегментного индикатора
;в случае индикатора с общим анодом, значения инвертировать

Led:
db 01100000b
db 11011010b
db 11110010b
db 01100110b
db 10110110b
db 10111110b
db 11100000b
db 11111110b
db 11110110b
db 11101110b
db 00111110b
db 10011100b
db 01111010b
db 10011110b
db 10001110b

HexData db 0 ;исходное шестнадцатиричное число

Led0 db 0 ;код символа для младшего полубайта
Led1 db 0 ;код символа для старшего полубайта

;--------------------------------------------------------------------------------
; Главный модуль ;
;--------------------------------------------------------------------------------

Start:

;фрагмент, формирующий значение, которое необходимо отобразить

lda HexData

;младший полубайт

ani 0fh ;обнуляем 4 старших бита

call HexToLed

sta Led0 ;сохраняем этот код в ОЗУ для дальнейшего использования

;старший полубайт

lda HexData

ani 0f0h ;обнуляем 4 младших бита
rrc ;и меняем полубайты местами
rrc
rrc
rrc

call HexToLed

sta Led1 ;сохраняем этот код в ОЗУ для дальнейшего использования

; out xx ;вывод в порт старшего полубайта
; lda Led0
; out xx ;вывод в порт младшего полубайта

ret ;выход из программы

;--------------------------------------------------------------------------------
; Процедуры ;
;--------------------------------------------------------------------------------


;процедура расчёта адреса байта для семисегментного кода
;на входе acc - число от 0 до 0fh, на выходе в acc - семисегментный код

HexToLed:
lxi h,Led ;адрес начала массива семисегментных кодов
add l ;находим адрес кода, соответствующий весу цифры
mov l,a ;не забывам, что результат сложения остаётся в acc
mov a,m ;загружаем в acc найденный код

rnc ;если не было переноса CF=0, то возврат

mov a,h ;если вылез CF, то это необходимо учесть
aci 0 ;прибавляем CF к старшему полубайту адреса искомого кода
mov h,a ;помним, что результат всегда в acc

mov a,m ;загружаем в acc найденный код

ret

PATHNK
07.06.2016, 22:41
Может лучше это (http://www.ti.com/lit/ds/symlink/til311.pdf) или это (http://pdf1.alldatasheet.com/datasheet-pdf/view/115069/HP/HDSP-0762.html)?

NEO SPECTRUMAN
07.06.2016, 23:45
Намного легче поставить дешифратор.

Может лучше это (http://www.ti.com/lit/ds/symlink/til311.pdf) или это (http://pdf1.alldatasheet.com/datasheet-pdf/view/115069/HP/HDSP-0762.html)?
триплфеиспальм
а чем это поможет аффтару первого поста
вывести

0 до F и любые другие

вполне можно выжать символы
A a B b C c E d e F G g H h I i J L N n O o P r q S t U u Y Z
Б Г г П п У Ч, Ы Ь Э


для большей наглядности
http://www.josepino.com/articles/display/7-segment-lcd-charset.gif

https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/7-segment.svg/288px-7-segment.svg.png
при наличии фантазии есть где разогнаться


а потом из за таких любителей "по дешифровать"
программно не выведешь долбанную полосочку посредине...

MM
15.06.2016, 00:09
Китайские 2.54 см. индикаторы, до 18 сегментов ( 16 + 2 точки ), общий анод или катод, 10 шт.- 574 руб, включая почту :
http://storage4.static.itmages.ru/i/16/0602/h_1464904537_4604272_f79867cd42.jpg (http://itmages.ru/image/view/4352416/f79867cd)
http://ru.aliexpress.com/item/1inch-1digit-red-16-segment-led-display/32583766140.html?spm=2114.30010708.3.68.admRYw&ws_ab_test=searchweb201556_7,searchweb201602_3_100 34_507_508_10020_10017_10005_10006_10021_10022_100 09_10008_10018_10019,searchweb201603_1&btsid=93d70101-f2db-4886-99dd-0434a28091ef
длинные сегменты - по 2 диода последовательно. На фото - ток ~10 ма ( с 1533АП6 через резистор 150 ом ).
( Прислали через 20 дней после оплаты ).