;**********************************************************************
;                                                                     *
;    Filename:         MagiDavid AL101 - Lab 003.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
#DEFINE		LED_RLED_GREEN	0X00
#DEFINE		LED_GLED_GREEN	0XFF
#DEFINE		LED_RLED_RED	0XFF
#DEFINE		LED_GLED_RED	0X00
#DEFINE		LED_RLED_YELLOW	0XF1
#DEFINE		LED_GLED_YELLOW	0XEF
#DEFINE		LED_RLED_ORANGE	0XB5
#DEFINE		LED_GLED_ORANGE	0X81

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

;------------------------------------------------------------------------------
; MAIN CODE
;------------------------------------------------------------------------------
MAIN
	BANKSEL	PORTA
	CALL	LED_COLOR_YELLOW
	CALL	LED_UPDATE
	DECFSZ	LED_LOOP,F
	GOTO	$-2
	DECFSZ	LED_LOOP2,F
	GOTO	$-4

	CALL	LED_COLOR_RED
	CALL	LED_UPDATE
	DECFSZ	LED_LOOP,F
	GOTO	$-2
	DECFSZ	LED_LOOP2,F
	GOTO	$-4

	CALL	LED_COLOR_GREEN
	CALL	LED_UPDATE
	DECFSZ	LED_LOOP,F
	GOTO	$-2
	DECFSZ	LED_LOOP2,F
	GOTO	$-4

	CALL	LED_COLOR_ORANGE
	CALL	LED_UPDATE
	DECFSZ	LED_LOOP,F
	GOTO	$-2
	DECFSZ	LED_LOOP2,F
	GOTO	$-4

	GOTO	MAIN


;------------------------------------------------------------------------------
; LED DISPLAY UPDATE
;------------------------------------------------------------------------------
LED_UPDATE
	INCF	LED_CLR_COUNT,F

	CALL	LED1_RED_OFF
	MOVF	LED_TEMP_R,W
	SUBWF	LED_CLR_COUNT,W
	BTFSS	STATUS,C
	CALL	LED1_RED_ON

	CALL	LED1_GREEN_OFF
	MOVF	LED_TEMP_G,W
	SUBWF	LED_CLR_COUNT,W
	BTFSS	STATUS,C
	CALL	LED1_GREEN_ON
	RETURN

;------------------------------------------------------------------------------
; LED COLOR DATA - RED
;------------------------------------------------------------------------------
LED_COLOR_RED
	MOVLW	LED_RLED_RED
	MOVWF	LED_TEMP_R
	MOVLW	LED_GLED_RED
	MOVWF	LED_TEMP_G
	RETURN

;------------------------------------------------------------------------------
; LED COLOR DATA - GREEN
;------------------------------------------------------------------------------
LED_COLOR_GREEN
	MOVLW	LED_RLED_GREEN
	MOVWF	LED_TEMP_R
	MOVLW	LED_GLED_GREEN
	MOVWF	LED_TEMP_G
	RETURN

;------------------------------------------------------------------------------
; LED COLOR DATA - ORANGE
;------------------------------------------------------------------------------
LED_COLOR_ORANGE
	MOVLW	LED_RLED_ORANGE
	MOVWF	LED_TEMP_R
	MOVLW	LED_GLED_ORANGE
	MOVWF	LED_TEMP_G
	RETURN

;------------------------------------------------------------------------------
; LED COLOR DATA - YELLOW
;------------------------------------------------------------------------------
LED_COLOR_YELLOW
	MOVLW	LED_RLED_YELLOW
	MOVWF	LED_TEMP_R
	MOVLW	LED_GLED_YELLOW
	MOVWF	LED_TEMP_G
	RETURN

;------------------------------------------------------------------------------
; TURN LEDs ON OR OFF
;------------------------------------------------------------------------------
LED1_RED_ON
	BSF	LED1_RED
	RETURN

LED1_RED_OFF
	BCF	LED1_RED
	RETURN

LED1_GREEN_ON
	BSF	LED1_GREEN
	RETURN

LED1_GREEN_OFF
	BCF	LED1_GREEN
	RETURN

          END