Вопрос по работе с матричной клавиатурой. Программа выводит на св-диоды в двоичном виде номер нажатой клавиши. Кнопок 16.
У меня корректно срабатывают и выводятся значения, соответствующие 1, 2, 4, 8, 16 в двоичном виде.
При нажатии любой другой кнопки не светится ничего, точнее на мгновение загораются нужные светодиоды, но сразу же гаснут. Такое впечатление, будто в порт светодиодов следом за нужным значением выводится ноль.
Подтяжки на входах есть
В студии при отладки вроде все ок
В протеусе работает
На практике нет)
(возможно скопировать текст и вставить в новый лист в студии будет удобнее для глаз. Почему то тут текст "съезжает")
Спасибо за ответы!
Спойлер
Код: Выделить всё
/* МАТРИЧНАЯ КЛАВИАТУРА с выводом в порт двоичного значения (на дисплей символа) нажатой кнопкой
Программа производит считывание матричной клавиатуры.
При нажатой кнопке - выводим ее двухзначный код, иначе - выводим "0".
Матричная клавиатура состоит из 16 клавиш
МЛАДШИЕ 4 разряда порта - столбцы
СТАРШИЕ 4 разряда порта - строки
1 клавиша - на пересечении "1" и "А".
Микроконтроллер ATtiny2313
Тактовая частота 8 MHz
*/
.include "tn2313def.inc"
;НАСТРОЙКА ПОРТОВ
.def temp =R16
.def line =R17
.def column =R18
.def number =R19
.def count_delay =R20
.equ PORT_LED =PORTD
.equ PORT_SW =PORTB
.equ PIN_SW =PINB
.cseg
.org 0x00 rjmp init
;ИНИЦИАЛИЗАЦИЯ
init: ldi temp,low(RAMEND) ;Инициализация стековой памяти
out SPL,temp
ser temp
out DDRD,temp ;Порт D на выход с 0
clr temp
out PORT_LED,temp
ldi temp,0x0F ;Младшая тетрада - выход с 0
out DDRB,temp ;Старшая тетрада - вход с подтяжкой
swap temp
out PORT_SW,temp
;ОСНОВНОЙ ЦИКЛ
MAIN: rcall Keyboard
out PORT_LED,number
clr number
rjmp MAIN
Keyboard: ldi column,0b11111110 ;Обнуление первого столбеца
Next_column:rcall Ch_of_line ;Вызов подпрограммы проверки строк
brne SW_press ;Если кнопка нажата, то Z=0 (в регистре line осталось какое то число)
rol column ;Обнуление след. столбца
sbrc column,4 ;Если еще/уже не были/были обнулены все столбцы по очередно, то
rjmp Next_column ;-обнуляем следующый столбец
rjmp Keyboard ;-обнуляем снова первый столбец
SW_press: rcall delay
rcall Ch_of_line ;Считывание устойчивого состояния
breq Keyboard ;В случае ложного срабатывания (от помехи) - опрашиваем заново
mov R5,line ;Сохранение значения
rcall Ch_of_line ;Ожидание отпускания кнопки
brne PC-1 ;
rcall delay
mov line,R5
add number,line ;Загрузка в регистр number относительного адреса нажатой клавиши
lsr column ;Определение абсолютного адреса нажатой клавиши
brcc Exit_SW
subi number,-4
rjmp PC-3
Ch_of_line: out PORT_SW,column ;Обнуление выбранного столбеца
ldi line,5 ;Регистр будет сдвинут 4 раза
in temp,PIN_SW ;Считывание состояния Вывода порта SW
m1: dec line
breq Exit_SW
lsl temp ;Сдвиг регистра для определения нажатой кнопки
brcs m1
Exit_SW: ret
delay:
; ===========
; delay loop generator
; 400000 cycles:
; -----------------------------
; delaying 399999 cycles:
ldi R21, $97
WGLOOP0: ldi R22, $06
WGLOOP1: ldi R23, $92
WGLOOP2: dec R23
brne WGLOOP2
dec R22
brne WGLOOP1
dec R21
brne WGLOOP0
; -----------------------------
; delaying 1 cycle:
nop
; ===========
ret


