 list p=16f887
    #include   <p16f887.inc>
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V


;------------------------------------------------------------------
;configuro inicio del programa con el vector reset/interrupcion
;*****************************************************************
        org 00H

           goto inicio

     org 04h
        goto Interrupcion
;-----------------------------------------------------------------------
; Inicia Programa
; CONFIGURO I/O
;**********************************************************************

inicio
    ;-------------------------------------------------------------------------
; Configuro Variables
;*************************************************************************
    CBLOCK  20H
    pwm_r, pwm_v, pwm_a, W2, Status2, Var_I, Var_C, pwm_state, cont, Var_T, Inte
    endc
;---------------------------------------------------------------------
; configuro Interrupcion cada 40us
;*********************************************************************
   
    BANKSEL OPTION_REG
    Movlw   b'00000010'
    Movwf   OPTION_REG
    Movlw   b'10100000'
    Movwf   INTCON
    BANKSEL ANSEL
    clrf    ANSELH
    BANKSEL TRISD
    clrf    TRISB
    BANKSEL PORTA
    clrf    PORTB
;-------------------------------------------------------------------------
; Defino pin de puertos
;*************************************************************************
    #Define Led_r PORTB,0
    #Define Led_v PORTB,1
    #Define Led_a PORTB,2

;--------------------------------------------------------------------------
; Pregunto la variable "Var_C" para ver en que color me encuentro
;**************************************************************************
    Movlw   .0
    movwf   Var_C
Carga_duty
    movf    Var_C,W
    addwf   PCL, F
    goto    rojo
    goto    Azul
    goto    verde
    goto    amarillo
    goto    agua
    goto    magenta
    goto    orange
    goto    bonito
    goto    morado
    goto    marron
    goto    violeta
    goto    oscuro
    goto    verde1
    goto    rosado
    goto    verde2
    goto    blanco
;-------------------------------------------------------------------------
; Cargo las variables con los distintos dutys para generar 
;los colores correspondientes
;*************************************************************************

rojo
    movlw   .255
    movwf   pwm_r
    movlw   .0
    movwf   pwm_v
    movlw   .0
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

verde
    movlw   .0
    movwf   pwm_r
    movlw   .255
    movwf   pwm_v
    movlw   .0
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

Azul
    movlw   .0
    movwf   pwm_r
    movlw   .0
    movwf   pwm_v
    movlw   .255
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

amarillo
    movlw   .255
    movwf   pwm_r
    movlw   .255
    movwf   pwm_v
    movlw   .0
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm
agua
    movlw   .0
    movwf   pwm_r
    movlw   .255
    movwf   pwm_v
    movlw   .255
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

magenta
    movlw   .255
    movwf   pwm_r
    movlw   .0
    movwf   pwm_v
    movlw   .255
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

orange
    movlw   .255
    movwf   pwm_r
    movlw   .140
    movwf   pwm_v
    movlw   .0
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

bonito
    movlw   .0
    movwf   pwm_r
    movlw   .250
    movwf   pwm_v
    movlw   .154
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

morado
    movlw   .147
    movwf   pwm_r
    movlw   .112
    movwf   pwm_v
    movlw   .219
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

marron
    movlw   .139
    movwf   pwm_r
    movlw   .69
    movwf   pwm_v
    movlw   .19
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

violeta
    movlw   .238
    movwf   pwm_r
    movlw   .130
    movwf   pwm_v
    movlw   .238
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

oscuro
    movlw   .25
    movwf   pwm_r
    movlw   .25
    movwf   pwm_v
    movlw   .112
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

verde1
    movlw   .46
    movwf   pwm_r
    movlw   .139
    movwf   pwm_v
    movlw   .87
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

rosado
    movlw   .220
    movwf   pwm_r
    movlw   .20
    movwf   pwm_v
    movlw   .60
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

verde2
    movlw   .144
    movwf   pwm_r
    movlw   .238
    movwf   pwm_v
    movlw   .144
    movwf   pwm_a
    incf    Var_C
    goto    Pregunto_Pwm

blanco
    movlw   .255
    movwf   pwm_r
    movlw   .255
    movwf   pwm_v
    movlw   .255
    movwf   pwm_a
    clrf    Var_C
    goto    Pregunto_Pwm

;-------------------------------------------------------------------------
;Pregunto si ya cumplieron los ciclos de trabajo
;**************************************************************************
Pregunto_duty
    
;---------------------------------------------------------------------
; Pregunto si Var_I llego a 255
;**********************************************************************
    btfss   PORTB,3
    goto    Pregunto_Pwm1
    clrf    Var_I
    clrf    PORTB
    goto    Carga_duty

;---------------------------------------------------------------------
; configuro Interrupcion cada 40us
;*********************************************************************
Pregunto_Pwm
    BANKSEL TMR0
    Movlw   .251
    Movwf   TMR0
Pregunto_Pwm1
    movf    pwm_r,0
    subwf   Var_I,0
    btfss   STATUS,C
    goto    on_r
    goto    off_r
off_r
    bcf     Led_r
    goto    Pregunto_v
on_r
    bsf     Led_r
    goto    Pregunto_v

Pregunto_v
    movf    pwm_v,0
    subwf   Var_I,0
    btfss   STATUS,C
    goto    on_v
    goto    off_v
off_v
    bcf     Led_v
    goto    Pregunto_a
on_v
    bsf     Led_v
    goto    Pregunto_a

Pregunto_a
    movf    pwm_a,0
    subwf   Var_I,0
    btfss   STATUS,C
    goto    on_a
    goto    off_a
off_a
    bcf     Led_a
    goto    Pregunto_duty
on_a
    bsf     Led_a
    goto    Pregunto_duty

;--------------------------------------------------------------------
;rutina de interrupcion
;********************************************************************

Interrupcion
;---------------------------------------------------------------------
;guardamos registros importantes
;*********************************************************************
    movwf    W2
    movf     STATUS,w
    movwf    Status2
    incf    Var_I,f
    movlw   .255
    subwf   Var_I,0
    btfss   STATUS,Z
    goto    apago
    goto    prendo
prendo
    bsf     PORTB,3
    goto    inte
apago
    bcf     PORTB,3
inte
    bcf     INTCON,T0IF
    Movlw   .251
    Movwf   TMR0
;-------------------------------------------------------------------
; devuelvo valor a w y status, tambien pongo en bajo Toif
;****************************************************************
    movf    Status2,w
    movwf   STATUS
    movf    W2,W
    retfie
    end