Yihui Xiong
/
led_matrix
LED matrix library for http://goo.gl/y6VnO6.
Diff: main.cpp
- Revision:
- 0:43feb8b53696
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Nov 08 06:51:49 2013 +0000 @@ -0,0 +1,94 @@ +/** + * LED Matrix library for http://www.seeedstudio.com/depot/ultrathin-16x32-red-led-matrix-panel-p-1582.html + * The LED Matrix panel has 32x16 pixels. Several panel can be combined together as a large screen. + * + * Coordinate & Connection (mbed -> panel 0 -> panel 1 -> ...) + * (0, 0) (0, 0) + * +--------+--------+--------+ +--------+--------+ + * | 5 | 3 | 1 | | 1 | 0 | + * | | | | | | |<----- mbed + * +--------+--------+--------+ +--------+--------+ + * | 4 | 2 | 0 | (64, 16) + * | | | |<----- mbed + * +--------+--------+--------+ + * (96, 32) + * + */ + +#include "mbed.h" +#include "LEDMatrix.h" + +#define WIDTH 64 +#define HEIGHT 16 + +BusOut leds(LED1, LED2, LED3, LED4); + +// LEDMatrix(a, b, c, d, oe, r1, stb, clk); +LEDMatrix matrix(P1_18, P1_24, P1_25, P1_5, P1_26, P1_27, P0_2, P1_29); +Ticker scanner; + +// Display Buffer 128 = 64 * 16 / 8 +uint8_t displaybuf[WIDTH *HEIGHT / 8] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, + 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0xE0, 0x07, 0x8F, 0xC7, 0xC7, 0xC7, 0xE0, + 0x00, 0x40, 0x0C, 0xCE, 0x6C, 0x6C, 0x6C, 0xE0, 0x00, 0xE0, 0x0C, 0x0C, 0x6C, 0x6C, 0x6C, 0x60, + 0x01, 0xF0, 0x07, 0x8C, 0x6F, 0xEF, 0xEC, 0x60, 0x23, 0xF8, 0x00, 0xCC, 0x6C, 0x0C, 0x0C, 0x60, + 0x33, 0xF8, 0x0C, 0xCE, 0x6C, 0x6C, 0x6C, 0xE0, 0x3B, 0xF8, 0x07, 0x8F, 0xC7, 0xC7, 0xC7, 0xE0, + 0x3B, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +// 16 * 8 digital font +const uint8_t digitals[] = { + 0x00, 0x1C, 0x36, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00, // 0 + 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, // 1 + 0x00, 0x3E, 0x63, 0x63, 0x63, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x63, 0x7F, 0x00, 0x00, 0x00, 0x00, // 2 + 0x00, 0x3E, 0x63, 0x63, 0x06, 0x1C, 0x06, 0x03, 0x03, 0x63, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, // 3 + 0x00, 0x06, 0x0E, 0x1E, 0x36, 0x36, 0x66, 0x66, 0x7F, 0x06, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, // 4 + 0x00, 0x7F, 0x60, 0x60, 0x60, 0x7C, 0x76, 0x03, 0x03, 0x63, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, // 5 + 0x00, 0x1E, 0x36, 0x60, 0x60, 0x7C, 0x76, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00, // 6 + 0x00, 0x7F, 0x66, 0x66, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, // 7 + 0x00, 0x3E, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00, // 8 + 0x00, 0x1C, 0x36, 0x63, 0x63, 0x63, 0x37, 0x1F, 0x03, 0x03, 0x36, 0x3C, 0x00, 0x00, 0x00, 0x00, // 9 +}; + +// (x, y) top-left position, x should be multiple of 8 +void drawDigital(uint16_t x, uint16_t y, uint8_t n) +{ + if ((n >= 10) || (0 != (x % 8))) { + return; + } + + uint8_t *pDst = displaybuf + y * (WIDTH / 8) + x / 8; + const uint8_t *pSrc = digitals + n * 16; + for (uint8_t i = 0; i < 16; i++) { + *pDst = *pSrc; + pDst += WIDTH / 8; + pSrc++; + } +} + + +void scan() +{ + matrix.scan(); +} + +int main() { + matrix.begin(displaybuf, WIDTH, HEIGHT); + scanner.attach(scan, 0.001); + + wait(3); + matrix.clear(); + + uint8_t count = 0; + while(1) { + drawDigital(40, 0, count); + + leds = ~count; + wait(1); + count = (count + 1) & 0x7; + + } +}