Уважаемые разработчики. Поделитесь практическим опытом пожалуйста.
Мне надо разработать интерфейс клавиатуры 8х8 на примере keypad interface в EP9307 Cirrus Logic.
Клавиатура может декодировать до 2 одновременно нажатых клавиш.
Если нажато большее число то приоритет отдается клавишам наименьшего адреса.
Технология работы моего интерфейса такая: произвожу опрос строк бегущим нулем и смотрю на состояния столбцов. Весь процесс сканирования за одну итерацию происходит за 64 такта. каждое мое сканирование начинается с ROW 0 и заканчивается ROW7. Но в аналоге почему-то сканирование ведется с ROW7 - > ROW0 .... И в разработке пишут что ROW 7 имеет некий приоритет по сравнению с последующими строками. Но в этой же разработке отдают приоритет клавишам с наименьшим адресом. А клавиша с наименьшим адресом находится как раз в строке 0.
Вопрос вот в чем: имеет ли какое - то значение с какой строки начинается сканирование?
Привожу фрагмент аналога:
Products are scanned based on the KEY_SCAN register value. Each complete array scan starts with ROW 7 and then progresses to ROW0, 1 , and so on because of the pipelined nature of the key scan controller. Keys in this ROW have precedence and are considered first in the scan order because ROW7 is scanned first. When a key is pressed, it may mechanically bounce for a up to 20 msec. The key array scan circuit will count the nu,ber of consecutive scans that decode to the same 1 or 2 first keys encountered from the start of a scan.
rezident
Nov 14 2008, 16:20
Извините, что ленюсь посмотреть этот keypad interface

но нельзя ли его реализовать программно? На обычных GPIO пинах? Программно такой интерфейс делается "как два пальца об
осcасфальт". И устранение дребезга и автоповтор и пр. прелести.
программно конечно можно реализовать. Но задача сделать однако именно как аппаратный IP блок
MaxEngee
Dec 4 2008, 11:37
Пример реализации 4*4 для PIC:
Все достаточно просто и для 8*8:
;Подпрограмма сканирования кнопок 4*4
;подключенных к порту В.
;Старшие 4-и линии порта направить на ввод,младшие на вывод c нулями.
;Требуется подключить подтягивающие резисторы.
; Определить KEY_PRESD_COD
;KEY_PRESD возвращает в KEY_PRESD_COD 4-ех битный код нажатой кнопки.
;
; rb7 ------- F E D C
; rb6 ------- B A 9 8
; rb5 ------- 7 6 5 4
; rb4 ------- 3 2 1 0
; | | | |
; | | | |
; b3b2b1b0
;ЕСЛИ КНОПКА НЕБЫЛА НАЖАТА ИЛИ НАЖАТЫ более 1-ой ВОЗВРАЩАЕТ в W 0x0
;Подпрограмма может глюкнуть если только нажаты одновременно соседние
;по столбцу кнопки,в этом случае возвращает код нижней.
;Во все остальных случаях:если не нажата или нажаты более одной
;кнопки в W возвращается 0X0.
;При использовании прерывания после вызова подпрограммы требуется переинициализировать TRIS
;При использовании высокочастотных генираторов при циклическом
;вызове подпрограммы(детектирование нажатия) встовляйте задержку перед
;подпрограммой.
;KEY_CONNECT-порт подключения клавиатуры
KEY_PRESD
CLRF KEY_CONNECT
BANK1
MOVLW 0XF0
MOVWF KEY_CONNECT
BANK0
MOVF KEY_CONNECT,0
ANDLW 0XF0 ;если
XORLW 0XF0 ; ненажата
BTFSC STATUS,Z ; ниодна кнопка
RETLW 0X0 ; вернуть в W 0X0
;кнопка нажата !!!
;Определим строку:
CLRW
BTFSS KEY_CONNECT,4
MOVLW 0X0
BTFSS KEY_CONNECT,5
MOVLW 0X4
BTFSS KEY_CONNECT,6
MOVLW 0X8
BTFSS KEY_CONNECT,7
MOVLW 0XC
MOVWF KEY_PRESD_COD
;Определим столбец:
BANK1 ;TRIS
BSF KEY_CONNECT,0
BANK0
NEXT_KEY_ST
MOVF KEY_CONNECT,0 ;Проверка
ANDLW 0XF0 ; на номер
XORLW 0XF0 ; установленного
BTFSC STATUS,Z ; столбца.
RETLW 1 ;
MOVF KEY_PRESD_COD,0 ; Проверка
ANDLW 0X3 ; на последний
XORLW 0X3 ; обработанный
BTFSC STATUS,Z ; столбец.
RETLW 0 ;нажаты несколько кнопок.
INCF KEY_PRESD_COD,1
; Выбрать cледущий столбец для проверки.
BANK1;TRIS
BTFSC KEY_CONNECT,2 ;
BSF KEY_CONNECT,3
BTFSC KEY_CONNECT,1 ;
BSF KEY_CONNECT,2
BSF KEY_CONNECT,1
BANK0
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP; Задержка для высокочастотных генираторов.
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
GOTO NEXT_KEY_ST
;****************************************************************
Цитата
программно конечно можно реализовать. Но задача сделать однако именно как аппаратный IP блок
Цитата(MaxEngee @ Dec 4 2008, 14:37)

Пример реализации 4*4 для PIC:
Все достаточно просто и для 8*8:
;Подпрограмма сканирования кнопок 4*4
Я правильно понял - вы предлагаете автору вопроса сделать PIC в виде аппаратного IP блока и загрузить в него программу сканирования клавиатуры?
MisterDi
Dec 10 2008, 14:05
Цитата(Derek @ Nov 14 2008, 18:22)

Привожу фрагмент аналога:
Products are scanned based on the KEY_SCAN register value. Each complete array scan starts with ROW 7 and then progresses to ROW0, 1 , and so on because of the pipelined nature of the key scan controller. Keys in this ROW have precedence and are considered first in the scan order because ROW7 is scanned first. When a key is pressed, it may mechanically bounce for a up to 20 msec. The key array scan circuit will count the nu,ber of consecutive scans that decode to the same 1 or 2 first keys encountered from the start of a scan.
В переводе на русский это значит, что в связи с особеностями аппаратной реализации наивысший приоритет имеет ROW7, затем 0, 1, т и т.д. По большому счету скан-коды можно в дальнейшем преобразовать как угодно, а приоритетность кнопок решать соответствующей разводкой матрицы на панели