do que o programa acima, entao vamos acrescentar mais uma funcionalidade a aplicacao: um led de status. A funcao desse led e indicar que o microcontrolador esta ligado e funcionando, para isso faremos ele piscar em ciclos de 1 segundo, ficando meio segundo apagado e meio segundo aceso. Assumindo que seja usado o pino P3 para ativar o led, poderia ser feita uma implementacao como o programa abaixo:#define mnPin P1#define pinAlarm P2#define pinStatus P3 #define on 1#define off 0 void main(){ // inicializacao setDigitalInput(mnPin, HIGH_IMPEDANCE); setDigitalOutput(pinAlarm, LOW); setDigitalOutput(pinStatus, LOW); // loop principal while(1) { // monitoramento pinAlarm = !mnPin; // led de status pinStatus = on; delay(500); pinStatus = off; delay(500); }} A funcao delay() faz com que o processador espere a quantidade de milissegundos indicada no argumento. A cada iteracao do loop principal, o programa agora verifica o pino monitorado, em seguida liga o led de status e espera meio segundo. A seguir o led de status e desligado e novamente ha uma espera de meio segundo. Este codigo faz o que e pedido, mas agora cada iteracao demora pelo menos um segundo para ser completada. Isso significa que se o pino P1 for para o nivel baixo logo apos ele ser verificado, pode demorar ate um segundo para que o alarme seja ativado. Essa demora pode ser aceitavel em algumas aplicacoes, mas tambem pode inviabilizar outras. Suponha que o alarme signifique uma sobrecarga eletrica no sistema e o mesmo sinal que ative o alarme tambem desligue o dispositivo sobrecarregado. Nesse caso, um segundo e tempo mais que suficiente para torrar o dispositivo que deveria estar sendo protegido.Mas entao como fazer para piscar o led de um modo nao-bloqueante? Veja o codigo abaixo:#define mnPin P1#define pinAlarm P2#define pinStatus P3 void blinkStatusLed(){ static uint32 nextToggle = 0; if(getMs() >= nextToggle) { pinStatus = !pinStatus; nextToggle = getMs()+500; }} void main(){ // inicializacao setDigitalInput(mnPin, HIGH_IMPEDANCE); setDigitalOutput(pinAlarm, LOW); setDigitalOutput(pinStatus, LOW); // loop principal while(1) { // monitoramento pinAlarm = !mnPin; // led de status blinkStatusLed(); }} A funcao getMs() faz parte da biblioteca do Wixel e retorna a quantidade de milissegundos decorridos desde que o microcontrolador foi ligado. Uma funcao com essa funcionalidade existe nas bibliotecas da maioria dos microcontroladores, talvez com outro nome. De qualquer forma, a funcao permite medir intervalos de tempo em milissegundos. A nova implementacao do programa acrescenta a funcao blinkStatusLed() que cuida de piscar o led de status. Veja que nao ha mais chamadas a funcao delay(). Em vez disso, a variavel estatica nextToggle armazena quando devera ser feita a proxima mudanca de estado do led somando o valor 500 ao valor retornado por getMs() cada vez que o led muda de estado. A grande diferenca entre esta implementacao e a anterior, e que novamente o pino sera monitorado milhares de vezes por segundo, ja que nao existe mais nenhuma espera no processamento. Apesar disso, o led ira piscar em ciclos de 1 segundo, conforme foi especificado.Led de status piscanteUma maneira simples de resolver a questao do topico anterior seria fazer com que o led de status fique sempre