Forked LEDMatrix and added horizontal scrolling

Fork of LEDMatrix by Yihui Xiong

Revision:
0:13728deac7a7
Child:
1:79cf2e115449
--- /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;
+}
+