Вот код который я использую.
;************************************************* *********************
;
; Вход: Key_Clok - флаг входа -каждые 0.02 сек
; Выход: New_Key - нажатая клава
; : Key_On - флаг нажатия клавиши
;
; Пока нажатая клавиша не будет обработана - не будет опрашиватся
; следующая клавиша. После обработки нажатой клавиши , надо
; сбросить флаг нажатия клавиши KEY_OK в данном случае
;************************************************* ****
Scan_Key
bcf Key_Clok ;сброс флага входа в подпрограмму
btfsc KEY_OK ;
return
movf PORTB1,W ;считали порт
andlw b'00011111' ;маска для клавиш
movwf Old_Key ;сохранили временно
movlw b'00011111' ;проверяем нажата ли хоть 1 клавиша
xorwf Old_Key,W ;
btfsc STATUS,Z ;если не нажато то выход
goto Set_Varabl ;
;нажата и проверяем в течение 5 циклов чтобы была одна и та же клавиша
btfss Scan_Flag ;первый раз выставляем флаг ,а в остальные проверяем
;какая клавиша следующий раз
goto Set_Scan_Flag ;
movf New_Key,W ;будем сравнивать новую клавишу с предыдущим
xorwf Old_Key,W ;
btfss STATUS,Z ;
goto Set_Varabl ;переход на установка переменных так как в течение
Key_Count ;5 циклов не была нажата одна и та же клавиша
decfsz Count_Key,F ;уменьшаем счетчик циклов
return
bsf KEY_OK ;установили флаг ,сигнализируя что клавиша нажата
return
;-----------------------------------------------------
Set_Varabl
movlw 0x05
movwf Count_Key ;обновили счетчик
bcf KEY_OK ;сбросили флаг ,сигнализируя что клавиша не нажата
bcf Scan_Flag
clrf New_Key
clrf Old_Key
return
Set_Scan_Flag
bsf Scan_Flag ;
movf Old_Key,W ;переписываем в буффер клавы, но пока флаг
;не установлен он не активен
movwf New_Key
goto Key_Count ;переход на счет сколько раз нажата клавиша
;надо в течение 5 циклов прерывания
;************************************************* ****
|