Forked LEDMatrix and added horizontal scrolling
Fork of LEDMatrix by
Diff: LEDMatrix.cpp
- Revision:
- 1:79cf2e115449
- Parent:
- 0:13728deac7a7
- Child:
- 2:cd2da920cf98
--- a/LEDMatrix.cpp Fri Nov 08 06:45:52 2013 +0000
+++ b/LEDMatrix.cpp Mon Jan 11 21:05:53 2016 +0000
@@ -41,6 +41,7 @@
mask = 0xff;
state = 0;
+ _horizontalScrollPos = 0;
}
void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
@@ -60,8 +61,8 @@
ASSERT(width > x);
ASSERT(height > y);
- uint8_t *byte = displaybuf + x * 8 + y / 8;
- uint8_t bit = y % 8;
+ uint8_t *byte = displaybuf + (height - 1 - y) * width / 8 + (width - 1 - x) / 8;
+ uint8_t bit = (width - 1 - x) % 8;
if (pixel) {
*byte |= 0x80 >> bit;
@@ -117,22 +118,32 @@
{
static uint8_t row = 0;
- if (!state) {
+ if (!state)
+ {
return;
}
uint8_t *head = displaybuf + row * (width / 8);
- for (uint8_t line = 0; line < (height / 16); line++) {
+ 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++;
+ for (uint8_t byteIdx = 0; byteIdx < (width / 8); byteIdx++)
+ {
+ uint8_t* pByte1 = ptr + (((byteIdx*8 + width - _horizontalScrollPos + 7) % width) / 8);
+ uint8_t* pByte2 = ptr + (((byteIdx*8 + width - _horizontalScrollPos - 1) % width) / 8);
+ int bitOffset = _horizontalScrollPos % 8;
+ uint8_t pixels = ((*pByte1) >> bitOffset) + (((*pByte2) << (8 - bitOffset)) % 256);
+
+// uint8_t pixels = *ptr;
+// ptr++;
pixels = pixels ^ mask; // reverse: mask = 0xff, normal: mask =0x00
- for (uint8_t bit = 0; bit < 8; bit++) {
+ for (uint8_t bit = 0; bit < 8; bit++)
+ {
clk = 0;
r1 = pixels & (0x80 >> bit);
+// wait_us(1);
clk = 1;
}
}
@@ -148,6 +159,7 @@
// latch data
stb = 0;
+// wait_us(1);
stb = 1;
oe = 0; // enable display
@@ -166,3 +178,21 @@
oe = 1;
}
+void LEDMatrix::scrollReset()
+{
+ _horizontalScrollPos = 0;
+}
+
+void LEDMatrix::scrollLeft()
+{
+ _horizontalScrollPos++;
+ if (_horizontalScrollPos >= width)
+ _horizontalScrollPos = 0;
+}
+
+void LEDMatrix::scrollToPos(int pos)
+{
+ if ((pos <= 0) || (pos >= width))
+ return;
+ _horizontalScrollPos = pos;
+}
