Консультация № 183085
07.05.2011, 02:07
55.00 руб.
0 8 1
Здравствуйте, уважаемые эксперты!
Требуется написать программу для МП КР580:
"Принять код с клавиш 8..F. Если код соответствует нечетному числу, то вывести на дисплей слово НЕЧЕТ, иначе вывести 0 на крайний правый индикатор."
Знаю, что для активизации клавиш 0..7 используются следущие команды:
3Е Е0 MVI A,E0
D3 02 OUT 02
Не понимаю, как активировать ввод с клавиш 8..F (что-то другое будет вместо E0 ?).
C выводом на дисплей проблем нет, там использую команды MVI и STA, руководствуясь тем, что в ячейке 83F8 содержится код для крайней левой позиции дисплея, а в ячейке 83FF - для крайней правой.
(Единственное, не знаю, как принято букву Т обозначать).
Условие проверки кода на нечетное число выполняю с помощью JPE.

Обсуждение

давно
Посетитель
7438
7205
07.05.2011, 11:34
общий
Здравствуйте.
Да, маловато инфорамации... Нужны данные о:
1) Вы правильно говорите, неизвестно, как "активировать" клавиши 8-F. И что понимается под "активацией"?
2) Кроме того, как читать коды клавиш? С какого порта?
3) Может, клавиатуру надо сканировать? Тогда нужны два порта: порт выбора линии и порт чтения на линии...
4) С выводом тоже не все ясно. Понятно, что есть 8 адресов, куда можно что-то записать. Непонятно, в каком виде туда писать! Какой код соответствует всем необходимым символам. Впрочем, может зажигание идет по 8-ми сегментам? Тогда понятно... Кстати, букву T в таком случае, обычно, кодируют, как t (а что делать?)
5) С логикой тоже не все понятно... Как вводить число? С любой одной клавиши, как одноциферное число? Или требуется ввести многоцифровое число? Тогда как заканчивать ввод числа? Скорее всего, первое...
Если принять в случаях 4 и 5 те варианты, что предположил я, то остается непонятка с клавиатурой... Без чего программу не написать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
07.05.2011, 11:55
общий
07.05.2011, 11:56
Адресаты:
Из теор.справки: "Порт А (адрес 00) используется для ввода информации от клавиатуры, а порт С (02) - для вывода информации на индикаторные схемы ИС; для выдачи сигналов управления на клавиатуру, для выдачи сигналов разрешения работы монитора и дисплея, а также для вывода информации на магнитофон."
Да, зажигание идет по 8 сегментам.
Как я понял, в тот момент, когда я нажимаю какую-то из клавиш 8..F, на индикаторе должно высветиться либо НЕЧЕТ, либо 0, а затем программа пойдет на следующий цикл.
Вот ещё пример есть:
"Простейшая программа ввода - вывода, осуществляющая перезапись кода с клавиатуры на младший разряд дисплея, приведена ниже.
Код:
АДРЕС     МАШИННЫЙ   КОД  МЕТКА     МНЕМОКОД     КОММЕНТАРИЙ

8200 21 FF 83 LXI H,83FF Засылка в пару HL адреса младшего
разряда индикатора
8203 3E E0 MVI A,E0 Выдача сигнала разрешения
8205 D3 02 OUT 02 работы дисплея и включения клавиш 0...7
8207 DB 00 CONT IN 00 Ввод с клавиш
8209 2F СMA Инверсия аккумулятора
820A 77 MOV M,A Запись в регистр дисплея
820B C3 07 82 JMP CONT Переход на продолжение цикла


При нажатии любой клавиши с обозначением от 0 до 7 (или их произвольной комбина-ции) на индикаторе должны засветиться соответствующие сегменты. Команда инверсии CMA по адресу 8209 необходима вследствие того, что клавиатура УОУ имеет инверсный выход: код нажатой клавиши равен нулю, а отжатой - единице."
Неизвестный
07.05.2011, 12:02
общий
Приложу теор.справку
Прикрепленные файлы:
d3e8cc7df1424de7b365b38f1de69f48.doc
давно
Посетитель
7438
7205
07.05.2011, 16:48
общий
Ок, уже кое-что. Ждите. Сделаю.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
09.05.2011, 11:06
общий
Требуется уточнить один вопрос:
Налицо противоречие в предоставленном файле.
1) Согласно рисунку 1.1, для выбора линии клавиатуры используются выводы 4, 5, 6 порта С
2) А, согласно рисунку 1.2, используются выводы 1, 2, 3
Я больше склоняюсь к первому случаю, т.к., исходя из программки, в порт заносится код E0. Т.е., активация клавиш 0-7 выполнилась с помощью вывода 4.
Пожалуй, так и сделаю... Т.к., подозреваю, что Вы не в курсе...
Если что, потом подправим
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
09.05.2011, 11:36
общий
Еще момент...
Проверять на нечетное число бит или на нечетное число?
Это все же разные вещи...
Делаю проверку на нечетное число, т.е. на деление на 2
(jpe же проверяет на нечетное число единиц в двоичном виде...)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
09.05.2011, 12:06
общий
это ответ
Здравствуйте, Alex12!
Вот Вам программа. Комментарии смотрите в коде.

Код:

mvi a,0d0h ;Выдача сигнала разрешения работы дисплея
; и включения битом 5 клавиш 8...f
out 2
cont in 0 ;читам код
cpi 0ffh ;если ff, то ничего не нажато
jz cont ;ждем новый код

;ищем бит 0
mvi b,8 ;база кодов линейки (8-f)
shift rrc ;сдвинем на 1 бит, мл уходит в С
jnc analize ;0 - нашли
inr b ;нет увеличиваем код клавиши
jmp shift ;сдвигаем дальше

;проанализируем на четность
analize lxi h,83f8h ;засылка в пару HL адреса старшего индикатора
mov a,b ;код клавиши
rrc ;четность определяется младшим битом
jc nechet ;1 - число нечетное

;0 - четное
mvi a,0 ;погасим 7 первых
mov m,a
inx h
mov m,a
inx h
mov m,a
inx h
mov m,a
inx h
mov m,a
inx h
mov m,a
inx h
mov m,a
inx h
mov a,00111111b ;0 в последний
mov m,a
jmp cont ;на сканирование клавиатуры

;нечет
nechet mvi a,0 ;погасим 3 первых
mov m,a
inx h
mov m,a
inx h
mov m,a
inx h
mov a,01110110b ;H
mov m,a
inx h
mov a,01111100b ;Е
mov m,a
inx h
mov a,01100110b ;Ч
mov m,a
inx h
mov a,01111100b ;Е
mov m,a
inx h
mov a,01111000b ;t
mov m,a
jmp cont ;на сканирование клавиатуры

end
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
09.05.2011, 20:36
общий
Адресаты:
Большое спасибо! Код понял
Несоответствие в рисунках я тоже заметил.
Форма ответа