; ; Blink a led on RA0. ; Round robin architecture ; ; Blinking frequency is approx 10 Hz (FC = 20 MHz). ; LIST p=16F877A radix dec #include __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF #define CTR_INIT 244 CBLOCK 0x20 timer_signal ctr ENDC ; reset vector org 0x00 goto start ; interrupt vector org 0x04 retfie init_globals bcf STATUS, RP0 bcf STATUS, RP1 ; bank 0 clrf timer_signal movlw CTR_INIT movwf ctr return init_ports bcf STATUS, RP0 bcf STATUS, RP1 ; bank 0 clrf PORTA ; clear output latches bsf STATUS, RP0 ; bank 1 movlw 0x06 movwf ADCON1 ; digital bcf TRISA, 0 ; set RA0 as output return init_timer bsf STATUS, RP0 bcf STATUS, RP1 ; bank 1 movlw B'11010001' ; internal osc source and 1:4 PS movwf OPTION_REG bcf INTCON, T0IF return timer_task btfss INTCON, T0IF return bcf STATUS, RP0 bcf STATUS, RP1 ; bank 0 bcf INTCON, T0IF decfsz ctr, f return ; ctr != 0 movlw CTR_INIT ; ctr == 0 movwf ctr bsf timer_signal, 0 return led_task bcf STATUS, RP0 bcf STATUS, RP1 ; bank 0 btfss timer_signal, 0 return bcf timer_signal, 0 movlw B'00000001' ; mask for xoring RA0 xorwf PORTA, f return start call init_globals call init_ports call init_timer main_loop call timer_task call led_task goto main_loop END