Intel8051, кнопки, индикаторы

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
_Iren_
Сообщения: 0
Зарегистрирован: 30 май 2013, 19:17

30 май 2013, 19:19

доброго времени суток) появилась задача: программирование контроллера клавиатуры из 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
при запуске программы происходит опрос клавиатуры построчно. но если кнопка нажата, ничего, к сожалению, не происходит соответственно, не получается определить какая именно кнопка нажата, чтобы вывести ее номер на индикатор..
помогите, кто чем может)
Ответить