Страница 1 из 2

инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 17:11:51
ascentman
добрый день посетителям форума. У меня есть один очень важный для меня вопрос, поэтому кто хоть немного мне поможет - буду очень благодарен. И так у меня есть разработанный макет в Proteus с подключенной матричной клавиатурой 4 на 4. При запуске на всех выводах клавы встановлються единицы. Вопрос в том, как на ассемблере провести ее инициализацию, т.е. при нажатия на одну из клавиш передать по UART или на индикатор код клавиши. Задача немного сложна для меня, поскольку ассемблер изучаю не долго, а сделать надо. В интернете немного нашел статей и то написанные для других микроконтроллеров, а мне нужно для МК51. Схему и алгоритм по которому сделать - добавляю:

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 17:22:25
DX168B
Был бы это МК AVR, то помог бы. Вообще это делается в 2 счёта.
Выделяем регистр для формирования в нём кода кнопки и пишем в него единицу.
Поднимаем лог. 1 на верхней строке кнопок. Проверяем кнопку 1, если на выводе этого столбца есть отклик (кнопка 1 нажата) то выходим из проверки клавиатуры и отправляем содержимое выделенного регистра по UART, если отклика нет, то увеличиваем содержимое выделенного регистра на 1 и проверяем кнопку 2. и так далее, проверяем все кнопки. Главное - если нет отклика от кнопки, увеличивать содержимое выделенного регистра и проверять следующую кнопку.

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 17:38:48
ascentman
мне советовали это сделать используя маску 11111110 (т.е. по строкам сделать сканирование а по столбцам - чтение) и если нет отклика подвигать 0 влево.
например R1 будет счетчиком я так понял.
mov R1, 11111110b
jb p1.0,exit
exit:
ret
inc R1
jb p1.1,exit


не знаю....нечто вроде того... а как по UART отправить - просто обратиться к порту?

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 21:03:24
DX168B
На этом семействе даже не знаю, как там дела обстоят с UART. Это уже даташит надо читать.

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 22:06:30
МитяРа
Мяу, ascentman..
Найди в инете книжку издательства Бином "Справочник по Однокристальным ЭВМ" - там всё расписано..

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 22:48:22
ascentman
скачал книгу (довольно неплохая) - о матричной клавиатуре ничего не нашел, но о UART нашел много програмок и описания команд, пригодится для экзамена ...спс : http://padabum.com/d.php?id=3606 - може кому-то пригодиться тоже ... а как с клавой то?

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 22:51:12
DX168B
Сейчас напишу для AVR, но с комментами.

Вот:

Код: Выделить всё

KEY_RQ:
ldi R16, 0x01
ldi R17, 0x01
out PortA, r16 ;Поднимаем лог.1 на первой строке
sbic PinA, 4 ;Если на ноге лог. 0, то пропускаем команду ret (проверка первого столбца)
ret ; Если лог 1, то выходим и забираем код кнопки из R17
inc R17 ;Увеличим R17 на 1
sbic PinA, 5 ; Тоже самое, только проверим второй столбец
ret
inc r17
sbic PinA, 6 ;Проверяем третий столбец
ret
inc r17
sbis PinA, 7 ;Проверяем четвёртый столбик.
ret
cpi r17, 0x10 ;Проверим максимальное значение r17
breq END
lsl r16 ;Сдвиг единицы в r16 влево
inc r17
jmp KEY_RQ
END:
ret

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вс май 29, 2011 22:55:06
ascentman
ок))...может по вашему коду изменю под мк51...) хорошо б если исключить дребезг контактов при двойном нажатии....по алгоритму в первому топику.

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Пн май 30, 2011 09:39:25
МитяРа
ascentman писал(а):о матричной клавиатуре ничего не нашел
Не знаю, что и как ты искал, /надо было смотреть стр.277-283/, вот в соседней теме мя скан странички приводил из неё: http://www.radiokot.ru/forum/download/file.php?id=67928

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Пн май 30, 2011 13:19:34
ascentman
МитяРа писал(а):надо было смотреть стр.277-283/, вот в соседней теме мя скан странички приводил из неё: http://www.radiokot.ru/forum/download/file.php?id=67928
DX168B,МитяРа спасибо за помощь - а то я не видел как то зразу...но алгоритм там немного иной(простой)...мне б по тому что в первому посте я писал. Но принцип уловил - попробую что то делать))

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Пн май 30, 2011 13:39:11
МитяРа
ascentman писал(а):Но принцип уловил - попробую что то делать))
Давай занимайся..
В соседней теме тем-же самым Chip115 занимается, но он на Си пишет..

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Пн май 30, 2011 23:16:16
ascentman
помогите еще в одном шаге. Вообще я уже прочитав литературу, реализовал программу сканирования клавиатуры, но вопрос есть еще одно: как сделать вывод цифр через UART (для этого уже есть реализованные подпрограммы UART_init, UART_Write, UART_Read). Просто осталось сделать вывод: я просто не понимаю следующее: вывод осуществляется через аккумулятор, а как здесь это применить?

main:
call init
call UART_init
call Uart_Read
mov A,R0
call UART_Write




;----------------------------------------------------------------------------
; Procedures
;----------------------------------------------------------------------------
init:
mov R0,#20h
mov R1,#28h
mov A,#80h
scan_klava:
mov p1,A
RR A
mov R2,A
mov A,p2
xch A,@R0
mov @R1,A
inc R0
inc R1
mov A,R2
jnb ACC.3,scan_klava
ret

Delay: ; Підпрограма затримки
mov r3,#0ffh
d_m2: mov r2,#0ffh
d_m1:
djnz r2,d_m1
djnz r3,d_m2
ret

UART_init:
mov SCON,#01010000b ; конфігурація послідовного порта
mov PCON,#80h ; конфігурація потужності
mov TMOD,#20h ; режим роботи таймера
mov TH1, #252 ; для швидкості 9600 бод
mov A, SBUF ; онулюєм буфер
setb TR1 ; запуск таймера
ret

;----------------------------------------------------------------------------
Uart_Read:
jnb RI, $ ; очікуєм закінчення передачі щоб почати читання
mov A, SBUF ; пересилання байта в SBUF
clr RI ; очищення біта RI
ret

;----------------------------------------------------------------------------
Uart_Write:
mov SBUF, A ; зчитування байта в ACC
jnb TI, $ ; очікування на прийом
clr TI ; очистка TІ

ret
;-------------- Кінець програми ---------------
end

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 00:27:24
Roman Venom
без понятия как там в МК51, но в аврах/пиках есть буферный регистр в который пишется из аккумулятора(или по линии РХ). Так что алгоритм предельно прост:
записать данные в аккумулятор
записать в буфер
отправить данные (или это делается аппаратно)

С получением данных точно так же...
В даташите должны быть примеры.

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 00:46:55
Meteor
вывод осуществляется через аккумулятор, а как здесь это применить
Так он и применен в следующей строке

Код: Выделить всё

mov SBUF, A ; зчитування байта в ACC
т.е. перед вызовом подпрограммы UART_Write, необходимо поместить в аккумулятор данные, что делается этой строкой

Код: Выделить всё

mov A,R0
 call UART_Write

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 00:49:47
ascentman
и в МК51 тоже он есть SBUF ... но вопрос не в том: я не понимаю, в каком регистре хранится код клавиш после сканирования матрицы, поэтому и не знаю, что именно отправить по UART и в каком месте вызвать эти подпрограммы

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 00:57:58
ascentman
Meteor писал(а):
т.е. перед вызовом подпрограммы UART_Write, необходимо поместить в аккумулятор данные, что делается этой строкой

Код: Выделить всё

mov A,R0
 call UART_Write
сделал так: и выводит в 16овой системе постоянно 40 и так вечно...может какую то умову задать на вывод,...потому что не могу добиться выводу от 1-15 соответственно клаве

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 09:47:17
Engineer_Keen
В приведенном выше коде:
1) В качестве выходного сканируется порт2, а должен быть порт1 (младшая половина, отсекается командой ANL A,#0Fh)
2) Сканировать нулем (хотя теоретически можно и единицей), соответственно переписать строки

Код: Выделить всё

mov A,#80h -> mov A,#07Fh
и

Код: Выделить всё

jnb ACC.3,scan_klava ->jb ACC.3,scan_klava
Можно дописать CPL A после маски ANL A,#0Fh
3) Сохраняется не просто код нажатой клавиши в каком-либо регистре, а последовательность во всех 4х столбцах. По адресам 20h-23h - считанные клавиши, 28h-2Bh - предыдущее состояние клавиш. Причем как нажатие, так и отпускание индицируется единичками в соответствующем разряде. Так что этот код позволяет обнаружить изменение хоть всех 16 кнопок сразу :)))
4) структура программы полный фейл. Например последовательность

Код: Выделить всё

Main:
CALL init
CALL ...
CALL ...
...
init:
...
считываем клавиатуру...
...
RET
Снесет стек сразу. Кстати, тут стек еще и не инициализируется...

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 11:21:51
ascentman
Спс,так и сделал.не спорю,что фейл,но должен слабо курсак. Как тут вивести через uart: свертатся по адресах нажатих клавиш или Как?

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 11:24:13
ascentman
Спс,так и сделал.не спорю,что фейл,но должен слабо курсак. Как тут вивести через uart: свертатся по адресах нажатих клавиш или Как?Зачем нужно

тут стек?

Re: инициализация клавиатуры 4на4 _асемблер

Добавлено: Вт май 31, 2011 12:19:33
Engineer_Keen
Стек всегда нужен, если используются подпрограммы (а тут есть команда CALL).
Как тут вывести еще вопрос. Нужно либо переделывать процедуру сканирования, чтобы она выводила всего одно значение, либо просто передавать весь этот "буфер клавиатуры", который по адресам 20...23-28...2B. Во втором случае можно сделать тупо и некрасиво, но просто:

Код: Выделить всё

mov A,20h
call UART_Write
mov A,21h
call UART_Write
mov A,22h
call UART_Write
mov A,23h
call UART_Write
mov A,28h
call UART_Write
mov A,29h
call UART_Write
mov A,2Ah
call UART_Write
mov A,2Bh
call UART_Write