LED matrix library for http://goo.gl/y6VnO6

Dependents:   led_matrix

Files at this revision

API Documentation at this revision

Comitter:
yihui
Date:
Fri Nov 08 06:45:52 2013 +0000
Child:
1:b528f8e32726
Commit message:
initial

Changed in this revision

LEDMatrix.cpp Show annotated file Show diff for this revision Revisions of this file
LEDMatrix.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LEDMatrix.cpp	Fri Nov 08 06:45:52 2013 +0000
@@ -0,0 +1,168 @@
+/**
+ * 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)
+ *  Copyright (c) 2013 Seeed Technology Inc.
+ *  @auther     Yihui Xiong
+ *  @date       Nov 8, 2013
+ *  @license    Apache
+ */
+
+#include "LEDMatrix.h"
+#include "mbed.h"
+
+#if 0
+#define ASSERT(e)   if (!(e)) { Serial.println(#e); while (1); }
+#else
+#define ASSERT(e)
+#endif
+
+LEDMatrix::LEDMatrix(PinName pinA, PinName pinB, PinName pinC, PinName pinD, PinName pinOE, PinName pinR1, PinName pinSTB, PinName pinCLK) :
+        a(pinA), b(pinB), c(pinC), d(pinD), oe(pinOE), r1(pinR1), stb(pinSTB), clk(pinCLK)
+{
+    this->clk = clk;
+    this->r1 = r1;
+    this->stb = stb;
+    this->oe = oe;
+    this->a = a;
+    this->b = b;
+    this->c = c;
+    this->d = d;
+
+    mask = 0xff;
+    state = 0;
+}
+
+void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
+{
+    ASSERT(0 == (width % 32));
+    ASSERT(0 == (height % 16));
+
+    this->displaybuf = displaybuf;
+    this->width = width;
+    this->height = height;
+    
+    state = 1;
+}
+
+void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel)
+{
+    ASSERT(width > x);
+    ASSERT(height > y);
+
+    uint8_t *byte = displaybuf + x * 8 + y / 8;
+    uint8_t  bit = y % 8;
+
+    if (pixel) {
+        *byte |= 0x80 >> bit;
+    } else {
+        *byte &= ~(0x80 >> bit);
+    }
+}
+
+void LEDMatrix::drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel)
+{
+    for (uint16_t x = x1; x < x2; x++) {
+        for (uint16_t y = y1; y < y2; y++) {
+            drawPoint(x, y, pixel);
+        }
+    }
+}
+
+void LEDMatrix::drawImage(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t *image)
+{
+    ASSERT(0 == ((x2 - x1) % 8));
+
+    for (uint16_t x = x1; x < x2; x++) {
+        for (uint16_t y = y1; y < y2; y++) {
+            uint8_t *byte = image + x * 8 + y / 8;
+            uint8_t  bit = 7 - (y % 8);
+            uint8_t  pixel = (*byte >> bit) & 1;
+
+            drawPoint(x, y, pixel);
+        }
+    }
+}
+
+void LEDMatrix::clear()
+{
+    uint8_t *ptr = displaybuf;
+    for (uint16_t i = 0; i < (width * height / 8); i++) {
+        *ptr = 0x00;
+        ptr++;
+    }
+}
+
+void LEDMatrix::reverse()
+{
+    mask = ~mask;
+}
+
+uint8_t LEDMatrix::isReversed()
+{
+    return mask;
+}
+
+void LEDMatrix::scan()
+{
+    static uint8_t row = 0;
+
+    if (!state) {
+        return;
+    }
+
+    uint8_t *head = displaybuf + row * (width / 8);
+    for (uint8_t line = 0; line < (height / 16); line++) {
+        uint8_t *ptr = head;
+        head += line * width * 2;
+
+        for (uint8_t byte = 0; byte < (width / 8); byte++) {
+            uint8_t pixels = *ptr;
+            ptr++;
+            pixels = pixels ^ mask;   // reverse: mask = 0xff, normal: mask =0x00 
+            for (uint8_t bit = 0; bit < 8; bit++) {
+                clk = 0;
+                r1 = pixels & (0x80 >> bit);
+                clk = 1;
+            }
+        }
+    }
+
+    oe = 1;              // disable display
+
+    // select row
+    a = (row & 0x01);
+    b = (row & 0x02);
+    c = (row & 0x04);
+    d = (row & 0x08);
+
+    // latch data
+    stb = 0;
+    stb = 1;
+
+    oe = 0;              // enable display
+
+    row = (row + 1) & 0x0F;
+}
+
+void LEDMatrix::on()
+{
+    state = 1;
+}
+
+void LEDMatrix::off()
+{
+    state = 0;
+    oe = 1;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LEDMatrix.h	Fri Nov 08 06:45:52 2013 +0000
@@ -0,0 +1,89 @@
+/**
+ * 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)
+ *  Copyright (c) 2013 Seeed Technology Inc.
+ *  @auther     Yihui Xiong
+ *  @date       Nov 7, 2013
+ *  @license    Apache
+ */
+
+
+#ifndef __LED_MATRIX_H__
+#define __LED_MATRIX_H__
+
+#include "mbed.h"
+
+class LEDMatrix {
+public:
+    LEDMatrix(PinName pinA, PinName pinB, PinName pinC, PinName pinD, PinName pinOE, PinName pinR1, PinName pinSTB, PinName pinCLK);
+    
+    /**
+     * set the display's display buffer and number, the buffer's size must be not less than 512 * number / 8 bytes
+     * @param displaybuf    display buffer
+     * @param number        panels' number
+     */
+    void begin(uint8_t *displaybuf, uint16_t width, uint16_t height);
+
+    /**
+     * draw a point
+     * @param x     x
+     * @param y     y
+     * @param pixel 0: led off, >0: led on
+     */
+    void drawPoint(uint16_t x, uint16_t y, uint8_t pixel);
+
+    /**
+     * draw a rect
+     * @param (x1, y1)   top-left position
+     * @param (x2, y2)   bottom-right position, not included in the rect
+     * @param pixel      0: rect off, >0: rect on
+     */
+    void drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel);
+
+    /**
+     * draw a image
+     * @param (x1, y1)   top-left position
+     * @param (x2, y2)   bottom-right position, not included in the rect
+     * @param pixels     contents, 1 bit to 1 led
+     */
+    void drawImage(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t *image);
+
+    /**
+     * Set screen buffer to zero
+     */
+    void clear();
+
+    /**
+     * turn off 1/16 leds and turn on another 1/16 leds
+     */
+    void scan();
+
+    void reverse();
+
+    uint8_t isReversed();
+
+    void on();
+
+    void off();
+
+private:
+    DigitalOut a, b, c, d, oe, r1, stb, clk;
+    uint8_t *displaybuf;
+    uint16_t width;
+    uint16_t height;
+    uint8_t  mask;
+    uint8_t  state;
+};
+
+#endif