Iren
Newbie level 3
Hello! (and apologize in advance for my English) I have some problem with programming 8051.. This is my code:
But survey is in the lines, and does not go into columns
What is my mistake?
Code:
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, NEXT; проверка не нажата ли предыдущая кнопка
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
But survey is in the lines, and does not go into columns
What is my mistake?