uldemir а инициализацию, настройку 8255 ты где производил?uldemir писал(а):Вот мой комментированный исходникСпойлер
Код: Выделить всё
; ПОДПРОГРАММА ОПРОСА СОСТОЯНИЯ КЛАВИАТУРЫ ; ВЫХОДНЫЕ ПАРАМЕТРЫ В АККУМУЛЯТОРЕ ; A=00 КЛАВИША НЕ НАЖАТА ; A=FF КЛАВИША НАЖАТА ; ПОДПРОГРАММА МОДИФИЦИРУЕТ ВСЕ ЯЧЕЙКИ ; CNSTAT: LDA PC55 ; КЛАВИША РУС/ЛАТ НАЖАТА? ANI 80H JZ RLPR ; ЕСЛИ ДА, ТО JMP LDA BUFLAG ; А БЫЛА НАЖАТА ? ORA A RNZ RLPR: PUSH H LHLD LASTKY ; ЧИТАЕМ КОД ПОСЛЕДНЕЙ КЛАВИШИ CALL SCAN ; ОПРАШИВАЕМ КЛАВИАТУРУ CMP L ; СРАВНИВАЕМ С ТЕМ ЧТО БЫЛО MOV L,A JZ OLDKOD ; КОД ТОТ-ЖЕ - ПОДАВЛЯЕМ ДРЕБЕЗГ NEWKOD: MVI A,01H ; КОД НОВЫЙ, НАЖАТИЕ ПЕРВОЕ STA PRNFLG MVI H,15H ; ИНИЦИИРУЕМ СЧЕТЧИК ПОДАВЛ. ДРЕБЕЗГА QUT1: XRA A QUT2: SHLD LASTKY ; ПИШЕМ НОВЫЙ КОД POP H STA BUFLAG ; И ВОЗВРАЩАЕМ 0 RET OLDKOD: DCR H ; УМЕНЬШАЕМ СЧЕТЧИК ПОДАВИТЕЛЯ JNZ QUT1 INR A ; СРОК ВЫШЕЛ. JZ QUT2 ; ЕСЛИ ДЛЯ НЕНАЖАТОЙ КНОПКИ INR A JZ RUSLAT ; ЕСЛИ ДЛЯ РУС/ЛАТ PUSH B LXI B,SNDKEY; ДЛЯ ОСТАЛЬНЫХ КЛАВИШ: CALL L92 ; ВЫДАТЬ ЗВУК POP B LDA PRNFLG MVI H,0E0H ; ИНИЦИИРУЕМ СЧЕТЧИК ЗАДЕРЖКИ ДЛЯ DCR A ; АВТОПОВТОРА. STA PRNFLG JZ WTSECN MVI H,40H ; ИЛИ ПЕРИОД АВТОПОВТОРА. WTSECN: MVI A,0FFH ; И ВОЗВРАЩАЕМ ПРИЗНАК НАЖАТИЯ. JMP QUT2 RUSLAT: LDA PC55 ; ОПРАШИВАЕМ РУС/ЛАТ ANI 80H JZ RUSLAT ; ПОКА НАЖАТА. LDA REGR ; ОТПУСТИЛИ... CMA ; ТОГДА ИНВЕРТИРУЕМ РЕГИСТР STA REGR JMP NEWKOD ; ; ПОДПРОГРАММА ВВОДА СИМВОЛА С КЛАВИАТУРЫ ; ОЖИДАЕТ НАЖАТИЕ НА КЛАВИШУ И ВОЗВРАЩАЕТ ; В АККУМУЛЯТОРЕ КОД СИМВОЛА ; МОДИФИЦИРУЕТ ЯЧЕЙКУ ФЛАГА НАЖАТИЯ НА ; КЛАВИШУ ; CONIN: CALL CNSTAT ; ОПРОСИТЬ СОСТОЯНИЕ КЛАВИАТУРЫ ORA A JZ CONIN ; ЖДАТЬ, ЕСЛИ НЕ НАЖАТА XRA A STA BUFLAG ; ЗАПИСАТЬ ПРИЗНАК ОПУСТОШЕНИЯ БУФЕРА LDA LASTKY ; ПРОЧИТАТЬ КОД ИЗ БУФЕРА. RET ; ; ПОДПРОГРАММА ОПРОСА СОСТОЯНИЯ КЛАВИАТУРЫ ; ОПРАШИВАЕТ МАТРИЦУ. РЕЗУЛЬТАТ ВОЗВРАЩАЕТ ; В АККУМУЛЯТОРЕ: ; A=0FF - НЕ НАЖАТА ; A=0FE - РУС/LAT ; ИНАЧЕ КОД КЛАВИШИ ; ЯЧЕЙКИ НЕ МОДИФИЦИРУЕТ, РАБОТАЕТ С ЖЕЛЕЗОМ ; SCAN: LDA PC55 ; ANI 80H ; ПРОВЕРЯЕТ РУС/ЛАТ JNZ CONT1 MVI A,0FEH ; ЕСЛИ НАЖАТА,ТО ВОЗВР.0FEH RET CONT1: XRA A STA PA55 ; НА ВСЕ ГОРИЗОНТАЛИ ВЫДАТЬ 0 STA PC55 ; ПОГАСИТЬ СВЕТОДИОД LDA REGR ; КАКОЙ ТЕКУЩИЙ РЕГИСТР? ANI 01H ORI 06H STA PU55 ; ЗАЖЕЧЬ СВЕТОДИОД В СООТВ. С ЯЧЕЙКОЙ LDA PB55 ; ПРОЧИТАТЬ ВЕРТИКАЛЬНЫЕ ШИНЫ INR A JNZ PRESS DCR A ; ЕСЛИ НЕ НАЖАТЫ, ТО ВОЗВР. 0FFH RET PRESS: PUSH H ; СКАНИРУЕМ МАТРИЦУ MVI L,01H ; H - СКОЛЬКО, L - ЧТО MVI H,07H SCNCYC: MOV A,L RRC ; СДВИГАЕМ ВПРАВО MOV L,A ; И ВЫВОДИМ НА ГОРИЗОНТАЛЬ 0 CMA STA PA55 LDA PB55 ; ЧИТАЕМ ВЕРТИКАЛЬНЫЕ ШИНЫ CMA ORA A JNZ WTPRSS ; ЕСЛИ НАЖАТА, ТО ВЫВАЛИВАЕМСЯ DCR H JP SCNCYC QNPRSS: MVI A,0FFH ; НЕНАЖАТА? ЗНАЧИТ ПОКАЗАЛОСЬ... POP H ; ВОЗВРАЩАЕМ 0FFH RET WTPRSS: MVI L,20H ; H - # ВЕРТИКАЛИ. ПРОВ. УСТОЙЧИВОСТЬ WTCYC: LDA PB55 ; ЕЩЕ РАЗ ПРОЧИТАЛИ, CMA ORA A JZ QNPRSS ; ЧЕРТ, ВСЕ-ТАКИ ПОКАЗАЛОСЬ. DCR L JNZ WTCYC MVI L,08H CLCOD: DCR L ; ВЫЧИСЛЯЕМ КОД КЛАВИШИ RLC JNC CLCOD MOV A,H MOV H,L MOV L,A ; H- #HOR, L=A- #VERT. CPI 01H ; ВЕРТИКАЛЬ ДЛЯ ДОП.КЛАВИАТУРЫ? JZ DOPKEY ; A=1 JC EXTKEY ; A=0 0000VVV RLC ; 000VVV0 RLC ; 00VVV00 RLC ; 0VVV000 ADI 20H ; + 0010000 ORA H ; 0VVVHHH CPI 5FH ; ЕСЛИ СКАН-КОД = 5F JNZ NOSPKY ; ТО ЭТО ВСЕГДА ПРОБЕЛ MVI A,20H POP H RET ; ТАБ,LF ,CR ,BSP,<- ,UP ,-> ,DOW TABL1: DB 09H,0AH,0DH,7FH,08H,19H,18H,1AH ; HOM,ERA,ESC,F1 ,F2 ,F3 ,F4 ,F5 , А ЭТО ЗАЧЕМ? TABL2: DB 0CH,1FH,1BH,00H,01H,02H,03H,04H,05H EXTKEY: MOV A,H LXI H,TABL2 JMP CLCTAB ; ВЫБИРАЕМ ТАБЛИЦУ ПЕРЕКОДИРОВКИ DOPKEY: MOV A,H LXI H,TABL1 CLCTAB: ADD L ; ВЫБРАЛИ ТАБЛИЦУ MOV L,A ; ВЫЧИСЛЯЕМ. В Н И М А Н И Е ! ! ! MOV A,M ; ПЕРЕНОС В СТ. БАЙТ НЕ ПРОИЗВОДИТСЯ CPI 40H ; ЕСЛИ СИМВОЛ НЕ "ЗБ",ТО ВОЗВРАЩАЕМСЯ POP H RC PUSH H NOSPKY: MOV L,A ; КОД В "L" LDA PC55 ; ЧИТАЕМ УПР. КЛАВИШИ MOV H,A ; И СОХРАНЯЕМ В "H" ANI 40H ; ВЫДЕЛЯЕМ "CTRL" JNZ NOCTRL MOV A,L CPI 40H ; КОД НЕ БУКВЕННЫЙ? JM SHNOPR ; ИДЕМ СМОТРЕТЬ "SHIFT" ANI 1FH POP H RET NOCTRL: LDA REGR ; CTRL НЕ НАЖАТА ORA A ; ЧИТАЕМ РЕГИСТР JZ BASREG ; ЕСЛИ LAT, ТО JMP MOV A,L CPI 40H ; КОД НЕ БУКВЕННЫЙ? JM BASREG ; ТОГДА ОБХОДИМ МАСКИРОВАНИЕ ORI 20H MOV L,A BASREG: MOV A,H ; "SHIFT" НАЖАТ ? ANI 20H JNZ SHNOPR MOV A,L ; ДА? ТО ПЕРЕВОРАЧИВАЕМ 6-Й РАЗРЯД CPI 40H ; ДЛЯ БУКВЕННЫХ КЛАВИШ. JM NOLIT MOV A,L XRI 20H POP H ; И ВОЗВРАЩАЕМСЯ. RET NOLIT: MOV A,L ; ЕСЛИ ЦИФРОВАЯ, ТО ОТНИМАЕМ 10H ANI 2FH MOV L,A SHNOPR: MOV A,L ; ЕСЛИ БУКВЕННЫЙ, ТО ВОЗВРАЩАЕМСЯ CPI 40H POP H RP PUSH H MOV L,A ANI 0FH CPI 0CH MOV A,L JM CYFR ; ЕСЛИ КЛАВИШИ ВЕРХНЕГО РЯДА, XRI 10H ; ТО ВОЗВРАТ, ИНАЧЕ ПЕРЕВЕРНУТЬ CYFR: POP H RET
- Вложения
-
- вв55а1.JPG
- (89.14 КБ) 665 скачиваний


