;*****************************************************************
;*This program attempts to flash an LED at approx 1 sec intervals*
;*The program uses the Prescaler, Timer0 and a File Register *
;*called Clock_Divisor located at 20h *
;* *
;*Target: PIC16F877A *
;*Ver: 1.00 *
;*Author: Tunedwolf *
;*Date: 30/01/2011 *
;*****************************************************************
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON &_HS_OSC & _WRT_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
;EQUATE TABLE
CLOCK_DIVISOR EQU H'20' ;ASSOCIATE CLOCK DIVISOR WITH REGISTER 20H
;CODE STARTS HERE
ORG H'00' ;RESET VECTOR
GOTO INIT ;JUMP TO INIT AND BEGIN EXECUTION
ORG H'04' ;INTERRUPT VECTOR
BCF INTCON, TMR0IF ;CLEAR TIMER0 OVERFLOW INTERRUPT
DECFSZ CLOCK_DIVISOR
RETFIE ;RETURN TO MAIN LOOP
MOVLW H'0F'
MOVWF CLOCK_DIVISOR ;RESET CLOCK PERIOD DIVISOR
BTFSS PORTB, 5 ;TEST IF LED IS ON OR OFF (PORTB PIN 5)
GOTO LED_ON ;IT'S OFF, TURN IT ON
LED_OFF:
BCF PORTB, 5 ;IT WAS ON, TURN IT OFF
RETFIE ;RETURN TO MAIN LOOP
LED_ON:
BSF PORTB, 5 ;IT WAS OFF, TURN IT ON
RETFIE ;RETURN TO MAIN LOOP
INIT:
BSF STATUS, RP0 ;SET BANK BIT
MOVLW H'C7' ;ASSIGN PRESCALER TO TIMER0 WITH VALUE CLK/256
MOVWF OPTION_REG ;AND SET THE OPTION REGISTER
MOVLW H'DF' ;SET MASK FOR PORT PINS TO USE AS OUTPUT (BIT 5)
MOVWF TRISB ;AND APPLY TO PORT DIRECTION REGISTER
BCF STATUS, RP0 ;CLEAR BANK BIT
CLRF PORTB ;CLEAR JUNK ON PORT
MOVLW H'0F' ;SET DIVISOR
MOVWF CLOCK_DIVISOR ;STORE IN CLOCK DIVISOR SCRATCH
CLRF TMR0 ;CLEAR TIMER0
MOVLW H'A0' ;MASK GLOBAL AND TIMER0 OVERFLOW INTERRUPTS
MOVWF INTCON ;AND APPLY
LOOP:
NOP
GOTO LOOP ;GO ROUND AND ROUND FOREVER
END ;OBVIOUS, BUT WORTH A MENTION