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)
52 void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
54 ASSERT(0 == (width % 32));
55 ASSERT(0 == (height % 16));
57 this->displaybuf = displaybuf;
59 this->height = height;
73 void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel)
78 uint8_t *byte = displaybuf + x / 8 + y * width / 8;
84 *byte &= ~(0x80 >> bit);
88 void LEDMatrix::drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel)
90 for (uint16_t x = x1; x < x2; x++) {
91 for (uint16_t y = y1; y < y2; y++) {
92 drawPoint(x, y, pixel);
97 void LEDMatrix::drawImage(uint16_t xoffset, uint16_t yoffset, uint16_t width, uint16_t height, const uint8_t *image)
99 for (uint16_t y = 0; y < height; y++) {
100 for (uint16_t x = 0; x < width; x++) {
101 const uint8_t *byte = image + (x + y * width) / 8;
102 uint8_t bit = 7 - x % 8;
103 uint8_t pixel = (*byte >> bit) & 1;
105 drawPoint(x + xoffset, y + yoffset, pixel);
110 void LEDMatrix::clear()
112 uint8_t *ptr = displaybuf;
113 for (uint16_t i = 0; i < (width * height / 8); i++) {
119 void LEDMatrix::reverse()
124 uint8_t LEDMatrix::isReversed()
129 void LEDMatrix::scan()
131 static uint8_t row = 0; // from 0 to 15
137 uint8_t *head = displaybuf + row * (width / 8);
138 for (uint8_t line = 0; line < (height / 16); line++) {
140 head += width * 2; // width * 16 / 8
142 for (uint8_t byte = 0; byte < (width / 8); byte++) {
143 uint8_t pixels = *ptr;
145 pixels = pixels ^ mask; // reverse: mask = 0xff, normal: mask =0x00
147 SPI.transfer(pixels);
149 for (uint8_t bit = 0; bit < 8; bit++) {
150 digitalWrite(clk, LOW);
151 digitalWrite(r1, pixels & (0x80 >> bit));
152 digitalWrite(clk, HIGH);
159 digitalWrite(a, (row & 0x01));
160 digitalWrite(b, (row & 0x02));
161 digitalWrite(c, (row & 0x04));
162 digitalWrite(d, (row & 0x08));
164 digitalWrite(oe, HIGH); // disable display
167 digitalWrite(stb, LOW);
168 digitalWrite(stb, HIGH);
169 digitalWrite(stb, LOW);
171 digitalWrite(oe, LOW); // enable display
173 row = (row + 1) & 0x0F;
181 void LEDMatrix::off()
184 digitalWrite(oe, HIGH);