Example..
;основная программа LOOP CLRWDT ;сброс сторожевого таймера CALL GET_RA ;вызов подпрограммы GET_PORTA CALL SB1_BA1 ;вызов подпрограммы SB1_BA1 GOTO LOOP ;переход к метке LOOP для ;повторения процесса ; SB1_BA1 ;подпрограмма подачи звука на ;динамик BA1 при нажатии на кнопку ;SB1 BTFSC TEMPA,4 ;пропустить команду, если ;TEMPA,4=0 (кнопка нажата) GOTO B0 ;перейти на B0 BSF BA1 ;подача высокого уровня на RA0 MOVLW 0x3E ;пересылка константы ;H'3E' = .62 в W CALL DELAY_C ;вызов подпрограммы DELAY_C BCF BA1 ;подача низкого уровня на RA0 MOVLW 0x3E ;пересылка константы ;H'3E' = .62 в W CALL DELAY_C ;вызов подпрограммы DELAY_C B0 RETURN ; INCLUDE GET_RA.ASM INCLUDE DELAY_C.ASM ; |
Листинг 12.10. |
Закрыть окно |
;основная программа
LOOP
CLRWDT ;сброс сторожевого таймера
CALL GET_RA ;вызов подпрограммы GET_PORTA
CALL SB1_BA1 ;вызов подпрограммы SB1_BA1
GOTO LOOP ;переход к метке LOOP для
;повторения процесса
;
SB1_BA1 ;подпрограмма подачи звука на
;динамик BA1 при нажатии на кнопку
;SB1
BTFSC TEMPA,4 ;пропустить команду, если
;TEMPA,4=0 (кнопка нажата)
GOTO B0 ;перейти на B0
BSF BA1 ;подача высокого уровня на RA0
MOVLW 0x3E ;пересылка константы
;H'3E' = .62 в W
CALL DELAY_C ;вызов подпрограммы DELAY_C
BCF BA1 ;подача низкого уровня на RA0
MOVLW 0x3E ;пересылка константы
;H'3E' = .62 в W
CALL DELAY_C ;вызов подпрограммы DELAY_C
B0
RETURN
;
INCLUDE GET_RA.ASM
INCLUDE DELAY_C.ASM
;
;основная программа
LOOP
CLRWDT ;сброс сторожевого таймера
CALL GET_RA ;вызов подпрограммы GET_RA
CALL SB1_VD2M ;вызов подпрограммы
;SB1_VD2M
GOTO LOOP ;переход к метке LOOP для
;повторения процесса
;
SB1_VD2M ;подпрограмма мигания светодиода
;VD2 при нажатии на кнопку SB1
BTFSC TEMPA,4 ;пропустить команду, если
;TEMPA,4=0 (кнопка нажата)
GOTO V0 ;перейти на V0
BSF VD2 ;зажечь светодиод VD2
MOVLW 0xF3 ;пересылка константы
;H'F3' = .243 в W
CALL DELAY_E ;вызов подпрограммы DELAY_E
BCF VD2 ;погасить светодиод
MOVLW 0xF3 ;пересылка константы
;H'F3' = .243 в W
CALL DELAY_E ;вызов подпрограммы DELAY_E
V0
BTFSS TEMPA,4 ;пропустить команду, если
;TEMPA,4=1 (кнопка не нажата)
GOTO V1 ;перейти на V1
BCF VD2 ;погасить светодиод
V1
RETURN
;
INCLUDE GET_RA.ASM
INCLUDE DELAY_E.ASM
;
; GET_RAD ;подпрограмма чтения состояния ;порта A в регистр TEMPA ;с подавлением "дребезжания" DD MOVF PORTA,W ;чтение состояния порта A в W ANDLW 0x1C ;наложение маски b'00011100' ;на неиспользуемые биты W MOVWF TEMPA ;пересылка W в TEMPA CLRWDT ;сброс сторожевого таймера WDT MOVLW 0x0A ;пересылка константы ;H'0A' = .10 в W CALL DELAY_E ;вызов подпрограммы DELAY_E MOVF PORTA,W ;чтение состояния порта A в W ANDLW 0x1C ;наложение на W маски b'00011100' SUBWF TEMPA,W ;вычитание W из TEMPA BTFSS Z ;пропустить команду, если результат ;нулевой GOTO DD ;перейти на метку DD RETURN ; INCLUDE DELAY_E.ASM ; |
Листинг 12.12. |
Закрыть окно |
;
GET_RAD ;подпрограмма чтения состояния
;порта A в регистр TEMPA
;с подавлением "дребезжания"
DD
MOVF PORTA,W ;чтение состояния порта A в W
ANDLW 0x1C ;наложение маски b'00011100'
;на неиспользуемые биты W
MOVWF TEMPA ;пересылка W в TEMPA
CLRWDT ;сброс сторожевого таймера WDT
MOVLW 0x0A ;пересылка константы
;H'0A' = .10 в W
CALL DELAY_E ;вызов подпрограммы DELAY_E
MOVF PORTA,W ;чтение состояния порта A в W
ANDLW 0x1C ;наложение на W маски b'00011100'
SUBWF TEMPA,W ;вычитание W из TEMPA
BTFSS Z ;пропустить команду, если результат
;нулевой
GOTO DD ;перейти на метку DD
RETURN
;
INCLUDE DELAY_E.ASM
;
;основная программа
CLRF COUNT3 ;сброс счетчика нажатий
LOOP
CLRWDT ;сброс сторожевого таймера
CALL GET_RAD ;вызов подпрограммы GET_RAD
BTFSC TEMPA,4 ;проверка нажатия SB1
GOTO LOOP ;если не нажата – возврат
;на метку LOOP
INCF COUNT3,F ;инкремент счетчика
MOVF COUNT3,W ;пересылка содержимого
;счетчика в рабочий регистр
CALL SEV_SEG ;вызов подпрограммы SEVEN_SEG
MOVWF PORTB ;пересылка W в PORTB
TEST
CALL GET_RAD ;вызов подпрограммы GET_RAD
BTFSS TEMPA,4 ;проверка нажатия SB1
GOTO TEST ;если еще нажата – возврат
;на метку TEST
GOTO LOOP ;возврат на метку LOOP
;
INCLUDE GET_RAD.ASM
INCLUDE SEV_SEG.ASM
;
;основная программа CLRF COUNT3 ;сброс счетчика нажатий LOOP CLRWDT ;сброс сторожевого таймера CALL GET_RAD ;вызов подпрограммы GET_RAD BTFSC TEMPA,4 ;проверка нажатия SB1 GOTO LOOP ;если не нажата – возврат ;на метку LOOP INCF COUNT3,F ;инкремент счетчика MOVF COUNT3,W ;пересылка содержимого ;счетчика в рабочий регистр CALL SEV_SEG ;вызов подпрограммы SEVEN_SEG MOVWF PORTB ;пересылка W в PORTB TEST CALL GET_RAD ;вызов подпрограммы GET_RAD BTFSS TEMPA,4 ;проверка нажатия SB1 GOTO TEST ;если еще нажата – возврат ;на метку TEST GOTO LOOP ;возврат на метку LOOP ; INCLUDE GET_RAD.ASM INCLUDE SEV_SEG.ASM ; |
Листинг 12.13. |
Закрыть окно |
;основная программа
MOVLW 0xL ;пересылка константы H'L' в W
CALL DELAY_D ;вызов подпрограммы DELAY_D
;
DELAY_D ;подпрограмма формирования
; большой задержки времени (вариант D)
MOVWF COUNT2 ;загрузка W в регистр COUNT2
CLRF COUNT1 ;сброс содержимого регистра COUNT1
LOOPD
DECFSZ COUNT1,F ;декремент COUNT1
GOTO LOOPD ;повторение цикла 256 раз
CLRWDT ;сброс сторожевого таймера
DECFSZ COUNT2,F ;декремент COUNT2
GOTO LOOPD ;повторение цикла H'L' раз
RETURN ;возврат из подпрограммы
;
; DELAY_E ;подпрограмма формирования ;большой задержки времени (вариант E) MOVWF COUNT2 ;загрузка W в регистр COUNT2 CLRF COUNT1 ;сброс содержимого регистра COUNT1 LOOPD NOP ;пустая команда DECFSZ COUNT1,F ;декремент COUNT1 GOTO LOOPD ;повторение цикла 256 раз CLRWDT ;сброс сторожевого таймера DECFSZ COUNT2,F ;декремент COUNT2 GOTO LOOPD ;повторение цикла H'L' раз RETURN ;возврат из подпрограммы ; |
Листинг 12.9. |
Закрыть окно |