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"
29 #define ASSERT(e) if (!(e)) { Serial.println(#e); while (1); }
34 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)
53 void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
55 ASSERT(0 == (width % 32));
56 ASSERT(0 == (height % 16));
58 this->displaybuf = displaybuf;
60 this->height = height;
74 void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel)
79 uint8_t *byte = displaybuf + x / 8 + y * width / 8;
85 *byte &= ~(0x80 >> bit);
89 void LEDMatrix::drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel)
91 for (uint16_t x = x1; x < x2; x++) {
92 for (uint16_t y = y1; y < y2; y++) {
93 drawPoint(x, y, pixel);
98 void LEDMatrix::drawImage(uint16_t xoffset, uint16_t yoffset, uint16_t width, uint16_t height, const uint8_t *image)
100 for (uint16_t y = 0; y < height; y++) {
101 for (uint16_t x = 0; x < width; x++) {
102 const uint8_t *byte = image + (x + y * width) / 8;
103 uint8_t bit = 7 - x % 8;
104 uint8_t pixel = (*byte >> bit) & 1;
106 drawPoint(x + xoffset, y + yoffset, pixel);
111 void LEDMatrix::clear()
113 uint8_t *ptr = displaybuf;
114 for (uint16_t i = 0; i < (width * height / 8); i++) {
120 void LEDMatrix::reverse()
125 uint8_t LEDMatrix::isReversed()
130 void LEDMatrix::scan()
132 static uint8_t row = 0; // from 0 to 15
138 uint8_t *head = displaybuf + row * (width / 8);
140 if ( buffer ) head += (width/8) * height;
142 for (uint8_t line = 0; line < (height / 16); line++) {
144 head += width * 2; // width * 16 / 8
146 for (uint8_t byte = 0; byte < (width / 8); byte++) {
147 uint8_t pixels = *ptr;
149 pixels = pixels ^ mask; // reverse: mask = 0xff, normal: mask =0x00
151 SPI.transfer(pixels);
153 for (uint8_t bit = 0; bit < 8; bit++) {
154 digitalWrite(clk, LOW);
155 digitalWrite(r1, pixels & (0x80 >> bit));
156 digitalWrite(clk, HIGH);
162 digitalWrite(oe, HIGH); // disable display
165 digitalWrite(a, (row & 0x01));
166 digitalWrite(b, (row & 0x02));
167 digitalWrite(c, (row & 0x04));
168 digitalWrite(d, (row & 0x08));
171 digitalWrite(stb, LOW);
172 digitalWrite(stb, HIGH);
173 digitalWrite(stb, LOW);
175 digitalWrite(oe, LOW); // enable display
177 row = (row + 1) & 0x0F;
180 uint8_t *LEDMatrix::offscreen_buffer()
182 uint8_t *buff = displaybuf;
183 if ( ! buffer ) buff += (width/8) * height;
187 void LEDMatrix::swap()
197 void LEDMatrix::off()
200 digitalWrite(oe, HIGH);