Основы микропроцессорной техники

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.
Закрыть окно





Содержание раздела