C 当变量发生变化时,如何打破if
我需要帮助我有一个基本的程序,根据我按下的开关,按顺序播放LED,我想知道的是:当我切换其他开关并运行新的顺序,而不是之前的顺序时,如何中断一个(或停止)并运行另一个顺序,我想知道其他需要中止操作的程序是如何做到的,因为它会在“循环”中出现延迟等情况,我想在每个led的行之间设置if可以做到这一点,但我认为这不是正确/有效的方法。。谢谢C 当变量发生变化时,如何打破if,c,pic,C,Pic,我需要帮助我有一个基本的程序,根据我按下的开关,按顺序播放LED,我想知道的是:当我切换其他开关并运行新的顺序,而不是之前的顺序时,如何中断一个(或停止)并运行另一个顺序,我想知道其他需要中止操作的程序是如何做到的,因为它会在“循环”中出现延迟等情况,我想在每个led的行之间设置if可以做到这一点,但我认为这不是正确/有效的方法。。谢谢 #include <16f876.h> #use delay(clock=4M) #fuses XT,NOWDT #use standard_io(
#include <16f876.h>
#use delay(clock=4M)
#fuses XT,NOWDT
#use standard_io(A)
#use standard_io(B)
int16 t0=2000;
int16 t1=1000;
int16 t2=1000;
int16 t3=500;
void main(){
output_b(0b00000000);
while(TRUE){
if(input(PIN_A0)==0){
output_b(0b00000000);
output_b(0b00011000);
delay_ms(t0);
output_b(0b00100100);
delay_ms(t0);
output_b(0b01000010);
delay_ms(t0);
output_b(0b10000001);
delay_ms(t0);
}
if(input(PIN_A1)==0){
output_b(0b00000000);
output_b(0b00000001);
delay_ms(t1);
output_b(0b00000011);
delay_ms(t1);
output_b(0b00000111);
delay_ms(t1);
output_b(0b00001111);
delay_ms(t1);
output_b(0b00011111);
delay_ms(t1);
output_b(0b00111111);
delay_ms(t1);
output_b(0b01111111);
delay_ms(t1);
output_b(0b11111111);
delay_ms(t1);
}
if(input(PIN_A2)==0){
output_b(0b10000000);
delay_ms(t2);
output_b(0b11000000);
delay_ms(t2);
output_b(0b11100000);
delay_ms(t2);
output_b(0b11110000);
delay_ms(t2);
output_b(0b11111000);
delay_ms(t2);
output_b(0b11111100);
delay_ms(t2);
output_b(0b11111110);
delay_ms(t2);
output_b(0b11111111);
delay_ms(t2);
}
if(input(PIN_A3)==0){
output_b(0b00000000);
output_b(0b00000001);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b00000011);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b00000111);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b00001111);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b00011111);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b00111111);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b01111111);
delay_ms(t3);
output_b(0b00000000);
delay_ms(t3);
output_b(0b11111111);
delay_ms(t3);
}
}
}
#包括
#使用延迟(时钟=4M)
#保险丝XT,NOWDT
#使用标准io(A)
#使用标准io(B)
int16 t0=2000;
int16 t1=1000;
int16 t2=1000;
int16 t3=500;
void main(){
输出b(0b0000000);
while(TRUE){
如果(输入(引脚A0)=0){
输出b(0b0000000);
输出_b(0b00011000);
延迟μms(t0);
输出_b(0B00100);
延迟μms(t0);
输出_b(0b01000010);
延迟μms(t0);
输出_b(0b10000001);
延迟μms(t0);
}
如果(输入(引脚A1)==0){
输出b(0b0000000);
输出_b(0b0000001);
延迟μms(t1);
输出_b(0b00000011);
延迟μms(t1);
输出_b(0b0000111);
延迟μms(t1);
输出_b(0b00001111);
延迟μms(t1);
输出_b(0b00011111);
延迟μms(t1);
输出_b(0B0011111);
延迟μms(t1);
输出_b(0b01111111);
延迟μms(t1);
输出_b(0b11111111);
延迟μms(t1);
}
如果(输入(引脚A2)==0){
输出b(0b10000000);
延迟时间(t2);
输出(0b11000000);
延迟时间(t2);
输出_b(0b11100000);
延迟时间(t2);
输出_b(0b11110000);
延迟时间(t2);
输出_b(0b11111000);
延迟时间(t2);
输出_b(0b11111100);
延迟时间(t2);
输出_b(0b11111110);
延迟时间(t2);
输出_b(0b11111111);
延迟时间(t2);
}
如果(输入(引脚A3)==0){
输出b(0b0000000);
输出_b(0b0000001);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0b00000011);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0b0000111);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0b00001111);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0b00011111);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0B0011111);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0b01111111);
延迟时间(t3);
输出b(0b0000000);
延迟时间(t3);
输出_b(0b11111111);
延迟时间(t3);
}
}
}
您可以编写自己的延迟函数,如下所示:
bool my_delay_ms(int mstime) {
int current = 0;
while (current < mstime) {
delay_ms(10);
current += 10;
if (something?) {
return true;
}
}
return false;
}
bool my\u delay\u ms(int mstime){
int电流=0;
while(当前<毫秒时间){
延迟时间(10);
电流+=10;
如果(某事?){
返回true;
}
}
返回false;
}
如果(my_delay_ms(t0))继续,则用替换每个延迟_ms代码>
您可以将10更改为您想要轮询中断信号的频率。该条件检测到中断信号,continue
允许您的while循环跳到下一个循环,以便在适当的情况下更改顺序。您可以编写自己的延迟函数,如下所示:
bool my_delay_ms(int mstime) {
int current = 0;
while (current < mstime) {
delay_ms(10);
current += 10;
if (something?) {
return true;
}
}
return false;
}
bool my\u delay\u ms(int mstime){
int电流=0;
while(当前<毫秒时间){
延迟时间(10);
电流+=10;
如果(某事?){
返回true;
}
}
返回false;
}
如果(my_delay_ms(t0))继续,则用替换每个延迟_ms代码>
您可以将10更改为您想要轮询中断信号的频率。该条件检测到中断信号,continue
允许您的while循环跳到下一个周期,以便在适当的情况下更改顺序。您可以设置一个每毫秒触发一次的计时器,然后将代码重写为状态机。这样,您就不会在延迟例程中浪费cpu周期,并且您能够立即响应按钮按下,至少在一毫秒之内,这对用户来说是即时的
状态机跟踪变量。数字代表它所处的状态。每次执行一个状态时,该状态可能会改变。更改后的状态将在下次计时器触发时执行。每个触发器还检查按钮/去抖动等
确保您的代码在计时器周期内运行,因此不要使用任何延迟,而是使用状态机来执行延迟,或者如果您需要不同的分辨率/计时,则使用另一个计时器
我会让你来设置定时器和中断寄存器
/* global variables */
int state = 0;
unsigned char delaycnt = 0;
char millisecond_flag = 0;
void DoStateMachine()
{
switch( state )
{
case 100:
output_b(0b00000000);
output_b(0b00011000);
state++;
delaycnt = 10;
break;
case 101:
delaycnt--;
if(delaycnt == 0) state = 102;
break;
case 200:
output_b(0b00000000);
output_b(0b00000001);
state++;
delaycnt = 10;
break;
case 201:
delaycnt--;
if(delaycnt == 0) state = 202;
break;
default:
state = 0; // do nothing
break;
}
}
void CheckButtons()
{
// Do button debounce here
if( BUTTON1 == 1)
state = 100;
if( BUTTON2 == 1)
state = 200;
}
void main()
{
//Setup timer here
while(1)
{
if( millisecond_flag == 1)
{
CheckButtons();
DoStateMachine();
millisecond_flag = 0;
}
//sleep device?
}
}
// Handle interrupt
void interrupt ISR()
{
if( TMR1IF == 1)
{
millisecond_flag = 1;
TMR1IF = 0;
}
}
您可以设置一个每毫秒触发一次的计时器,然后将代码重写为状态机。这样,您就不会在延迟例程中浪费cpu周期,并且您能够立即响应按钮按下,至少在一毫秒之内,这对用户来说是即时的
状态机跟踪变量。数字代表它所处的状态。每次执行一个状态时,该状态可能会改变。更改后的状态将在下次计时器触发时执行。每个触发器还检查按钮/去抖动等
确保您的代码在计时器周期内运行,因此不要使用任何延迟,而是使用状态机来执行延迟,或者如果您需要不同的分辨率/计时,则使用另一个计时器
我会让你来设置定时器和中断寄存器
/* global variables */
int state = 0;
unsigned char delaycnt = 0;
char millisecond_flag = 0;
void DoStateMachine()
{
switch( state )
{
case 100:
output_b(0b00000000);
output_b(0b00011000);
state++;
delaycnt = 10;
break;
case 101:
delaycnt--;
if(delaycnt == 0) state = 102;
break;
case 200:
output_b(0b00000000);
output_b(0b00000001);
state++;
delaycnt = 10;
break;
case 201:
delaycnt--;
if(delaycnt == 0) state = 202;
break;
default:
state = 0; // do nothing
break;
}
}
void CheckButtons()
{
// Do button debounce here
if( BUTTON1 == 1)
state = 100;
if( BUTTON2 == 1)
state = 200;
}
void main()
{
//Setup timer here
while(1)
{
if( millisecond_flag == 1)
{
CheckButtons();
DoStateMachine();
millisecond_flag = 0;
}
//sleep device?
}
}
// Handle interrupt
void interrupt ISR()
{
if( TMR1IF == 1)
{
millisecond_flag = 1;
TMR1IF = 0;
}
}
可以同时打开多个灯,还是一次只能打开一个灯?如果使用if/else分支而不是使用3个if语句,会发生什么情况?它是