Kyohritsu Digit LED SCREEN (MATRIX)
デジットのLEDスクリーン
共立電子産業「デジット」で売っているLEDスクリーンを光らせるプログラム。
LPC1768 のGPIOレジスタを直アクセスして高速化しています。
PWM 8階調制御していますが、変更するには58行目「pwm += 32;」のところをいじってください。
32×32 RGB LEDマトリックス (KP-3232D)
- モノは実際のLEDスクリーンに使われているモジュールと同じと思われる。
- LEDドライバは DP5020 が使われている。
- ライン選択は 74HC138 が使われている。
Diff: main.cpp
- Revision:
- 0:044357494bea
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Dec 02 01:51:46 2015 +0000 @@ -0,0 +1,91 @@ +#include "mbed.h" + +#define R0 (1<<0) // P2.0 (p26) +#define G0 (1<<1) // P2.1 (p25) +#define B0 (1<<2) // P2.2 (p24) +#define R1 (1<<3) // P2.3 (p23) +#define G1 (1<<4) // P2.4 (p22) +#define B1 (1<<5) // P2.5 (p21) +#define A (1<<4) // P0.4 (p30) +#define B (1<<5) // P0.5 (p29) +#define C (1<<10) // P0.10 (p28) +#define D (1<<11) // P0.11 (p27) +#define CLK (1<<24) // P0.24 (p16) +#define STB (1<<25) // P0.25 (p17) +#define OE (1<<26) // P0.26 (p18) + +#define P0_MASK (A|B|C|D|CLK|STB|OE) +#define P2_MASK (R0|G0|B0|R1|G1|B1) + +DigitalOut myled(LED1); + +uint32_t data[32][32]; +int line = 0, pwm = 0; + +void isrTimer () { + uint32_t p0, p2; + int i, rgb; + + LPC_GPIO0->FIOMASK = ~P0_MASK; + LPC_GPIO2->FIOMASK = ~P2_MASK; + + p0 = ((line << 8) & (C|D)) | ((line << 4) & (A|B)) | OE; + LPC_GPIO0->FIOPIN = p0; + + for (i = 0; i < 32; i ++) { + p2 = 0; + rgb = data[line][i]; + if ((rgb & 0xff) > pwm) p2 |= R0; + if (((rgb >> 8) & 0xff) > pwm) p2 |= G0; + if (((rgb >> 16) & 0xff) > pwm) p2 |= B0; + rgb = data[line + 16][i]; + if ((rgb & 0xff) > pwm) p2 |= R1; + if (((rgb >> 8) & 0xff) > pwm) p2 |= G1; + if (((rgb >> 16) & 0xff) > pwm) p2 |= B1; + LPC_GPIO2->FIOPIN = p2; + + p0 |= CLK; + LPC_GPIO0->FIOPIN = p0; + p0 &= ~CLK; + LPC_GPIO0->FIOPIN = p0; + } + + p0 |= STB; + LPC_GPIO0->FIOPIN = p0; + p0 &= ~(STB|OE); + LPC_GPIO0->FIOPIN = p0; + + pwm += 32; + if (pwm > 256) { + pwm = 0; + line ++; + if (line >= 16) { + line = 0; + } + } + + LPC_GPIO0->FIOMASK = 0; + LPC_GPIO2->FIOMASK = 0; +} + +int main() { + Ticker t; + int x, y, r, g, b; + + LPC_GPIO0->FIODIR = P0_MASK; + LPC_GPIO2->FIODIR = P2_MASK; + LPC_GPIO0->FIOSET = OE; + memset(data, 0, sizeof(data)); + + t.attach_us(&isrTimer, 50); + + for (;;) { + x = 32.0 * rand() / RAND_MAX; + y = 32.0 * rand() / RAND_MAX; + r = 255.0 * rand() / RAND_MAX; + g = 255.0 * rand() / RAND_MAX; + b = 255.0 * rand() / RAND_MAX; + data[y][x] = (b << 16) | (g << 8) | r; + wait_ms(5); + } +}