2013-02-26 2 views
2

저는 rainbowduino를 사용하고 있으며, 개별 rg b 값을 부호없는 문자로 사용하고 일부는 24 비트 rgb 색상 코드를 사용합니다. 이미 uint32_t 결과를 시도Arduino에서 uint32_t와 unsigned chars 사이를 변환합니다.

내가 형 uint32_t의 24 비트 색상 코드로 RGB 값을 변환 할 (내 모든 코드는 RGB 값을 사용할 수 있습니다 있도록.

어떤 아이디어?

= R < < 16 + g < < 8 + B; 200 B = 0 녹색 준 R = 100 g =하지만, R = 0 g = 200, B = 0 준 것도이 올릴 때 접근하는

Rb.setPixelXY(unsigned char x, unsigned char y, unsigned char colorR, unsigned char colorG, unsigned char colorB) 
This sets the pixel(x,y)by specifying each channel(color) with 8bit number. 

Rb.setPixelXY(unsigned char x, unsigned char y, unit32_t colorRGB) 
This sets the pixel(x,y)by specifying a 24bit RGB color code. 

답변

0

편도 LD는 드라이버 코드는

uint32_t result = r << 16 + g << 8 + b; 
+1

시도했는데 작동하지 않는 것 같습니다. 그 이유는 확실하지 않습니다. uint32_t 메소드에 0xFF0000을 주면 빨강, 0x00FF00 초록, 0x0000FF 파랑을 얻을 수 있지만 위 작업을 수행하지 않으면 효과가없는 것 같습니다. – holmeswatson

4

... 왼쪽으로 비트를 이동하는 :

void Rainbowduino::setPixelXY(unsigned char x, unsigned char y, uint32_t colorRGB /*24-bit RGB Color*/) 
{ 
    if(x > 7 || y > 7) 
    { 
    // Do nothing. 
    // This check is used to avoid writing to out-of-bound pixels by graphics function. 
    // But this might slow down setting pixels (remove this check if fast disply is desired) 
    } 
    else 
    { 
    colorRGB = (colorRGB & 0x00FFFFFF); 
    frameBuffer[0][x][y]=(colorRGB & 0x0000FF); //channel Blue 
    colorRGB = (colorRGB >> 8); 
    frameBuffer[1][x][y]=(colorRGB & 0x0000FF); //channel Green 
    colorRGB = (colorRGB >> 8); 
    frameBuffer[2][x][y]=(colorRGB & 0x0000FF); //channel Red 
    } 
} 

그래서 나는 위의 비슷한 생각 :

uint8_t x,y,r,b,g; 
uint32_t result = (r << 16) | (g << 8) | b; 
Rb.setPixelXY(x, y, result); 

작동합니다. 위의 내용은 "+"가 "< <"보다 높기 때문에 올바른 순서가되도록 괄호가 필요하다고 생각합니다. 또한 상처를 입히지 않을 것이지만 "|" 원하지 않는 캐리를 막지 않으려면 더 좋습니다.

P. 산술 이동과 논리 비교를 원하지 않는 한 부호없는 것으로 전환 할 때를 기억하십시오. 그리고 나는 종종 혼란스럽고 비효율적이어서 교대를 좋아하지 않는다. 오히려 노동 조합은 간단하고 효율적입니다.

union rgb { 
    uint32_t word; 
    uint8_t byte[3]; 
    struct { 
    uint8_t blue; 
    uint8_t green; 
    uint8_t red; 
    } color ; 
}rgb ; 

// one way to assign by discrete names. 
rbg.color.blue = b; 
rbg.color.green = g; 
rbg.color.red = r; 
//or assign using array 
rgb.byte[0] = b; 
rgb.byte[1] = g; 
rgb.byte[2] = r; 
// then interchangeably use the whole integer word when desired. 
Rb.setPixelXY(x, y, rgb.word); 

교대를 추적하는 데 방해가되지 않습니다.