@runapa

Как выводить числа на семисегментный дисплей в Microprocesor Simulator 5v32?

Как сделать так, чтобы число выводилось на 7 сегментный двойной дисплей? Например цифра три на левой части дисплея имеет код 9Е и чтобы вывести результат сложения 1 + 2 мне надо 3 как-то преобразовать в 9Е.
Как это делается?
Асcемблер используется из программы Microprocesor Simulator 5v32
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
Microprocesor Simulator 5v32

Следовало это в заголовке отразить :)

Задача тут получается в том, чтобы преобразовать число в сигнал для вывода на этом дисплее.
63a3f545951b5190245050.png
Как можно увидеть, каждый бит на PORT 2 отвечает за разные сегменты дисплея.
Первые 7 - за сами сегменты в порядке: Верхний, Верхний-Левый, Нижний-Левый, Нижний, Нижний-Правый, Центральный, Верхний-Правый.
Последний бит отвечает за выбор одного из двух дисплеев. 0 - первый, 1-второй.

Вот так можно вывести 33:
Start: 

; Чистим первый знак
MOV AL, 0
OUT 02 

; Чистим второй знак
MOV AL, 1
OUT 02

; 3 на первый
MOV AL, 9e
OUT 02

; 3 на второй
MOV AL, 9f
OUT 02

END


Преобразовать одно в другое можно разве что тупым сопоставлением:
1=06
2=B6
3=9E
4=4E
5=DC
6=FC
7=86
8=FE
9=DE
0=FA

Которое можно представить в виде процедуры с кучей CMP и JNZ:
Код


Start: 
MOV AL, 0
OUT 02 


MOV AL, 1
OUT 02

; Для примера выведем 42
MOV AL, 4 ; Первая цифра
CALL 30
OUT 02

MOV AL, 2 ;Вторая цифра
CALL 30
OR AL, 1 
OUT 02

; ----- DIGIT TO SEGMENT -----
ORG 30

CMP AL, 00
JNZ ONE
MOV AL, FA
RET

One:
CMP AL, 01
JNZ Two
MOV AL, 06
RET

Two:
CMP AL, 02
JNZ Three
MOV AL, B6
RET

Three:
CMP AL, 03
JNZ Four
MOV AL, 9E
RET

Four:
CMP AL, 04
JNZ Five
MOV AL, 4E
RET

Five:
CMP AL, 05
JNZ Six
MOV AL, DC
RET

Six:
CMP AL, 06
JNZ Seven
MOV AL, FC
RET

Seven:
CMP AL, 07
JNZ Eight
MOV AL, 86
RET

Eight:
MOV AL, FA
JNZ Nine
CMP AL, FE
RET

Nine:
CMP AL, 09
JNZ err ; Если это и не 9, то просто сваливаемся в ошибку
MOV AL, DE
RET

err:
HALT
; ----- END OF PROCEDURE -----


63a3fec97bcff188600728.png

UPD: придумал более лаконичный способ, где коды каждого символа записаны в ОЗУ (мб можно красивее)
Код

JMP Start
DB fa; 0
DB 06; 1
DB b6; 2
DB 9e; 3
DB 4e; 4
DB dc; 5
DB fc; 6
DB 86; 7
DB fe; 8
DB de; 9
DB ee; A
DB 7c; B
DB 70; C
DB 3e; D
DB f4; E
DB e4; F

Start:
MOV AL,0
OUT 02 

MOV AL,1
OUT 02

MOV AL,42
CALL 40

PUSH BL
POP AL
OUT 02

PUSH CL
POP AL
OUT 02

; ----- DIGIT TO SEGMENT -----
; INPUT: AL
; OUTPUT: BL, CL

ORG 40
PUSH AL
POP BL
PUSH AL
POP CL
AND BL,F0
SHR BL
SHR BL
SHR BL
SHR BL
AND CL,0F

ADD BL,2
ADD CL,2

MOV BL,[BL]
MOV CL,[CL]
OR CL,1

RET
; ----- END OF PROCEDURE -----


END

Ответ написан
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
цифра три на левой части дисплея имеет код 9Е и чтобы вывести результат сложения 1 + 2 мне надо 3 как-то преобразовать в 9Е

Типовое решение этой задачи -- через таблицу преобразования, где индекс -- это то, что нужно отобразить, а содержимое -- это то, что нужно записать в порт для отображения. Для вывода цифр от 0 до 9 и вашего дисплея таблица будет такой:
0xfa, 0x0a, 0xb6, 0x9e, 0x4e, 0xdc, 0xfc, 0x8a, 0xfe, 0xde
.
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Прибавить 0x9E-3=0x9B? Ну это если коды цифр идут подряд
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Код цифры - в сигналы 7 сегментного индикатора это классическая задача на системотехника.

Рисуют табличку. Потом минимизируют через карты Карно. Получается 7 булевых функций которые отображают номер в сегменты индикатора.

Но для нашего случая табличка из 10 цифр сойдёт.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы