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

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

добрый день посетителям форума. У меня есть один очень важный для меня вопрос, поэтому кто хоть немного мне поможет - буду очень благодарен. И так у меня есть разработанный макет в Proteus с подключенной матричной клавиатурой 4 на 4. При запуске на всех выводах клавы встановлються единицы. Вопрос в том, как на ассемблере провести ее инициализацию, т.е. при нажатия на одну из клавиш передать по UART или на индикатор код клавиши. Задача немного сложна для меня, поскольку ассемблер изучаю не долго, а сделать надо. В интернете немного нашел статей и то написанные для других микроконтроллеров, а мне нужно для МК51. Схему и алгоритм по которому сделать - добавляю:
Вложения
maket.rar
(12.11 КБ) 148 скачиваний
IMG_01.jpg
(127.96 КБ) 451 скачивание
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Был бы это МК AVR, то помог бы. Вообще это делается в 2 счёта.
Выделяем регистр для формирования в нём кода кнопки и пишем в него единицу.
Поднимаем лог. 1 на верхней строке кнопок. Проверяем кнопку 1, если на выводе этого столбца есть отклик (кнопка 1 нажата) то выходим из проверки клавиатуры и отправляем содержимое выделенного регистра по UART, если отклика нет, то увеличиваем содержимое выделенного регистра на 1 и проверяем кнопку 2. и так далее, проверяем все кнопки. Главное - если нет отклика от кнопки, увеличивать содержимое выделенного регистра и проверять следующую кнопку.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

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


не знаю....нечто вроде того... а как по UART отправить - просто обратиться к порту?
Вложения
12112.jpg
(96.73 КБ) 240 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

На этом семействе даже не знаю, как там дела обстоят с UART. Это уже даташит надо читать.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

Мяу, ascentman..
Найди в инете книжку издательства Бином "Справочник по Однокристальным ЭВМ" - там всё расписано..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

скачал книгу (довольно неплохая) - о матричной клавиатуре ничего не нашел, но о UART нашел много програмок и описания команд, пригодится для экзамена ...спс : http://padabum.com/d.php?id=3606 - може кому-то пригодиться тоже ... а как с клавой то?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение 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
Последний раз редактировалось DX168B Вс май 29, 2011 23:04:06, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

ок))...может по вашему коду изменю под мк51...) хорошо б если исключить дребезг контактов при двойном нажатии....по алгоритму в первому топику.
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

ascentman писал(а):о матричной клавиатуре ничего не нашел
Не знаю, что и как ты искал, /надо было смотреть стр.277-283/, вот в соседней теме мя скан странички приводил из неё: http://www.radiokot.ru/forum/download/file.php?id=67928
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

МитяРа писал(а):надо было смотреть стр.277-283/, вот в соседней теме мя скан странички приводил из неё: http://www.radiokot.ru/forum/download/file.php?id=67928
DX168B,МитяРа спасибо за помощь - а то я не видел как то зразу...но алгоритм там немного иной(простой)...мне б по тому что в первому посте я писал. Но принцип уловил - попробую что то делать))
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

ascentman писал(а):Но принцип уловил - попробую что то делать))
Давай занимайся..
В соседней теме тем-же самым Chip115 занимается, но он на Си пишет..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение 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
Вложения
111111.jpg
(96.31 КБ) 427 скачиваний
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Сообщение Roman Venom »

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

С получением данных точно так же...
В даташите должны быть примеры.
Успех - императив!
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

вывод осуществляется через аккумулятор, а как здесь это применить
Так он и применен в следующей строке

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

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

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

mov A,R0
 call UART_Write
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

и в МК51 тоже он есть SBUF ... но вопрос не в том: я не понимаю, в каком регистре хранится код клавиш после сканирования матрицы, поэтому и не знаю, что именно отправить по UART и в каком месте вызвать эти подпрограммы
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

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

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

mov A,R0
 call UART_Write
сделал так: и выводит в 16овой системе постоянно 40 и так вечно...может какую то умову задать на вывод,...потому что не могу добиться выводу от 1-15 соответственно клаве
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение 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
Снесет стек сразу. Кстати, тут стек еще и не инициализируется...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

Спс,так и сделал.не спорю,что фейл,но должен слабо курсак. Как тут вивести через uart: свертатся по адресах нажатих клавиш или Как?
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Вс май 29, 2011 16:04:41

Сообщение ascentman »

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

тут стек?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение 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
Ответить

Вернуться в «Теория»