Forked LEDMatrix and added horizontal scrolling
Fork of LEDMatrix by
Revision 0:13728deac7a7, committed 2013-11-08
- Comitter:
- yihui
- Date:
- Fri Nov 08 06:45:52 2013 +0000
- Child:
- 1:79cf2e115449
- 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
