Суббота, Май 30, 2020

Бегущие огни с использованием таймера PIC ASM

;В этом листинге будем использовать Таймер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
            SUBWF       TMR1L,W   ;Отнимаем от TMR1L TIMERL и сохоаняем в W
            BTFSS       STATUS, ;Проверяем Zero в Status
            GOTO        DLOOP
            MOVF        TIMERH,W
            SUBWF       TMR1H,W   ;Отнимаем от TMR1H TIMERH и сохоаняем в W
            BTFSS       STATUS, ;Проверяем Zero в Status
            GOTO        DLOOP
            RETURN
ISR         
            RETFIE
            END

 

 

НАЗАД                  Assembler AVR                  Си AVR                  ДАЛЬШЕ

Back to Top