如何在C语言中通过循环更改对象名称?

如何在C语言中通过循环更改对象名称?,c,C,如何通过循环更改对象名称 我想创造一个像骑士一样的灯光效果。带着一张照片 我想用一个循环来改变RB线号,而不是手动打开和关闭 我想更改此端口线名称的最后一个编号:like RB01 RB02 like this for(int i = 0; i>6 ; i++ ){ PORTB = 0X00; RB+i = 1; } 我的代码是这样的 for(int i = 0; i>6 ; i++ ){ PORTB = 0X00; RB+i = 1; } 有什么方法可以做这样的事情吗?

如何通过循环更改对象名称

我想创造一个像骑士一样的灯光效果。带着一张照片

我想用一个循环来改变RB线号,而不是手动打开和关闭

我想更改此端口线名称的最后一个编号:like RB01 RB02 like this

for(int i = 0; i>6 ; i++ ){

PORTB = 0X00;
RB+i = 1;

}
我的代码是这样的

for(int i = 0; i>6 ; i++ ){

PORTB = 0X00;
RB+i = 1;

}

有什么方法可以做这样的事情吗?谢谢

不,没有办法以这种方式“生成”符号名称。您可以使用位掩码来操作相关端口的锁存寄存器。

否,无法通过这种方式“生成”符号名称。您可以使用位掩码来操作相关端口的锁存寄存器。

这不是很优雅,但一种方法是这样做:

PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i == 0);
    RB01 = (i == 1);
    RB02 = (i == 2);
    RB03 = (i == 3);
    RB04 = (i == 4);
    RB05 = (i == 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i >= 0);
    RB01 = (i >= 1);
    RB02 = (i >= 2);
    RB03 = (i >= 3);
    RB04 = (i >= 4);
    RB05 = (i >= 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB=0x00;
对于(i=0;i<6;++i)
{
RB00=(i==0);
RB01=(i==1);
RB02=(i==2);
RB03=(i==3);
RB04=(i==4);
RB05=(i==5);
//注意:您可能希望在此处设置延迟,例如200毫秒
}
如果您想在每次打开新的指示灯时保持以前的指示灯亮起,则可以这样做:

PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i == 0);
    RB01 = (i == 1);
    RB02 = (i == 2);
    RB03 = (i == 3);
    RB04 = (i == 4);
    RB05 = (i == 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i >= 0);
    RB01 = (i >= 1);
    RB02 = (i >= 2);
    RB03 = (i >= 3);
    RB04 = (i >= 4);
    RB05 = (i >= 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB=0x00;
对于(i=0;i<6;++i)
{
RB00=(i>=0);
RB01=(i>=1);
RB02=(i>=2);
RB03=(i>=3);
RB04=(i>=4);
RB05=(i>=5);
//注意:您可能希望在此处设置延迟,例如200毫秒
}

它不是很优雅,但一种方法是这样做:

PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i == 0);
    RB01 = (i == 1);
    RB02 = (i == 2);
    RB03 = (i == 3);
    RB04 = (i == 4);
    RB05 = (i == 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i >= 0);
    RB01 = (i >= 1);
    RB02 = (i >= 2);
    RB03 = (i >= 3);
    RB04 = (i >= 4);
    RB05 = (i >= 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB=0x00;
对于(i=0;i<6;++i)
{
RB00=(i==0);
RB01=(i==1);
RB02=(i==2);
RB03=(i==3);
RB04=(i==4);
RB05=(i==5);
//注意:您可能希望在此处设置延迟,例如200毫秒
}
如果您想在每次打开新的指示灯时保持以前的指示灯亮起,则可以这样做:

PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i == 0);
    RB01 = (i == 1);
    RB02 = (i == 2);
    RB03 = (i == 3);
    RB04 = (i == 4);
    RB05 = (i == 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB = 0x00;
for (i = 0; i < 6; ++i)
{
    RB00 = (i >= 0);
    RB01 = (i >= 1);
    RB02 = (i >= 2);
    RB03 = (i >= 3);
    RB04 = (i >= 4);
    RB05 = (i >= 5);
    // note: you probably want to put a delay in here, e.g. 200 ms
}
PORTB=0x00;
对于(i=0;i<6;++i)
{
RB00=(i>=0);
RB01=(i>=1);
RB02=(i>=2);
RB03=(i>=3);
RB04=(i>=4);
RB05=(i>=5);
//注意:您可能希望在此处设置延迟,例如200毫秒
}

假设
RB01
RB02
等都很方便
#定义访问
PORTB
中位的
s,您可以使用位算术编写循环,而不必使用
RB0*

for ( int i = 0; i != 6; ++ i ) {
    PORTB = 1 << i; /* one light at a time */
    /* or */
    PORTB = ( 1 << i + 1 ) - 1; /* light all in sequence */
}
for(int i=0;i!=6;++i){

PORTB=1假设
RB01
RB02
等都很方便
#定义访问
PORTB
中位的
s,您可以使用位算术编写循环,而不必使用
RB0*

for ( int i = 0; i != 6; ++ i ) {
    PORTB = 1 << i; /* one light at a time */
    /* or */
    PORTB = ( 1 << i + 1 ) - 1; /* light all in sequence */
}
for(int i=0;i!=6;++i){

PORTB=1我可能会使用一个表:

struct portbits
{
   sometype bit;   // Not quite sure what "RB0..RB5" actually translate to. 
};

struct portbits bits[] =
{
   RB00, 
   RB01, 
   RB02, 
   RB03, 
   RB04, 
   RB05, 
   RB06, 
   RB07, 
};

for(i = 0; i < 7; i++)
{
   bits[i] = 1; 
}
struct端口位
{
sometype bit;//不太确定“RB0..RB5”实际翻译成什么。
};
结构端口位[]=
{
RB00,
RB01,
RB02,
RB03,
RB04,
RB05,
RB06,
RB07,
};
对于(i=0;i<7;i++)
{
位[i]=1;
}

我可能会使用一个表:

struct portbits
{
   sometype bit;   // Not quite sure what "RB0..RB5" actually translate to. 
};

struct portbits bits[] =
{
   RB00, 
   RB01, 
   RB02, 
   RB03, 
   RB04, 
   RB05, 
   RB06, 
   RB07, 
};

for(i = 0; i < 7; i++)
{
   bits[i] = 1; 
}
struct端口位
{
sometype bit;//不太确定“RB0..RB5”实际翻译成什么。
};
结构端口位[]=
{
RB00,
RB01,
RB02,
RB03,
RB04,
RB05,
RB06,
RB07,
};
对于(i=0;i<7;i++)
{
位[i]=1;
}

大多数MCU I/O都是通过逐位操作完成的。你不能用C来完成。我更熟悉AVR Win32 C库,但我相信PIC也是类似的。头文件中应该有#定义,你可以查看。@LeorA这些语句是正确的,但不一致。你可以通过使用逐位操作来完全满足他的要求。你可以使用C不能通过重命名
for
循环中的标识符来完成此操作,但这并不重要,因为按位操作非常简单。(不过,为了便于讨论,可以通过重命名预处理器循环中的标识符来完成。)+《骑士1》。简单的工程和营销天才。大多数MCU I/O都是通过位操作完成的。你不能用C来完成。我更熟悉AVR Win32 C库,但我相信PIC是类似的。头文件中应该有#定义,你可以在某个地方查看。@LeorA这些语句是正确的,但不一致。你完全可以做到他所要求的是使用位操作。你不能通过在
for
循环中重命名标识符来实现,但这并不重要,因为位操作非常简单。(不过,为了便于讨论,你可以通过在预处理器循环中重命名标识符来实现。)+《骑士1》。简单的工程和营销天才。我可以想象会出现否决票,因为这样的代码无助于提问者提高其微控制器编程技能。这只是大量的白白编写工作。正如Potatoswatter在上面的评论中所说,按位操作是实现这一点的方法。只因为它有效,它就有效不一定是对的;-)这取决于你所说的“对”是什么意思;-)OP显然是一个完全的初学者,所以简单易懂且有效的东西可能是“对的”在这种情况下。按位运算可以等待第2课……是的,必须同意Paul的观点。我主要写了我的答案来支持我的评论,以利Leor的利益。@PaulR我不同意,因为你的解决方案只是让循环变得荒谬。为什么要教初学者这样的想法?-如果你用E按顺序等待,只使用循环来重复序列。但无论如何,这是另一个讨论。@ Juix认为,循环可能会演变成MCU的主要任务循环,事件处理等,并认为,在商业产品中,您可能不会奢望假定位将被理想地放置,作为电路板布局。而I/O引脚限制可能会决定它们被重新排列,可能是在软件“完成”之后。Paul所写的实际上是相当合理和专业的。我可以想象会出现否决票,因为这样的代码不会帮助提问者改进他的微控制器pr