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"
25 #define ASSERT(e) if (!(e)) { Serial.println(#e); while (1); }
30 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)
45 void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
47 ASSERT(0 == (width % 32));
48 ASSERT(0 == (height % 16));
50 this->displaybuf = displaybuf;
52 this->height = height;
66 void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel)
71 uint8_t *byte = displaybuf + x / 8 + y * width / 8;
77 *byte &= ~(0x80 >> bit);
81 void LEDMatrix::drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel)
83 for (uint16_t x = x1; x < x2; x++) {
84 for (uint16_t y = y1; y < y2; y++) {
85 drawPoint(x, y, pixel);
90 void LEDMatrix::drawImage(uint16_t xoffset, uint16_t yoffset, uint16_t width, uint16_t height, const uint8_t *image)
92 for (uint16_t y = 0; y < height; y++) {
93 for (uint16_t x = 0; x < width; x++) {
94 const uint8_t *byte = image + (x + y * width) / 8;
95 uint8_t bit = 7 - x % 8;
96 uint8_t pixel = (*byte >> bit) & 1;
98 drawPoint(x + xoffset, y + yoffset, pixel);
103 void LEDMatrix::clear()
105 uint8_t *ptr = displaybuf;
106 for (uint16_t i = 0; i < (width * height / 8); i++) {
112 void LEDMatrix::reverse()
117 uint8_t LEDMatrix::isReversed()
122 void LEDMatrix::scan()
124 static uint8_t row = 0; // from 0 to 15
130 uint8_t *head = displaybuf + row * (width / 8);
131 for (uint8_t line = 0; line < (height / 16); line++) {
133 head += width * 2; // width * 16 / 8
135 for (uint8_t byte = 0; byte < (width / 8); byte++) {
136 uint8_t pixels = *ptr;
138 pixels = pixels ^ mask; // reverse: mask = 0xff, normal: mask =0x00
139 for (uint8_t bit = 0; bit < 8; bit++) {
140 digitalWrite(clk, LOW);
141 digitalWrite(r1, pixels & (0x80 >> bit));
142 digitalWrite(clk, HIGH);
147 digitalWrite(oe, HIGH); // disable display
150 digitalWrite(a, (row & 0x01));
151 digitalWrite(b, (row & 0x02));
152 digitalWrite(c, (row & 0x04));
153 digitalWrite(d, (row & 0x08));
156 digitalWrite(stb, LOW);
157 digitalWrite(stb, HIGH);
158 digitalWrite(stb, LOW);
160 digitalWrite(oe, LOW); // enable display
162 row = (row + 1) & 0x0F;
170 void LEDMatrix::off()
173 digitalWrite(oe, HIGH);