Kyohritsu Digit LED SCREEN (MATRIX)
デジットのLEDスクリーン
共立電子産業「デジット」で売っているLEDスクリーンを光らせるプログラム。
LPC1768 のGPIOレジスタを直アクセスして高速化しています。
PWM 8階調制御していますが、変更するには58行目「pwm += 32;」のところをいじってください。
32×32 RGB LEDマトリックス (KP-3232D)
- モノは実際のLEDスクリーンに使われているモジュールと同じと思われる。
- LEDドライバは DP5020 が使われている。
- ライン選択は 74HC138 が使われている。
main.cpp@0:044357494bea, 2015-12-02 (annotated)
- Committer:
- okini3939
- Date:
- Wed Dec 02 01:51:46 2015 +0000
- Revision:
- 0:044357494bea
1st build;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |