----------------------------------------------------------------- -- PWM CON UN LED Y 3 PULSADORES PARA CAMBIAR 3 DIFERENTES EFECTOS ----------------------------------------------------------------- -- -- El circuito está formado un cristal de 20Mhz -- y un led en RC2 ----------------------------------------------------------------- -- Incluimos la librería del pic 16F877A include 16f877a pragma target clock 20_000_000 -- xtal frequency pragma target OSC hs pragma target LVP disabled pragma target WDT disabled -- COnfiguración de los pines. alias lcd_bl is pin_c2 alias lcd_bl_direction is pin_c2_direction alias pulsador1 is pin_c0 alias pulsador2 is pin_c1 alias pulsador1_direction is pin_c0_direction alias pulsador2_direction is pin_c1_direction alias pulsador3_direction is pin_c3_direction enable_digital_io() -- Configuracíon PWM pin_ccp1_direction = output pulsador1 = input pulsador2 = input include pwm_hardware pwm_max_resolution(1) pwm1_on() var word pulsador forever loop var dword b b = 0 while b < 0xFFFF loop -- Realizamos una pequeña demora para escanear el teclado. Aproximadamente medio segundo if pulsador1 != 0 then -- Corriendo a 20Mhz if pulsador == 1 then -- Escaneamos el teclado. Si el pulsador en C0 es 1, y si la variable pulsador es igual a 1 pulsador = 0 -- Lo colocamos en 0 else -- En cambio pulsador = 1 -- Lo ponemos es 1. end if -- Lo que logramos aquí, es que con el mismo pulsador prendemos o apagamos el efecto elegido end if if pulsador2 != 0 then -- Idem anterior pero con el pulsador conectado a C1. if pulsador == 2 then pulsador = 0 else pulsador = 2 end if end if b = b + 1 end loop var word i i = 0 pwm1_on() --------------------------------------------------------------------------------- -- Primer efecto. Se elige con el pulsador 1 --------------------------------------------------------------------------------- if pulsador == 1 then -- Resolución del PWM de 10 bit (duty < 1024) while i < 1020 loop -- Mientras i es menor a 1020 pwm1_set_dutycycle_highres(i) -- cargamos el duty con el contenido de i _usec_delay(50000) -- Demora. Regulamos la velocidad del PWM -- Si es muy chica la demora, no se apreciarán los cambios -- Si es muy grande la demora, tardará mucho en ir de 0V a 5V i = i + 10 -- Incrementamos en 10 la variable i. -- Modificando el incremento, también variamos la velocidad de barrido -- del PWM end loop -- Sale del While cuando i = a 1020, mientras sea menor, se repite el while. while i > 0 loop -- Aquí pasa lo mismo que el while anterior, pero en sentido inverso. pwm1_set_dutycycle_highres(i) -- Recordemos que en este punto i = 1020 _usec_delay(50000) i = i - 10 end loop _usec_delay(50000) -- Tiempo de permanencia apagado el led una vez que terminó el ciclo anterior pwm1_off() _usec_delay(50000) -- Tiempo de permanencia encendido del led una vez que terminó el ciclo anterior pwm1_on() -- Si estos valores son chicos, o se anula esta parte del programa, el led variará -- continuamente. Si es muy grande la demora, el led permanecera bastante tiempo end if -- encendido y apagado hasta comenzar un nuevo ciclo del PWM --------------------------------------------------------------------------------- -- Segundo efecto. Se elige con el pulsador 2 --------------------------------------------------------------------------------- if pulsador == 2 then while i < 1020 loop pwm1_set_dutycycle_highres(i) -- Noten que la única diferencia en esta rutina de PWM _usec_delay(10000) -- Cambia los valores de demora i = i + 20 -- y la incrementación de los valores para el PWM end loop _usec_delay(1000) pwm1_off() end if if pulsador == 0 then pwm1_off() end if end loop