oid isr(void) __interrupt(1)
{
static unsigned int i;
if(INTFbits.T1IF)
{
//PORTB ^= (1<<0); // PB1 Toggle
INTF= (unsigned char)~(C_INT_TMR1);
if(i>=500)
{
PB0 =1; PB1 =0; PB2 =0;
PB0 =0; PB1 =1; PB2 =0;
PB0 =0; PB1 =0; PB2 =1;
i=0
}
else{
i=i+1;
}
}
已有三个状态,怎么让它们一次只能有一个状态,之后循环下去?比如(红灯亮了,其余灯就熄灭,之后再到黄灯亮了,其余灯就熄灭,绿灯亮了,其余灯就熄灭,一直循环下去。)
PB0 = i % 3 == 0 ? 1 : 0;
PB1 = (i + 1) % 3 == 0 ? 1 : 0;
PB2 = (i + 2) % 3 == 0 ? 1 : 0;
【以下回答由 GPT 生成】
根据你的描述,你想要实现三个状态之间的循环,并且每次只有一个状态处于激活状态。基于你的代码,下面是一种可能的解决方案:
oid isr(void) __interrupt(1)
{
static unsigned int i;
static unsigned char state = 0;
if (INTFbits.T1IF)
{
// 其他代码
// ...
switch (state)
{
case 0:
PB0 = 1; PB1 = 0; PB2 = 0;
break;
case 1:
PB0 = 0; PB1 = 1; PB2 = 0;
break;
case 2:
PB0 = 0; PB1 = 0; PB2 = 1;
break;
}
// 切换到下一个状态
state = (state + 1) % 3;
// 其他代码
// ...
}
}
上述代码使用了一个state
变量来记录当前的状态。在每次中断触发时,根据state
的值选择相应的状态,并切换到下一个状态。这样就可以实现三个状态之间的循环。
请注意,以上只是一种可能的解决方案,具体的实现方式还取决于你的需求和环境。如果你的问题不仅仅是切换状态,也可能涉及到其他复杂的逻辑处理,你可能需要提供更多关于这个程序的信息,以便我们能够给出更具体的解决方案。
【相关推荐】
这么写,供参考:
oid isr(void) __interrupt(1)
{
static unsigned int i = 0;
static unsigned char state = 0;
if(INTFbits.T1IF)
{
INTF = (unsigned char)~(C_INT_TMR1);
i++;
if(i >= 500) {
state = (state + 1) % 3;
i = 0;
}
switch (state){
case 0: PB0 =1; PB1 =0; PB2 =0; break;
case 1: PB0 =0; PB1 =1; PB2 =0; break;
case 2: PB0 =0; PB1 =0; PB2 =1; break;
}
}
//...........
}