;**********************************************************************
;                                                                     *
;    Filename:         MagiDavid AL101 - Lab 005.asm                  *
;    Date:             10/21/2011                                     *
;    File Version:     1.0                                            *
;                                                                     *
;    Author:           David Hoffman                                  *
;    Company:          NeoLoch, LLC                                   *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required: P16F882.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    License: Creative Commons                                        *
;    Attribution-NonCommercial-ShareAlike 3.0 Unported License.       *
;             http://creativecommons.org/licenses/by-nc-sa/3.0        *
;                                                                     *
;**********************************************************************

     LIST      p=16F882            ; list directive to define processor
     #INCLUDE <p16F882.inc>        ; processor specific variable definitions

     __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT 
     __CONFIG _CONFIG2, _WRT_OFF & _BOR40V

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
; Note that the _DEBUG_ON is changed by selecting a debugger or programmer.  
; There isn't much advantage to setting it in the code.  

#DEFINE		LED1_RED	PORTA,0
#DEFINE		LED1_GREEN	PORTA,1

LED_VAR		UDATA_SHR
LED_LOOP	RES 1
LED_LOOP2	RES 1
LED_CLR_COUNT	RES 1
LED_TEMP_R	RES 1
LED_TEMP_G	RES 1

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

RESET_VECTOR    CODE   0x0000
          goto    START             ; When using debug header, ICD2 may not stop
                                    ; on instruction 0 during reset.

;------------------------------------------------------------------------------
; CONFIGURATION CODE
;------------------------------------------------------------------------------
;START	ORG	0X05
MAIN_PROG       CODE
START
	BANKSEL PORTA
	CLRF	PORTA

	BANKSEL	ANSEL
	CLRF	ANSEL

	BANKSEL	TRISA
	MOVLW	0X00
	MOVWF	TRISA

	CLRF	LED_CLR_COUNT
	CLRF	LED_LOOP
	CLRF	LED_LOOP2
	CLRF	LED_TEMP_R
	CLRF	LED_TEMP_G

;------------------------------------------------------------------------------
; MAIN CODE
;------------------------------------------------------------------------------
MAIN
	BANKSEL	PORTA
					;SLOWLY CHANGE THE GREEN LED FROM OFF TO ON.
	CALL	LED_PAUSE		;PAUSE FOR BIT & REFRESH DISPLAY
	MOVF	LED_LOOP2,W		;COPY CONTENTS OF LED_LOOP2 TO W.
	MOVWF	LED_TEMP_G		;COPY W TO LED_TEMP_G
	INCFSZ	LED_LOOP2,F		;LOOP AROUND 256 TIMES.
	GOTO	$-4
					;SLOWLY CHANGE THE RED LED FROM OFF TO ON.
	CALL	LED_PAUSE
	MOVF	LED_LOOP2,W
	MOVWF	LED_TEMP_R		;COPY THE CONTENTS OF W TO LED_TEMP_R
	INCFSZ	LED_LOOP2,F
	GOTO	$-4
					;SLOWLY CHANGE THE GREEN LED FROM ON TO OFF.
	CALL	LED_PAUSE
	MOVF	LED_LOOP2,W
	MOVWF	LED_TEMP_G		;COPY THE CONTENTS OF W TO LED_TEMP_G
	DECFSZ	LED_LOOP2,F
	GOTO	$-4
					;SLOWLY CHANGE THE RED LED FROM ON TO OFF.
	CALL	LED_PAUSE
	MOVF	LED_LOOP2,W
	MOVWF	LED_TEMP_R		;COPY THE CONTENTS OF W TO LED_TEMP_R
	DECFSZ	LED_LOOP2,F
	GOTO	$-4

	GOTO	MAIN			;LOOP AROUND AND IT ALL OVER AGAIN.


;------------------------------------------------------------------------------
; LED DISPLAY UPDATE
;------------------------------------------------------------------------------
LED_UPDATE
	INCF	LED_CLR_COUNT,F

	MOVF	LED_TEMP_R,W		;COPY CONTENTS OF LED_TEMP_R TO W.
	SUBWF	LED_CLR_COUNT,W		;SUBTRACT W FROM LED_CLR_COUNT
	BTFSS	STATUS,C		;IS W > LED_CLR_COUNT?
	BSF	LED1_RED		;NO - TURN ON RED LED
	BTFSC	STATUS,C		;IS W <= LED_CLR_COUNT?
	BCF	LED1_RED		;YES - TURN OFF RED LED.

	MOVF	LED_TEMP_G,W		;COPY CONTENTS OF LED_TEMP_R TO W.
	SUBWF	LED_CLR_COUNT,W		;SUBTRACT W FROM LED_CLR_COUNT
	BTFSS	STATUS,C		;IS W > LED_CLR_COUNT?
	BSF	LED1_GREEN		;NO - TURN ON GREEN LED
	BTFSC	STATUS,C		;IS W <= LED_CLR_COUNT?
	BCF	LED1_GREEN		;YES - TURN OFF GREEN LED.

	RETURN

;------------------------------------------------------------------------------
; PAUSE AND REFRESH THE LED FOR A SHORT WHILE.
;------------------------------------------------------------------------------
LED_PAUSE
	CALL	LED_UPDATE		;UPDATE DISPLAY
	DECFSZ	LED_LOOP,F
	GOTO	$-2
	RETURN

          END