;В этом листинге будем использовать Таймер1-Timer1 Module.Схема и задача как и в прошлом листинге.
LIST P=16F628A
INCLUDE P16F628A.INC
__CONFIG _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
ERRORLEVEL -302
CBLOCK 20H
REG
TIMERL ;Духбайтная переменная
TIMERH
ENDC
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
ORG 0
GOTO START
ORG 4
GOTO ISR
START MOVLW 7
MOVWF CMCON
MOVLW B'00110001';Включаем таймер1
MOVWF T1CON ;Предделитель 1/8
MOVLW 0
MOVWF TIMERL
MOVLW .50
MOVWF TIMERH ;Записваем 50000
BANK1
BSF TRISA,0
MOVLW 0
MOVWF TRISB
BANK0
MAIN BTFSC PORTA,0
GOTO RIGHT
MOVLW 1
MOVWF REG
LEFT MOVF REG,W
MOVWF PORTB
CALL DELAY
BCF STATUS,C
RLF REG,F
BTFSS STATUS,C
GOTO LEFT
GOTO MAIN
RIGHT MOVLW 0x80
MOVWF REG
RLOOP MOVF REG,W
MOVWF PORTB
CALL DELAY
BCF STATUS,C
RRF REG,F
BTFSS STATUS,C
GOTO RLOOP
GOTO MAIN
DELAY MOVLW 0
MOVWF TMR1L ;Обнуляем счётный регистр Таймера 1
MOVWF TMR1H ;Обнуляем счётный регистр Таймера 1
DLOOP MOVF TIMERL,W ;Значение младшего байта в W
SUBWF TMR1L,W ;Отнимаем от TMR1L TIMERL и сохоаняем в W
BTFSS STATUS,Z ;Проверяем Zero в Status
GOTO DLOOP
MOVF TIMERH,W
SUBWF TMR1H,W ;Отнимаем от TMR1H TIMERH и сохоаняем в W
BTFSS STATUS,Z ;Проверяем Zero в Status
GOTO DLOOP
RETURN
ISR
RETFIE
END