Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.5.2013
Репутация: нет Всего: нет
|
доброго времени суток) появилась задача: программирование контроллера клавиатуры из 16 кнопок (4×4), код кнопки выводится на двухразрядный семи сегментный индикатор. все это на основе микросхемы intel8051. к задаче прилагался нерабочий код. путем изменений получилось вот так: Код | ORG 0000H ; смещение при загрузке кода будет равно 0 LJMP SBROS ; переход на сброс ORG 000BH ; смещение на 11 байт LJMP TIME_00 ; переход на обработку переполнения таймера ORG 0100H ; пропускаем первые 256 байт, которые отводятся под блок PSP DIGITS: DB 03fh,06h,05bh,04fh,066h,06dh,07dh,07h,07fh,06fh ; цифры на индикаторе от 0 до 9 SBROS: CLR TCON.4 ; остановка таймера MOV R3, #00H ; обнуляем R3 MOV TMOD, #1 ; запускаем т/с в режиме таймера MOV P1, #00H ; обнуляем P1 MOV P3, #00H ; обнуляем P3 START: CLR A ; очищаем аккумулятор CLR C ; обнуляем флаг переноса MOV R5, #10H ; Нач. значение для перебора строк MOV R1, #004H ; счетчик декрементов при вычислении смещений регистра строк ; CJNE - сравнивает значения первых двх операндов и выполняет ветвление, если операнды не равны READ_ROW: CJNE R4, #0, READ_ROW; проверка не нажата ли предыдущая кнопкаMOV A, R5 RRC A ; Сдвиг содержимого аккумулятора вправо. седьмой бит = С JC START ; если установлен перенос (с=1), переход на метку старт DEC R1 ; уменьшаем R1 - прошла обработка одной строки, переход на следующую MOV R5, A ; в R5 помещаем следующую строку MOV P0, R5 ;подсветка очередной строки MOV A, P1 ;считывание столбцов JZ READ_ROW ; переход, если содержимое аккумулятора равно 0 MOV R4, #1 ; нажата ли кнопка в данной строке MOV DPTR, #DIGITS MOV R2, #0 ;счётчик инкрементов для вычисления номера столбца NEXT: INC R2 RRC A ; Сдвиг содержимого аккумулятора вправо через флаг переноса JNC NEXT ; если установлен перенос, переход на метку next ; JB - если бит равен нулю. вычисление первой цифры номера кнопки JB P1.0, OUT1_0 JB P1.1, OUT1_0 JB P1.3, OUT1_1 JB P1.2, OUT1_0 OUT1_1: MOV P2, #00000110B ; код единицы LJMP OUT2 OUT1_0: MOV P2, #00111111B ; код нуля OUT2: MOV A, R1 ;вычисление второй цифры номера кнопки MOV B, #004H ; число смещений MUL AB DEC R2 ADD A, R2 MOVC A, @A+DPTR ; загружает аккумулятор константой из памяти программы MOV P3, A ; выдает константу в индикатор - P3 MOV TH0, #76 MOV TL0, #01 MOV IE, #10000010B ; прерывания разрешены для T/C0 SETB TCON.4 LJMP READ_ROW TIME_00: INC R3 ;обработки прерывания по переполнению таймера 0 CJNE R3, #20, CYCLE ;ожидание 1 сек CLR TCON.4 ;остановка таймер 0 MOV P2, #0 ;погашение индикатора порта 2 MOV P3, #0 ;погашение индикатора порта 3 MOV R4, #0 ;сброс флажка индикации предыдущей кнопки MOV R3, #00H CYCLE: RETI END
|
при запуске программы происходит опрос клавиатуры построчно. но если кнопка нажата, ничего, к сожалению, не происходит соответственно, не получается определить какая именно кнопка нажата, чтобы вывести ее номер на индикатор.. помогите, кто чем может)
|