Если клавиша нажата, KEY.HIT переходит в 1 и номер клавиши помещается в NEWKEY Если никакая клавиша не нажата, OFF помещается в NEW KEY и KEY HIT и переходит в 0.
SCAN KP
BTFSC FLAG,KEY HIT ; Клавиша обслуживается ?
GOTO UP DSP 1 ; Если да, пропускаем обычную процедуру,
MOVLW В11111111 ; иначе вьщаем 1 на все линии
MOVWF PORTJ ; порта В.
H0VLW В11110111 ; Устанавливаем ключ C0L на низкий уровень.
H0VWF TEMP ; Сохраняем в регистр TEMP.
SKP1
MOVLW В00000000 ; Все линии порта С определяем как выходы.
TRIS PORT C : /
MOVF TEMP.W ; Пересылаем TEMP в регистр W.
ANDLW ВООООШГ ; Опрашиваем клавиатуру.
MOVWF PORT C ; /
MOVLW В11110000 ; Старшие 4 линии порта С - входы,
TRIS P0RT C ; младшие - выходы.
MOVF TEMP,W ; Восстанавливаем предыдущее значение
; линий порта С.
MOVWF PORT C ; /
HOVF PORT C,W ; Считываем текущее значение в регистр W.
ANDLW В 11110000 ; Маскируем младшую тетраду.
XORLW В 11110000 ; Проверяем, была ли нажата клавиша,
BTFSS STATUS.Z ; Если нет - пропускаем,
GOTO DET KEY ; да - определяем нажатую клавишу.
BSF STATUS,С ; Установить бит переноса.
RRF TEMP ; Опросить следующий столбец.
BTFSC STATUS, С ; Если все выполнено, пропускаем.
GOTO SKP1
CLRF NEW KEY ; Устанавливаем NEW KEY = FF.
DECr NEW KP ; /
CLRF POflT C ; Обнуляем регистр PORT C
MOVLW B00000000 ; и задаем все линии порта С как выходы.
TRIS P0RT C ; /
GOTO UP DSP J ; Возвращаемся.
нажатая клавиша обнаружена.
INCF
NEW KB,W
BTFSS
STATUS, Z
GOTO
SKP2
MO/F
PORT C,W
lORLW
ВООООШГ
ANDWF
TEMP.W
MOVWF
NEW KEY
GALL
GEr KE VAL
MOVWF
NEW KEY
FLAG,KEY HIT
GOTO
SKP2
Клавиша отжата?
Если нет, то возвращаемся. Считываем номер строки клавиатуры.
Переписываем в регистр W. Получаем значение клавиши.
Устанавливаем флажок Клавиша нажата Возвращаемся.
Эта подпрограмма декодирует код клавиши.
THREE
FOUR
FIVE
SEVEN
EIGHT
NINE
ZERO
SKP3
SKP2
GET KEY VAL
ANDLW
ВООООШГ
; Маскируем старший полубайт.
MOVWF
KE NIBL
; Сохраняем.
MOVLW
; Задаем счет до 4.
MOVWF
TEMP
GKVI
STATUS,С
; Устанавливаем бит переноса.
KE NIBL
; Сдвигаем KEYJIBL.
BTFSS
STATUS,С
; Проверяем перенос.
GOTO
GET HI KEY
; Перходии.
DECFSZ
TEMP
; Уменьшаем значение счетчика
GOTO
GKVI
; Повторяем.
GOJESET
BSF BSF GOTO GET HI KEY DECF SWAPF ANDLW MOVWF MOVF ADDWF GOTO GOTO GOTO GOTO
STATUS.PAD STATUS,PAl SYSJESET
TEMP
NEW.KEY.W 8-00001111 KEYJIBL TEMP.W
GET147A GET2580 СЕГЗбЭВ GETCDEF
; Банк 3.
RETLW
Клавиша 2.
RBLW
Клавиша 5.
; Сброс.
RETLW
Клавиша 6.
RETLW
Клавиша 0.
; Декрементируем TEMP.
RETLW
Клавиша 3.
; Меняем местами полубайты.
RETLW
, Клавиша 6.
RETLW
Клавиша 9.
; Сохраняем.
RETLW
Клавиша В.
; Определяем смещение для таблицы переходов.
RETLW
Клавиша С.
; Модифицируем программный счетчик.
RETLW
Клавиша D.
; Переходим по таблице.
RETLW
; Клавиша Е.
RETLW
; Клавиша F.
GET147A
MOVLW
; Задаем счет до 4.
GETCOM
MOVWF
TEMP
GETC0M1
STATUS,С
; Устанавливаем бит переноса.
KE NIBL
; Сдвигаем KEYJIBL.
BTFSS
STATUS,С
; Проверяем перенос.
GOTO
KEY TBL
; Переходим к таблице.
DECFSZ
TEHP
; Декрементируем счетчик и проверяем на 0.
GOTO
GETCOMI
; Если не 0. то повторяем,
GOTO
GO RESET
; иначе сбрасываем.
GET2580
MOVLW
8 ;
Задаем счет до 8.
GOTO
GETCOM
GET369B
MOVLW
D-12- ;
Задаем счет до 12.
GOTO
GETCOM
GETCDEF
MOVLW
D-16- ;
Задаем счет до 16.
GOTO
GETCOM
KEYJBL
DECF
TEMP ;
Декрементируем TEMP.
MOVF
TEMP.W ;
Переписываем в W.
ADDWF
PC :
Переходим по таблице.
RETLW
1 ;
Клавиша 1.
RETLW
4 ;
Клавиша 4.
RERW
7 ;
Клавиша 7.
RERW
CA :
Клавиша А.
MASK ANNC
MOVLW
B-11111100-
; Первая цифра?
XORWF
PORTJ. 0
BTFSC
STATUS. Z
; Если нет, то пропускаем,
GOTO
MASK.ALARM
; иначе переходим к MASK ALARM.
MDVLW
B11110011-
; Вторая цифра?
XORWF
P0RTJ,0
BTPSC
STATUS,Z
; Если нет, то пропускаем.
GOTO
MASKJOLON
; иначе переходим к MASKJOLON.
MOVLW
B-11001111-
; Третья цифра?
XORWF
PORTJ,0
BTFSC
STATUS,Z
; Если нет, то пропускаем.
GOTO
MASK.PM
; иначе переходим к MASK PM.
HASK AM
INCF
; Инкрементируем FSR.
BTFSS
FO,AHJM
; Проверяем разряд АМ РМ, если он равен 0, значит - AM.
DIGn,7
; Устанавливаем 7 разряд (MSB).
GOTO
BLNK.LEADJ
; Продолжаем.
NASKJM
INCF
; Инкрементируем FSR.
BTFSC
FO.AMJM
; Проверяем разряд АМ РМ. если он равен 1, значит - РМ.
DIGIT.7
; Устанавливаем старший разряд (MSB).
GOTO
BLNK LEAD 0
; Продолжаем.
KASOUKM
BTFSC
FLAG,ALRMLED
; Если 1, то включаем светодиод (ALARM).
DIGIT,7
GOTO
BLNKJEADJ .
; Продолжаем.
KASKJOLON
BTFSC
FLAG,COLON
; Если 1. то включаем двоеточие (COLON).
DIGn,7
GOTO
BLNK.LEADJ
; Продолжаем.
BLNK LEADJ
MOVF
FLAG,W
; Перемещаем флаги в регистр W.
ANDLW
B-00000011
: Маскируем (IN DEN).
XORLW
В-00000010
; Проверяем.
BTPSC
STATUS.Z
; Если 0, то выполняем.
RETLW
; иначе возвращаемся.
MOVLW
B-11111100-
; Если первая цифра.
XORWF
PORTJ, 0
BTFSS
STATUS, Z
; то пропускаем.
RETLW
; Возвращаемся,
MOVLW
B-00111111
; иначе маскируем G и ANUNC
ANDWF
DIGn,0
; и пересылаем в регистр W.
xorlw
В-0011111Г
; Проверяем на 0.
BTFSS
STATUS,Z
; Если 0, то пропускаем.
RETLW
; Возвращаемся,
MOVLW
В10000000
; иначе выключаем D1.
ANDWF
DIGF
RETLW
; Возвращаемся.
MOVWF
CLRF
ALFUG
CLRF
AAFUG
CLRF
ENTFLG
GOTO
TEST HARDWARE
все подпрограммы, относящиеся к таймеру, помещены выше адреса 200. ORG 0200