Писал как-то на асме программу управления воротами с клавиатурой на пцф8574. В Протеусе всё работает идеально.
В реальности проверял, работает!
Код на асме вот:
;f=14.318MHz
list p=16F876A
#include ‹p16F876A.inc›
#include ‹makros.inc›
#include ‹flags.inc›
GLOBAL keyb_ini, key_scan, key_code
EXTERN start_u, stop_u, bit_in, bit_out, ms5, send, resive
EXTERN flag2, tmp
k_dat UDATA
key_stolb RES 1 ;прочитанные столбцы
key_str RES 1 ;прочитанные строки
key_code RES 1 ;код нажатой клавиши
cnt_init RES 1 ;счетчик ошибок инициализации клавиатуры.
;************************************************* *************
; Подготовка клавиатуры к работе
;************************************************* *************
k_board CODE
keyb_ini
bcf INTCON,GIE ;чтоб прерывания не мешали
call start_u ;Передаем условие начала
movlw kbAddr_W ;Передаем адрес модуля для записи(kbAddr_W)
INI1
clrf cnt_init
call send
xorlw .1
btfss STATUS,Z
goto yes_KB
incf cnt_init, F
movlw .20
subwf cnt_init, W
btfsc STATUS,C
goto INI1
bsf no_kb
return
yes_KB
movlw 0F0h
call send ;Передаем один байт в PCF8574 клавиатуры
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 ;Передаем условие завершения
call start_u ;Передаем условие начала
movlw kbAddr_R ;Передаем адрес модуля для записи(kbAddr_W)
call send
call resive
movwf tmp
call stop_u ;Передаем условие завершения
movlw 0F0h ;Отсюда выходим ТОЛЬКО когда кнопки отпущены.
xorwf tmp
btfss STATUS, Z
goto key_1
;просканировали, надобно расшифровать результат...
;======= Расшифруем строки
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 ;и установим флажек
return
_err
bcf KB ;и снимем флажек
movlw h'FF'
movwf key_code
return
tab_key
addwf PCL, f
retlw .1 ;0
retlw .2 ;1
retlw .3 ;2
retlw A'A' ;3
retlw .4 ;4
retlw .5 ;5
retlw .6 ;6
retlw A'B' ;7
retlw .7 ;8
retlw .8 ;9
retlw .9 ;10
retlw A'C' ;11
retlw A'#' ;12
retlw .10 ;13
retlw A'*' ;14
retlw A'D' ;15
end
‹center›
-- Прилагается рисунок: --
‹IFRAME src = "nuke/users_images/19062009/7522569.gif" frameborder="0" name="fr4744837" scrolling="yes" width="470" height="350" align="bottom"›[img]nuke/users_images/19062009/7522569.gif[/img]
‹font color=red›Рисунок не умещается на странице и поэтому сжат!‹/font›
Для того, чтобы просмотреть его полностью, щелкните здесь.
‹/IFRAME›
‹/center›