Заведите таймер на милисекундные прерывания.
В основном цикле опрашивайте флаг. Если он установлен то манипулируйте с таймерами для каждого светодиода.
Если сложно сделать прерывания от ТС просто ставте задержку на 1 мС в основном цикле и и опять же ведите для каждого светодиода свой таймер милисекунд.
Код
volatile unsigned char msk_flag; //флаг устанавливается в прерывании от ТС
unsigned int led_1_timer, led_2_timer; //таймеры для каждого светодиода
if(msk_flag)
{
msk_flag = 0;
if(led_1_timer>0) led_1_timer--;
else
{
led_1_timer = 1000;
inv_led(LED_1);
}
if(led_2_timer>0) led_2_timer--;
else
{
led_2_timer = 417;
inv_led(LED_2);
}
}
Без прерываний
Код
#include <mega8515.h>
#include <delay.h>
// Declare your global variables here
#define LED_1_TIMEOUT 1000
#defien LED_2_TIMEOUT 417
#define LED_1_MSK (1<<0) //PC0
#defien LED_2_MSK (1<<1) //PC1
int main(void)
{
DDRC = LED_1_MSK|LED_2_MSK; //настройка порта на вывод
unsigned int led_1_timer = LED_1_TIMEOUT, led_2_timer = LED_2_TIMEOUT; //таймеры для каждого светодиода
while (1)
{
delay_ms(1);
if(led_1_timer>0) led_1_timer--;
else
{
led_1_timer = LED_1_TIMEOUT;
PORTC ^= LED_1_MSK; //инверсия пина
}
if(led_2_timer>0) led_2_timer--;
else
{
led_2_timer = LED_2_TIMEOUT;
PORTC ^= LED_2_MSK; //инверсия пина
}
}
Сообщение отредактировал mempfis_ - Nov 8 2010, 12:32