;=======================================================
; Проект 21. Программный ШИМ — плавная яркость светодиода
; PIC16F84A, 4 МГц. Светодиод на RB0
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        duty                    ; текущая скважность 0..255
        pwmcnt                  ; счётчик внутри периода
        reps                    ; сколько периодов держать яркость
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB
        bcf     STATUS,RP0
        clrf    PORTB
        clrf    duty

Main
        ;--- разгораемся ---
Up
        call    PwmBlock
        incf    duty,f
        movf    duty,w
        xorlw   .255
        btfss   STATUS,Z
        goto    Up
        ;--- гаснем ---
Down
        call    PwmBlock
        decf    duty,f
        movf    duty,w
        btfss   STATUS,Z
        goto    Down
        goto    Main

;--- держим текущую яркость несколько периодов ШИМ ---
PwmBlock
        movlw   .8
        movwf   reps
Rep
        clrf    pwmcnt
Period
        movf    pwmcnt,w
        subwf   duty,w          ; duty - pwmcnt
        btfss   STATUS,C        ; если pwmcnt < duty — светит
        goto    Off
        bsf     PORTB,0
        goto    NextTick
Off
        bcf     PORTB,0
NextTick
        nop
        nop
        incfsz  pwmcnt,f        ; 256 шагов = период ШИМ
        goto    Period
        decfsz  reps,f
        goto    Rep
        return

        END
