- Вложения
-
- maket.rar
- (12.11 КБ) 148 скачиваний
-
- IMG_01.jpg
- (127.96 КБ) 451 скачивание
инициализация клавиатуры 4на4 _асемблер
- Сообщения: 27
- Зарегистрирован: Вс май 29, 2011 16:04:41
добрый день посетителям форума. У меня есть один очень важный для меня вопрос, поэтому кто хоть немного мне поможет - буду очень благодарен. И так у меня есть разработанный макет в Proteus с подключенной матричной клавиатурой 4 на 4. При запуске на всех выводах клавы встановлються единицы. Вопрос в том, как на ассемблере провести ее инициализацию, т.е. при нажатия на одну из клавиш передать по UART или на индикатор код клавиши. Задача немного сложна для меня, поскольку ассемблер изучаю не долго, а сделать надо. В интернете немного нашел статей и то написанные для других микроконтроллеров, а мне нужно для МК51. Схему и алгоритм по которому сделать - добавляю:
- Реклама
Был бы это МК AVR, то помог бы. Вообще это делается в 2 счёта.
Выделяем регистр для формирования в нём кода кнопки и пишем в него единицу.
Поднимаем лог. 1 на верхней строке кнопок. Проверяем кнопку 1, если на выводе этого столбца есть отклик (кнопка 1 нажата) то выходим из проверки клавиатуры и отправляем содержимое выделенного регистра по UART, если отклика нет, то увеличиваем содержимое выделенного регистра на 1 и проверяем кнопку 2. и так далее, проверяем все кнопки. Главное - если нет отклика от кнопки, увеличивать содержимое выделенного регистра и проверять следующую кнопку.
Выделяем регистр для формирования в нём кода кнопки и пишем в него единицу.
Поднимаем лог. 1 на верхней строке кнопок. Проверяем кнопку 1, если на выводе этого столбца есть отклик (кнопка 1 нажата) то выходим из проверки клавиатуры и отправляем содержимое выделенного регистра по UART, если отклика нет, то увеличиваем содержимое выделенного регистра на 1 и проверяем кнопку 2. и так далее, проверяем все кнопки. Главное - если нет отклика от кнопки, увеличивать содержимое выделенного регистра и проверять следующую кнопку.
I am DX168B and this is my favourite forum on internet!
- Сообщения: 27
- Зарегистрирован: Вс май 29, 2011 16:04:41
мне советовали это сделать используя маску 11111110 (т.е. по строкам сделать сканирование а по столбцам - чтение) и если нет отклика подвигать 0 влево.
например R1 будет счетчиком я так понял.
mov R1, 11111110b
jb p1.0,exit
exit:
ret
inc R1
jb p1.1,exit
не знаю....нечто вроде того... а как по UART отправить - просто обратиться к порту?
например R1 будет счетчиком я так понял.
mov R1, 11111110b
jb p1.0,exit
exit:
ret
inc R1
jb p1.1,exit
не знаю....нечто вроде того... а как по UART отправить - просто обратиться к порту?
- Вложения
-
- 12112.jpg
- (96.73 КБ) 240 скачиваний
На этом семействе даже не знаю, как там дела обстоят с UART. Это уже даташит надо читать.
I am DX168B and this is my favourite forum on internet!
Мяу, 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
скачал книгу (довольно неплохая) - о матричной клавиатуре ничего не нашел, но о UART нашел много програмок и описания команд, пригодится для экзамена ...спс : http://padabum.com/d.php?id=3606 - може кому-то пригодиться тоже ... а как с клавой то?
Сейчас напишу для 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
ок))...может по вашему коду изменю под мк51...) хорошо б если исключить дребезг контактов при двойном нажатии....по алгоритму в первому топику.
Не знаю, что и как ты искал, /надо было смотреть стр.277-283/, вот в соседней теме мя скан странички приводил из неё: http://www.radiokot.ru/forum/download/file.php?id=67928ascentman писал(а):о матричной клавиатуре ничего не нашел
[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
DX168B,МитяРа спасибо за помощь - а то я не видел как то зразу...но алгоритм там немного иной(простой)...мне б по тому что в первому посте я писал. Но принцип уловил - попробую что то делать))МитяРа писал(а):надо было смотреть стр.277-283/, вот в соседней теме мя скан странички приводил из неё: http://www.radiokot.ru/forum/download/file.php?id=67928
Давай занимайся..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
помогите еще в одном шаге. Вообще я уже прочитав литературу, реализовал программу сканирования клавиатуры, но вопрос есть еще одно: как сделать вывод цифр через 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
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 скачиваний
без понятия как там в МК51, но в аврах/пиках есть буферный регистр в который пишется из аккумулятора(или по линии РХ). Так что алгоритм предельно прост:
записать данные в аккумулятор
записать в буфер
отправить данные (или это делается аппаратно)
С получением данных точно так же...
В даташите должны быть примеры.
записать данные в аккумулятор
записать в буфер
отправить данные (или это делается аппаратно)
С получением данных точно так же...
В даташите должны быть примеры.
Успех - императив!
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Так он и применен в следующей строкевывод осуществляется через аккумулятор, а как здесь это применить
Код: Выделить всё
mov SBUF, A ; зчитування байта в ACCКод: Выделить всё
mov A,R0
call UART_WriteЗагружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Сообщения: 27
- Зарегистрирован: Вс май 29, 2011 16:04:41
и в МК51 тоже он есть SBUF ... но вопрос не в том: я не понимаю, в каком регистре хранится код клавиш после сканирования матрицы, поэтому и не знаю, что именно отправить по UART и в каком месте вызвать эти подпрограммы
- Сообщения: 27
- Зарегистрирован: Вс май 29, 2011 16:04:41
сделал так: и выводит в 16овой системе постоянно 40 и так вечно...может какую то умову задать на вывод,...потому что не могу добиться выводу от 1-15 соответственно клавеMeteor писал(а):т.е. перед вызовом подпрограммы UART_Write, необходимо поместить в аккумулятор данные, что делается этой строкойКод: Выделить всё
mov A,R0 call UART_Write
В приведенном выше коде:
1) В качестве выходного сканируется порт2, а должен быть порт1 (младшая половина, отсекается командой ANL A,#0Fh)
2) Сканировать нулем (хотя теоретически можно и единицей), соответственно переписать строки
и
Можно дописать CPL A после маски ANL A,#0Fh
3) Сохраняется не просто код нажатой клавиши в каком-либо регистре, а последовательность во всех 4х столбцах. По адресам 20h-23h - считанные клавиши, 28h-2Bh - предыдущее состояние клавиш. Причем как нажатие, так и отпускание индицируется единичками в соответствующем разряде. Так что этот код позволяет обнаружить изменение хоть всех 16 кнопок сразу
4) структура программы полный фейл. Например последовательность
Снесет стек сразу. Кстати, тут стек еще и не инициализируется...
1) В качестве выходного сканируется порт2, а должен быть порт1 (младшая половина, отсекается командой ANL A,#0Fh)
2) Сканировать нулем (хотя теоретически можно и единицей), соответственно переписать строки
Код: Выделить всё
mov A,#80h -> mov A,#07FhКод: Выделить всё
jnb ACC.3,scan_klava ->jb ACC.3,scan_klava3) Сохраняется не просто код нажатой клавиши в каком-либо регистре, а последовательность во всех 4х столбцах. По адресам 20h-23h - считанные клавиши, 28h-2Bh - предыдущее состояние клавиш. Причем как нажатие, так и отпускание индицируется единичками в соответствующем разряде. Так что этот код позволяет обнаружить изменение хоть всех 16 кнопок сразу
4) структура программы полный фейл. Например последовательность
Код: Выделить всё
Main:
CALL init
CALL ...
CALL ...
...
init:
...
считываем клавиатуру...
...
RET
- Сообщения: 27
- Зарегистрирован: Вс май 29, 2011 16:04:41
Спс,так и сделал.не спорю,что фейл,но должен слабо курсак. Как тут вивести через uart: свертатся по адресах нажатих клавиш или Как?
- Сообщения: 27
- Зарегистрирован: Вс май 29, 2011 16:04:41
Спс,так и сделал.не спорю,что фейл,но должен слабо курсак. Как тут вивести через uart: свертатся по адресах нажатих клавиш или Как?Зачем нужно
тут стек?
тут стек?
Стек всегда нужен, если используются подпрограммы (а тут есть команда CALL).
Как тут вывести еще вопрос. Нужно либо переделывать процедуру сканирования, чтобы она выводила всего одно значение, либо просто передавать весь этот "буфер клавиатуры", который по адресам 20...23-28...2B. Во втором случае можно сделать тупо и некрасиво, но просто:
Как тут вывести еще вопрос. Нужно либо переделывать процедуру сканирования, чтобы она выводила всего одно значение, либо просто передавать весь этот "буфер клавиатуры", который по адресам 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


