Kyohritsu Digit LED SCREEN (MATRIX)

Dependencies:   mbed

デジットのLEDスクリーン

共立電子産業「デジット」で売っているLEDスクリーンを光らせるプログラム。

LPC1768 のGPIOレジスタを直アクセスして高速化しています。
PWM 8階調制御していますが、変更するには58行目「pwm += 32;」のところをいじってください。


32×32 RGB LEDマトリックス (KP-3232D)

  • モノは実際のLEDスクリーンに使われているモジュールと同じと思われる。
  • LEDドライバは DP5020 が使われている。
  • ライン選択は 74HC138 が使われている。

main.cpp

Committer:
okini3939
Date:
2015-12-02
Revision:
0:044357494bea

File content as of revision 0:044357494bea:

#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);
    }
}