2 * LED Matrix library for http://www.seeedstudio.com/depot/ultrathin-16x32-red-led-matrix-panel-p-1582.html
3 * The LED Matrix panel has 32x16 pixels. Several panel can be combined together as a large screen.
5 * Coordinate & Connection (Arduino -> panel 0 -> panel 1 -> ...)
7 * +--------+--------+--------+ +--------+--------+
8 * | 5 | 4 | 3 | | 1 | 0 |
9 * | | | | | | |<----- Arduino
10 * +--------+--------+--------+ +--------+--------+
11 * | 2 | 1 | 0 | (64, 16)
12 * | | | |<----- Arduino
13 * +--------+--------+--------+
15 * Copyright (c) 2013 Seeed Technology Inc.
21 #include "LEDMatrix.h"
31 #define ASSERT(e) if (!(e)) { Serial.println(#e); while (1); }
36 LEDMatrix::LEDMatrix(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t oe, uint8_t r1, uint8_t stb, uint8_t clk)
54 void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
56 ASSERT(0 == (width % 32));
57 ASSERT(0 == (height % 16));
59 this->displaybuf = displaybuf;
61 this->height = height;
75 void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel)
80 uint8_t *byte = displaybuf + x / 8 + y * width / 8;
86 *byte &= ~(0x80 >> bit);
90 void LEDMatrix::drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel)
92 for (uint16_t x = x1; x < x2; x++) {
93 for (uint16_t y = y1; y < y2; y++) {
94 drawPoint(x, y, pixel);
99 void LEDMatrix::drawImage(uint16_t xoffset, uint16_t yoffset, uint16_t width, uint16_t height, const uint8_t *image)
101 for (uint16_t y = 0; y < height; y++) {
102 for (uint16_t x = 0; x < width; x++) {
103 const uint8_t *byte = image + (x + y * width) / 8;
104 uint8_t bit = 7 - x % 8;
105 uint8_t pixel = (*byte >> bit) & 1;
107 drawPoint(x + xoffset, y + yoffset, pixel);
112 void LEDMatrix::clear()
114 uint8_t *ptr = displaybuf;
115 for (uint16_t i = 0; i < (width * height / 8); i++) {
121 void LEDMatrix::reverse()
126 uint8_t LEDMatrix::isReversed()
131 void LEDMatrix::scan()
133 static uint8_t row = 0; // from 0 to 15
139 uint8_t *head = displaybuf + row * (width / 8);
140 for (uint8_t line = 0; line < (height / 16); line++) {
142 head += width * 2; // width * 16 / 8
144 for (uint8_t byte = 0; byte < (width / 8); byte++) {
145 uint8_t pixels = *ptr;
147 pixels = pixels ^ mask; // reverse: mask = 0xff, normal: mask =0x00
149 SPI.transfer(pixels);
151 for (uint8_t bit = 0; bit < 8; bit++) {
152 digitalWrite(clk, LOW);
153 digitalWrite(r1, pixels & (0x80 >> bit));
154 digitalWrite(clk, HIGH);
161 digitalWrite(a, (row & 0x01));
162 digitalWrite(b, (row & 0x02));
163 digitalWrite(c, (row & 0x04));
164 digitalWrite(d, (row & 0x08));
166 digitalWrite(oe, HIGH); // disable display
169 digitalWrite(stb, LOW);
170 digitalWrite(stb, HIGH);
171 digitalWrite(stb, LOW);
173 digitalWrite(oe, LOW); // enable display
175 row = (row + 1) & 0x0F;
183 void LEDMatrix::off()
186 digitalWrite(oe, HIGH);