Код: Выделить всё
#include <mega8.h>
#include <delay.h>
volatile char pwm_counter,pwm_r,pwm_g,pwm_b;
/*** прерывание по переполнению Таймера 0 ***/
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (pwm_counter++ > 163)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > pwm_r)
PORTB.1 = 1;
if (pwm_counter > pwm_g)
PORTB.2 = 1;
if (pwm_counter > pwm_b)
PORTB.3 = 1;
}
/*** красный цвет ***/
void red (unsigned int time)
{char a;
for (a = 0; a<165; a++)
{
pwm_r = 164 - a; //увеличение
pwm_g = 164;
pwm_b = 164;
delay_ms(time);
}
for (a = 0; a<165; a++)
{
pwm_r = a; //уменьшение
pwm_g = 164;
pwm_b = 164;
delay_ms(time);
}
}
/*** зеленый цвет ***/
void green (unsigned int time)
{char a;
for (a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = 164 - a;
pwm_b = 164;
delay_ms(time);
}
for (a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = a;
pwm_b = 164;
delay_ms(time);
}
}
/*** синий цвет ***/
void blue (unsigned int time)
{char a;
for (a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = 164;
pwm_b = 164 - a;
delay_ms(time);
}
for (a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = 164;
pwm_b = a;
delay_ms(time);
}
}
/*** белый цвет ***/
void white (unsigned int time)
{char a;
for (a = 0; a<165; a++)
{
pwm_r = 164 - a;
pwm_g = 164 - a;
pwm_b = 164 - a;
delay_ms(time);
}
for (a = 0; a<165; a++)
{
pwm_r = a;
pwm_g = a;
pwm_b = a;
delay_ms(time);
}
}
/*** переход цветов ***/
void rgb (unsigned int time)
{char a;
for (a = 0; a<165; a++)
{
pwm_r = a;
pwm_b = 164 - a;
delay_ms(time);
}
for (a = 0; a<165; a++)
{
pwm_b = a;
pwm_g = 164 - a;
delay_ms(time);
}
for (a = 0; a<165; a++)
{
pwm_g = a;
pwm_r = 164 - a;
delay_ms(time);
}
}
void main (void)
{
DDRB = 0x0E; // PB3,2,1 - выходы
PORTB = 0x00;
TIMSK = 0x01; // разрешение прерывания
TCCR0 = 0x01; // без предделителя
#asm("sei"); // глобальное разрешение прерываний
while(1)
{
red(5);
green(5);
blue(5);
white(10);
for(;;)
{rgb(100);}
}
}
Еще вопрос. Как бы рациональнее все это осуществить. Просто через транзисторы или брать сразу драйвер для светодиодов. Заранее спасибо!!!


