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 が使われている。
Committer:
okini3939
Date:
Wed Dec 02 01:51:46 2015 +0000
Revision:
0:044357494bea
1st build;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:044357494bea 1 #include "mbed.h"
okini3939 0:044357494bea 2
okini3939 0:044357494bea 3 #define R0 (1<<0) // P2.0 (p26)
okini3939 0:044357494bea 4 #define G0 (1<<1) // P2.1 (p25)
okini3939 0:044357494bea 5 #define B0 (1<<2) // P2.2 (p24)
okini3939 0:044357494bea 6 #define R1 (1<<3) // P2.3 (p23)
okini3939 0:044357494bea 7 #define G1 (1<<4) // P2.4 (p22)
okini3939 0:044357494bea 8 #define B1 (1<<5) // P2.5 (p21)
okini3939 0:044357494bea 9 #define A (1<<4) // P0.4 (p30)
okini3939 0:044357494bea 10 #define B (1<<5) // P0.5 (p29)
okini3939 0:044357494bea 11 #define C (1<<10) // P0.10 (p28)
okini3939 0:044357494bea 12 #define D (1<<11) // P0.11 (p27)
okini3939 0:044357494bea 13 #define CLK (1<<24) // P0.24 (p16)
okini3939 0:044357494bea 14 #define STB (1<<25) // P0.25 (p17)
okini3939 0:044357494bea 15 #define OE (1<<26) // P0.26 (p18)
okini3939 0:044357494bea 16
okini3939 0:044357494bea 17 #define P0_MASK (A|B|C|D|CLK|STB|OE)
okini3939 0:044357494bea 18 #define P2_MASK (R0|G0|B0|R1|G1|B1)
okini3939 0:044357494bea 19
okini3939 0:044357494bea 20 DigitalOut myled(LED1);
okini3939 0:044357494bea 21
okini3939 0:044357494bea 22 uint32_t data[32][32];
okini3939 0:044357494bea 23 int line = 0, pwm = 0;
okini3939 0:044357494bea 24
okini3939 0:044357494bea 25 void isrTimer () {
okini3939 0:044357494bea 26 uint32_t p0, p2;
okini3939 0:044357494bea 27 int i, rgb;
okini3939 0:044357494bea 28
okini3939 0:044357494bea 29 LPC_GPIO0->FIOMASK = ~P0_MASK;
okini3939 0:044357494bea 30 LPC_GPIO2->FIOMASK = ~P2_MASK;
okini3939 0:044357494bea 31
okini3939 0:044357494bea 32 p0 = ((line << 8) & (C|D)) | ((line << 4) & (A|B)) | OE;
okini3939 0:044357494bea 33 LPC_GPIO0->FIOPIN = p0;
okini3939 0:044357494bea 34
okini3939 0:044357494bea 35 for (i = 0; i < 32; i ++) {
okini3939 0:044357494bea 36 p2 = 0;
okini3939 0:044357494bea 37 rgb = data[line][i];
okini3939 0:044357494bea 38 if ((rgb & 0xff) > pwm) p2 |= R0;
okini3939 0:044357494bea 39 if (((rgb >> 8) & 0xff) > pwm) p2 |= G0;
okini3939 0:044357494bea 40 if (((rgb >> 16) & 0xff) > pwm) p2 |= B0;
okini3939 0:044357494bea 41 rgb = data[line + 16][i];
okini3939 0:044357494bea 42 if ((rgb & 0xff) > pwm) p2 |= R1;
okini3939 0:044357494bea 43 if (((rgb >> 8) & 0xff) > pwm) p2 |= G1;
okini3939 0:044357494bea 44 if (((rgb >> 16) & 0xff) > pwm) p2 |= B1;
okini3939 0:044357494bea 45 LPC_GPIO2->FIOPIN = p2;
okini3939 0:044357494bea 46
okini3939 0:044357494bea 47 p0 |= CLK;
okini3939 0:044357494bea 48 LPC_GPIO0->FIOPIN = p0;
okini3939 0:044357494bea 49 p0 &= ~CLK;
okini3939 0:044357494bea 50 LPC_GPIO0->FIOPIN = p0;
okini3939 0:044357494bea 51 }
okini3939 0:044357494bea 52
okini3939 0:044357494bea 53 p0 |= STB;
okini3939 0:044357494bea 54 LPC_GPIO0->FIOPIN = p0;
okini3939 0:044357494bea 55 p0 &= ~(STB|OE);
okini3939 0:044357494bea 56 LPC_GPIO0->FIOPIN = p0;
okini3939 0:044357494bea 57
okini3939 0:044357494bea 58 pwm += 32;
okini3939 0:044357494bea 59 if (pwm > 256) {
okini3939 0:044357494bea 60 pwm = 0;
okini3939 0:044357494bea 61 line ++;
okini3939 0:044357494bea 62 if (line >= 16) {
okini3939 0:044357494bea 63 line = 0;
okini3939 0:044357494bea 64 }
okini3939 0:044357494bea 65 }
okini3939 0:044357494bea 66
okini3939 0:044357494bea 67 LPC_GPIO0->FIOMASK = 0;
okini3939 0:044357494bea 68 LPC_GPIO2->FIOMASK = 0;
okini3939 0:044357494bea 69 }
okini3939 0:044357494bea 70
okini3939 0:044357494bea 71 int main() {
okini3939 0:044357494bea 72 Ticker t;
okini3939 0:044357494bea 73 int x, y, r, g, b;
okini3939 0:044357494bea 74
okini3939 0:044357494bea 75 LPC_GPIO0->FIODIR = P0_MASK;
okini3939 0:044357494bea 76 LPC_GPIO2->FIODIR = P2_MASK;
okini3939 0:044357494bea 77 LPC_GPIO0->FIOSET = OE;
okini3939 0:044357494bea 78 memset(data, 0, sizeof(data));
okini3939 0:044357494bea 79
okini3939 0:044357494bea 80 t.attach_us(&isrTimer, 50);
okini3939 0:044357494bea 81
okini3939 0:044357494bea 82 for (;;) {
okini3939 0:044357494bea 83 x = 32.0 * rand() / RAND_MAX;
okini3939 0:044357494bea 84 y = 32.0 * rand() / RAND_MAX;
okini3939 0:044357494bea 85 r = 255.0 * rand() / RAND_MAX;
okini3939 0:044357494bea 86 g = 255.0 * rand() / RAND_MAX;
okini3939 0:044357494bea 87 b = 255.0 * rand() / RAND_MAX;
okini3939 0:044357494bea 88 data[y][x] = (b << 16) | (g << 8) | r;
okini3939 0:044357494bea 89 wait_ms(5);
okini3939 0:044357494bea 90 }
okini3939 0:044357494bea 91 }