这是一段用开关控制LED,状态的程序。我使用的是attiny13的单片机,每次开关运行到需要LED闪的时候程序就会卡死,请各位师傅指教下怎样写才能避免让程序卡在死循环里,同时有能让LED闪速起来。
/*
程序要求:
按下第一开关:led1亮,led0灭;
第二次:led0亮,led1灭;
第三次:led0,led1全亮;
第四次:led0灭,led1闪烁;
第五次;led1灭,led0闪烁。
循环~~~~~~
*/
#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define led0_0 PORTB &=~(1<<PB0) //LED0灭.
#define led0_1 PORTB |=(1<<PB0) //LED1亮.
.
#define led1_0 PORTB &=~(1<<PB1)//led1灭.
#define led1_1 PORTB |=(1<<PB1)//led1亮.
uchar m,i;
void NO_0()//第一状态:led1亮,led0灭
{
led0_0;
led1_1;
}
void NO_1()//第二状态:led0亮,led1灭
{
led0_1;
led1_0;
}
void NO_2()//第三状态:led0,led1全亮
{
led0_1;
led1_1;
}
void NO_3()//第四状态:led0灭,led1闪烁。
{
led1_0;
while(1)
{
led0_0;
_delay_ms(500);
led0_1;
_delay_ms(500);
}
}
void NO_4()//第五状态:led1灭,led0闪烁。
{
led0_0;
while(1)
{
led1_0;
_delay_ms(500);
led1_1;
_delay_ms(500);
}
}
void NO_5()//第六状态:led0,led1一起闪烁。
{
while(1)
{
led0_0;
led1_0;
_delay_ms(500);
led0_1;
led1_1;
_delay_ms(500);
}
}
int main(void)
{
DDRB=0b001111;
PORTB=0b110010;
while(1)
{
if (PINB &(1<<PB4)) //如果开关按下
{
_delay_ms(10);
if (PINB & (1<<PB4))//开关是否真的按下
{
while(PINB &(1<<PB4));
m++;
_delay_ms(10);
}
}
switch(m)
{
case 0:NO_0();break;
case 1:NO_1();break;
case 2:NO_2();break;
case 3:NO_3();break;
case 4:NO_4();break;
case 5:NO_5();break;
default:m=0;break;
}
}
}
此帖出自
小平头技术问答
是不是有时候按键按下,但程序没有检测到按键
你程序中LED闪烁的时候,延时器件,如果按下按键,这时候是不会响应按键的。
如果使用定时器实现演示,可以解决按键不能及时响应的问题
一周热门 更多>