1

我有一个涉及使用 3 色 LED 的 LED 模块的项目,可以通过传入 RGB 十六进制颜色来控制它,例如22AAFF

000000如果我从这个开始,我怎么能循环FFFFFF呢?

long color = 0x000000;

我想要一个循环来执行每次迭代并显示每种可能的颜色,最终得到

color = 0xFFFFFF

我不确定我对颜色的十六进制表示的理解是否有意义!?

4

3 回答 3

12

显而易见的有什么问题for (int color = 0x000000; color <= 0xFFFFFF; ++color)

于 2012-07-10T09:47:10.337 回答
6

你可以这样做

for (int color = 0x000000; color <= 0xFFFFFF; ++color)

但正如评论中提到的,这将需要很长时间才能显示所有 1600 万种颜色,更不用说 LED 无法显示所有这些颜色,所以你可能会想要这样的东西:

const int step = 8; // Select this to be a power of two if you want the maximum brightness to be reachable
for( int red = 0x00; red <= 0xFF; red += step ) {
    for( int green = 0x00; green <= 0xFF; green += step ) {
        for( int blue = 0x00; blue <= 0xFF; blue += step ) {
            const int color = blue << 16 + green << 8 + red;
            // Change the led settings here.
        }
    }
}  
于 2012-07-10T09:56:51.337 回答
4

我认为您不想循环遍历所有颜色,而是遍历 HSV(HSB) 颜色模型中的 HUE 通道。如果是这样,您可以搜索将 HSV 值转换为 RGB 的函数的实现。您的代码将如下所示:

for(int hue=0; hue<360; hue++)
    setColorHSV(hue,1,1);

您可以在此处找到一种可能的实现方式。

如果你不想打扰这个功能,你可以使用这个虚拟循环:

unsigned int i;
for(i = 0; i <= 0xFF; i++)
{
    rgb = 0xFF0000 | i<<8;  
    setLed(rgb);
}
while(--i > 0)
{
    rgb = 0x00FF00 | i<<16; 
    setLed(rgb);
}
for(i = 0; i <= 0xFF; i++)
{
    rgb = 0x00FF00 | i; 
    setLed(rgb);
}
while(--i > 0)
{
    rgb = 0x0000FF | i<<8;  
    setLed(rgb);
}
for(i = 0; i <= 0xFF; i++)
{
    rgb = 0x0000FF | i<<16; 
    setLed(rgb);
}
while(--i > 0)
{
    rgb = 0xFF0000 | i;
    setLed(rgb);
}

不幸的是,我无法对其进行测试,但我认为它应该可以正常工作。当然,您可以根据需要对其进行优化。

于 2012-07-10T10:49:43.860 回答