Kyohritsu Digit LED SCREEN (MATRIX)

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 #define R0 (1<<0) // P2.0 (p26)
00004 #define G0 (1<<1) // P2.1 (p25)
00005 #define B0 (1<<2) // P2.2 (p24)
00006 #define R1 (1<<3) // P2.3 (p23)
00007 #define G1 (1<<4) // P2.4 (p22)
00008 #define B1 (1<<5) // P2.5 (p21)
00009 #define A  (1<<4) // P0.4 (p30)
00010 #define B  (1<<5) // P0.5 (p29)
00011 #define C  (1<<10) // P0.10 (p28)
00012 #define D  (1<<11) // P0.11 (p27)
00013 #define CLK (1<<24) // P0.24 (p16)
00014 #define STB (1<<25) // P0.25 (p17)
00015 #define OE  (1<<26) // P0.26 (p18)
00016 
00017 #define P0_MASK (A|B|C|D|CLK|STB|OE)
00018 #define P2_MASK (R0|G0|B0|R1|G1|B1)
00019 
00020 DigitalOut myled(LED1);
00021 
00022 uint32_t data[32][32];
00023 int line = 0, pwm = 0;
00024 
00025 void isrTimer () {
00026     uint32_t p0, p2;
00027     int i, rgb;
00028 
00029     LPC_GPIO0->FIOMASK = ~P0_MASK;
00030     LPC_GPIO2->FIOMASK = ~P2_MASK;
00031 
00032     p0 = ((line << 8) & (C|D)) | ((line << 4) & (A|B)) | OE;
00033     LPC_GPIO0->FIOPIN = p0;
00034 
00035     for (i = 0; i < 32; i ++) {
00036         p2 = 0;
00037         rgb = data[line][i];
00038         if ((rgb         & 0xff) > pwm) p2 |= R0;
00039         if (((rgb >>  8) & 0xff) > pwm) p2 |= G0;
00040         if (((rgb >> 16) & 0xff) > pwm) p2 |= B0;
00041         rgb = data[line + 16][i];
00042         if ((rgb         & 0xff) > pwm) p2 |= R1;
00043         if (((rgb >>  8) & 0xff) > pwm) p2 |= G1;
00044         if (((rgb >> 16) & 0xff) > pwm) p2 |= B1;
00045         LPC_GPIO2->FIOPIN = p2;
00046 
00047         p0 |= CLK;
00048         LPC_GPIO0->FIOPIN = p0;
00049         p0 &= ~CLK;
00050         LPC_GPIO0->FIOPIN = p0;
00051     }
00052 
00053     p0 |= STB;
00054     LPC_GPIO0->FIOPIN = p0;
00055     p0 &= ~(STB|OE);
00056     LPC_GPIO0->FIOPIN = p0;
00057 
00058     pwm += 32;
00059     if (pwm > 256) {
00060         pwm = 0;
00061         line ++;
00062         if (line >= 16) {
00063             line = 0;
00064         }
00065     }
00066 
00067     LPC_GPIO0->FIOMASK = 0;
00068     LPC_GPIO2->FIOMASK = 0;
00069 }
00070 
00071 int main() {
00072     Ticker t;
00073     int x, y, r, g, b;
00074 
00075     LPC_GPIO0->FIODIR = P0_MASK;
00076     LPC_GPIO2->FIODIR = P2_MASK;
00077     LPC_GPIO0->FIOSET = OE;
00078     memset(data, 0, sizeof(data));
00079 
00080     t.attach_us(&isrTimer, 50);
00081 
00082     for (;;) {
00083         x = 32.0 * rand() / RAND_MAX;
00084         y = 32.0 * rand() / RAND_MAX;
00085         r = 255.0 * rand() / RAND_MAX;
00086         g = 255.0 * rand() / RAND_MAX;
00087         b = 255.0 * rand() / RAND_MAX;
00088         data[y][x] = (b << 16) | (g << 8) | r;
00089         wait_ms(5);
00090     }
00091 }