Клавиатуру я делал для
PIC16F876. Кусок исходника на асме. Попробуй разобраться сам. Не получиться - спрашивай.
k_board CODE
keyb_ini
call start_u ;Передаем условие начала
movlw kbAddr_W ;Передаем адрес модуля для записи(kbAddr_W)
call send
movlw 0F0h
call send ;Передаем один байт в
PCF8574 клавиатуры
call stop_u ;Передаем условие завершения передачи
return
off_podsvet
call start_u ;|При прерывании от модуля клавиатуры
movlw kbAddr_R ;|прочитаем состояние столбцов
call send ;|клавиатуры (P4-P7) PCF8574
call resive ;|
movwf key_stolb ;|ЗАПОМНИМ состояние столбцов в key_stolb
call stop_u ;|
bcf key_stolb, 4
call start_u
movlw kbAddr_W
call send
movfw key_stolb
call send
call stop_u
call start_u ;|При прерывании от модуля клавиатуры
movlw kbAddr_R ;|прочитаем состояние столбцов
call send ;|клавиатуры (P4-P7) PCF8574
call resive ;|
call stop_u ;|
return
; ---------------------------------------------------------
; Сканирование клавиатуры по I2C шине ---------------------
; ---------------------------------------------------------
key_scan
call start_u ;|При прерывании от модуля клавиатуры
movlw kbAddr_R ;|прочитаем состояние столбцов
call send ;|клавиатуры (P4-P7) PCF8574
call resive ;|
movwf key_stolb ;|ЗАПОМНИМ состояние столбцов в key_stolb
call stop_u ;|
call start_u ;|Далее пошлем "0" на строки и "1" на столбцы
movlw kbAddr_W ;|чтобы вычислить строку нажатой кнопки.
call send ;|
movlw 0Fh ;|
call send ;|
call stop_u ;|
call start_u ;|прочитаем состояние строк
movlw kbAddr_R ;|клавиатуры (P0-P3) PCF8574
call send ;|
call resive ;|
movwf key_str ;|ЗАПОМНИМ состояние строк а key_str
call stop_u ;|
;======= Подготовим расширитель в начальное состояние
key_1
call start_u ;Передаем условие начала
movlw kbAddr_W ;Передаем адрес модуля для записи(kbAddr_W)
call send
movlw 0F0h
call send ;Передаем один байт данных в PCF8574 клавиатуры
call stop_u ;Передаем условие завершения
;просканировали, надобно расшифровать результат...
;======= Расшифруем строки
key1
clrf key_code
btfss key_str,3 ;3 бит PCF =0,тогда 1 2 3 A ;код =0
goto add_next
btfss key_str,2 ;2 бит PCF =0,тогда 4 5 6 B ;код =4
goto add_4
btfss key_str,1 ;1 бит PCF =0,тогда 7 8 9 C ;код =8
goto add_8
btfss key_str,0 ;0 бит PCF =0,тогда * 0 # D ;код =12
goto add_12
movlw .127 ;сюда приходим, если ошибка.
movwf key_code
goto _err ;идем прямо в конец подпрограммы
add_4 movlw .4
movwf key_code
goto add_next
add_8 movlw .8
movwf key_code
goto add_next
add_12 movlw .12
movwf key_code
;======= Расшифруем столбцы
add_next
btfss key_stolb,7 ;7 бит PCF =0,тогда 1 4 7 * ;код =код+0
goto key_end
btfss key_stolb,6 ;6 бит PCF =0,тогда 2 5 8 0 ;код =код+1
goto add_1
btfss key_stolb,5 ;5 бит PCF =0,тогда 3 6 9 # ;код =код+2
goto add_2
btfss key_stolb,4 ;4 бит PCF =0,тогда A B C D ;код =код+3
goto add_3
movlw .128 ;сюда приходим, если ошибка.
addwf key_code,f
goto _err ;идем прямо в конец подпрограммы
add_1 movlw .1
addwf key_code
goto key_end
add_2 movlw .2
addwf key_code
goto key_end
add_3 movlw .3
addwf key_code
key_end
bcf STATUS, C
movlw .15
subwf key_code,w
btfsc STATUS, C
goto _err
table_read tab_key, key_code
movwf key_code ;сдесь код нажатой кнопки сохраним в регистр
bsf KB ;и установим флажек
movlw d'45' ;556 Hz
movwf freq
movlw d'37' ;1/15 сек
movwf dlit1
movlw d'2'
movwf dlit2
call pisk
keyb_prov
call start_u
movlw kbAddr_R ;Передаем адрес модуля для записи(kbAddr_W)
call send
call resive
goto stop_u
_err
bcf KB ;снимем флажек
movlw h'FF'
movwf key_code
goto keyb_prov ;А выход по стеку!!!(return в подпрогоамме)
tab_key
addwf PCL, f
retlw A'1' ;0
retlw A'2' ;1
retlw A'3' ;2
retlw A'A' ;3
retlw A'4' ;4
retlw A'5' ;5
retlw A'6' ;6
retlw A'B' ;7
retlw A'7' ;8
retlw A'8' ;9
retlw A'9' ;10
retlw A'C' ;11
retlw A'*' ;12
retlw A'0' ;13
retlw A'#' ;14
retlw A'D' ;15
GLOBAL keyb_ini, key_scan, off_podsvet ;метки
GLOBAL key_code ;регистр