Forked LEDMatrix and added horizontal scrolling
Fork of LEDMatrix by
Diff: LEDMatrix.cpp
- 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;
+}
+
