panneau
Dependencies: mbed
LEDMatrix.cpp@0:b8e5f03fdaaf, 2018-05-15 (annotated)
- Committer:
- baptistepennelle
- Date:
- Tue May 15 11:58:50 2018 +0000
- Revision:
- 0:b8e5f03fdaaf
panneau
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
baptistepennelle | 0:b8e5f03fdaaf | 1 | /** |
baptistepennelle | 0:b8e5f03fdaaf | 2 | * LED Matrix library for http://www.seeedstudio.com/depot/ultrathin-16x32-red-led-matrix-panel-p-1582.html |
baptistepennelle | 0:b8e5f03fdaaf | 3 | * The LED Matrix panel has 32x16 pixels. Several panel can be combined together as a large screen. |
baptistepennelle | 0:b8e5f03fdaaf | 4 | * |
baptistepennelle | 0:b8e5f03fdaaf | 5 | * Coordinate & Connection (mbed -> panel 0 -> panel 1 -> ...) |
baptistepennelle | 0:b8e5f03fdaaf | 6 | * (0, 0) (0, 0) |
baptistepennelle | 0:b8e5f03fdaaf | 7 | * +--------+--------+--------+ +--------+--------+ |
baptistepennelle | 0:b8e5f03fdaaf | 8 | * | 5 | 3 | 1 | | 1 | 0 | |
baptistepennelle | 0:b8e5f03fdaaf | 9 | * | | | | | | |<----- mbed |
baptistepennelle | 0:b8e5f03fdaaf | 10 | * +--------+--------+--------+ +--------+--------+ |
baptistepennelle | 0:b8e5f03fdaaf | 11 | * | 4 | 2 | 0 | (64, 16) |
baptistepennelle | 0:b8e5f03fdaaf | 12 | * | | | |<----- mbed |
baptistepennelle | 0:b8e5f03fdaaf | 13 | * +--------+--------+--------+ |
baptistepennelle | 0:b8e5f03fdaaf | 14 | * (96, 32) |
baptistepennelle | 0:b8e5f03fdaaf | 15 | * Copyright (c) 2013 Seeed Technology Inc. |
baptistepennelle | 0:b8e5f03fdaaf | 16 | * @auther Yihui Xiong |
baptistepennelle | 0:b8e5f03fdaaf | 17 | * @date Nov 8, 2013 |
baptistepennelle | 0:b8e5f03fdaaf | 18 | * @license Apache |
baptistepennelle | 0:b8e5f03fdaaf | 19 | */ |
baptistepennelle | 0:b8e5f03fdaaf | 20 | |
baptistepennelle | 0:b8e5f03fdaaf | 21 | #include "LEDMatrix.h" |
baptistepennelle | 0:b8e5f03fdaaf | 22 | #include "mbed.h" |
baptistepennelle | 0:b8e5f03fdaaf | 23 | |
baptistepennelle | 0:b8e5f03fdaaf | 24 | #if 0 |
baptistepennelle | 0:b8e5f03fdaaf | 25 | #define ASSERT(e) if (!(e)) { Serial.println(#e); while (1); } |
baptistepennelle | 0:b8e5f03fdaaf | 26 | #else |
baptistepennelle | 0:b8e5f03fdaaf | 27 | #define ASSERT(e) |
baptistepennelle | 0:b8e5f03fdaaf | 28 | #endif |
baptistepennelle | 0:b8e5f03fdaaf | 29 | |
baptistepennelle | 0:b8e5f03fdaaf | 30 | LEDMatrix::LEDMatrix(PinName pinA, PinName pinB, PinName pinC, PinName pinD, PinName pinOE, |
baptistepennelle | 0:b8e5f03fdaaf | 31 | PinName pinR1, PinName pinR2, PinName pinB1, PinName pinB2, PinName pinG1, PinName pinG2, |
baptistepennelle | 0:b8e5f03fdaaf | 32 | PinName pinG3,PinName pinR3, PinName pinB3, PinName pinR4, PinName pinG4,PinName pinB4, |
baptistepennelle | 0:b8e5f03fdaaf | 33 | PinName pinSTB, PinName pinCLK) : |
baptistepennelle | 0:b8e5f03fdaaf | 34 | a(pinA), b(pinB), c(pinC), d(pinD), oe(pinOE), r1(pinR1), r2(pinR2), b1(pinB1), b2(pinB2), g1(pinG1), g2(pinG2), g3(pinG3), r3(pinR3), b3(pinB3),r4(pinR4), g4(pinG4), b4(pinB4), stb(pinSTB), clk(pinCLK) |
baptistepennelle | 0:b8e5f03fdaaf | 35 | { |
baptistepennelle | 0:b8e5f03fdaaf | 36 | oe = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 37 | clk = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 38 | stb = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 39 | mask = 0xff; |
baptistepennelle | 0:b8e5f03fdaaf | 40 | state = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 41 | bufferIndex = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 42 | flagSwap = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 43 | } |
baptistepennelle | 0:b8e5f03fdaaf | 44 | |
baptistepennelle | 0:b8e5f03fdaaf | 45 | void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height) |
baptistepennelle | 0:b8e5f03fdaaf | 46 | { |
baptistepennelle | 0:b8e5f03fdaaf | 47 | this->displaybuf = displaybuf; |
baptistepennelle | 0:b8e5f03fdaaf | 48 | memoBuf = displaybuf; |
baptistepennelle | 0:b8e5f03fdaaf | 49 | drawBuf = memoBuf + width * height; |
baptistepennelle | 0:b8e5f03fdaaf | 50 | this->width = width; |
baptistepennelle | 0:b8e5f03fdaaf | 51 | this->height = height; |
baptistepennelle | 0:b8e5f03fdaaf | 52 | |
baptistepennelle | 0:b8e5f03fdaaf | 53 | state = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 54 | } |
baptistepennelle | 0:b8e5f03fdaaf | 55 | |
baptistepennelle | 0:b8e5f03fdaaf | 56 | void LEDMatrix::drawPoint(uint16_t x, uint16_t y, uint8_t pixel) |
baptistepennelle | 0:b8e5f03fdaaf | 57 | { |
baptistepennelle | 0:b8e5f03fdaaf | 58 | if (x>=width) return; |
baptistepennelle | 0:b8e5f03fdaaf | 59 | if (y>=height) return; |
baptistepennelle | 0:b8e5f03fdaaf | 60 | drawBuf[x+ width * y] = pixel & 0x07; |
baptistepennelle | 0:b8e5f03fdaaf | 61 | } |
baptistepennelle | 0:b8e5f03fdaaf | 62 | |
baptistepennelle | 0:b8e5f03fdaaf | 63 | void LEDMatrix::drawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t pixel) |
baptistepennelle | 0:b8e5f03fdaaf | 64 | { |
baptistepennelle | 0:b8e5f03fdaaf | 65 | for (uint16_t x = x1; x < x2; x++) { |
baptistepennelle | 0:b8e5f03fdaaf | 66 | for (uint16_t y = y1; y < y2; y++) { |
baptistepennelle | 0:b8e5f03fdaaf | 67 | drawPoint(x, y, pixel); |
baptistepennelle | 0:b8e5f03fdaaf | 68 | } |
baptistepennelle | 0:b8e5f03fdaaf | 69 | } |
baptistepennelle | 0:b8e5f03fdaaf | 70 | } |
baptistepennelle | 0:b8e5f03fdaaf | 71 | |
baptistepennelle | 0:b8e5f03fdaaf | 72 | int LEDMatrix::drawChar(uint16_t x, uint16_t y, char c, uint8_t pixel, Font *font) |
baptistepennelle | 0:b8e5f03fdaaf | 73 | { |
baptistepennelle | 0:b8e5f03fdaaf | 74 | int i, j,k, col, max = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 75 | for (i=0; i<font->hauteur(); i++) { |
baptistepennelle | 0:b8e5f03fdaaf | 76 | for (k=0; k<font->largeur(); k++) { |
baptistepennelle | 0:b8e5f03fdaaf | 77 | col = font->octet(c, i, k); |
baptistepennelle | 0:b8e5f03fdaaf | 78 | for (j=8; j>=0; j--) { |
baptistepennelle | 0:b8e5f03fdaaf | 79 | if (col & 0x01 != 0) { |
baptistepennelle | 0:b8e5f03fdaaf | 80 | int dx = j+8*k; |
baptistepennelle | 0:b8e5f03fdaaf | 81 | if (dx > max) max = dx; |
baptistepennelle | 0:b8e5f03fdaaf | 82 | drawPoint(x + dx, y+i, pixel); |
baptistepennelle | 0:b8e5f03fdaaf | 83 | } |
baptistepennelle | 0:b8e5f03fdaaf | 84 | col = col >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 85 | } |
baptistepennelle | 0:b8e5f03fdaaf | 86 | } |
baptistepennelle | 0:b8e5f03fdaaf | 87 | } |
baptistepennelle | 0:b8e5f03fdaaf | 88 | if (c==' ') { |
baptistepennelle | 0:b8e5f03fdaaf | 89 | return 5*font->largeur(); |
baptistepennelle | 0:b8e5f03fdaaf | 90 | } else { |
baptistepennelle | 0:b8e5f03fdaaf | 91 | return max + font->largeur(); |
baptistepennelle | 0:b8e5f03fdaaf | 92 | } |
baptistepennelle | 0:b8e5f03fdaaf | 93 | } |
baptistepennelle | 0:b8e5f03fdaaf | 94 | |
baptistepennelle | 0:b8e5f03fdaaf | 95 | |
baptistepennelle | 0:b8e5f03fdaaf | 96 | void LEDMatrix::drawCharString (uint16_t x, uint16_t y, char *c, uint8_t pixel,Font *font) |
baptistepennelle | 0:b8e5f03fdaaf | 97 | { |
baptistepennelle | 0:b8e5f03fdaaf | 98 | int i=0; |
baptistepennelle | 0:b8e5f03fdaaf | 99 | while(c[i] != '\0') { |
baptistepennelle | 0:b8e5f03fdaaf | 100 | int dx = drawChar(x,y,c[i],pixel,font); |
baptistepennelle | 0:b8e5f03fdaaf | 101 | i++; |
baptistepennelle | 0:b8e5f03fdaaf | 102 | x += dx; |
baptistepennelle | 0:b8e5f03fdaaf | 103 | } |
baptistepennelle | 0:b8e5f03fdaaf | 104 | } |
baptistepennelle | 0:b8e5f03fdaaf | 105 | |
baptistepennelle | 0:b8e5f03fdaaf | 106 | |
baptistepennelle | 0:b8e5f03fdaaf | 107 | void LEDMatrix::drawImage(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t *image) |
baptistepennelle | 0:b8e5f03fdaaf | 108 | { |
baptistepennelle | 0:b8e5f03fdaaf | 109 | ASSERT(0 == ((x2 - x1) % 8)); |
baptistepennelle | 0:b8e5f03fdaaf | 110 | |
baptistepennelle | 0:b8e5f03fdaaf | 111 | for (uint16_t x = x1; x < x2; x++) { |
baptistepennelle | 0:b8e5f03fdaaf | 112 | for (uint16_t y = y1; y < y2; y++) { |
baptistepennelle | 0:b8e5f03fdaaf | 113 | uint8_t *byte = image + x * 8 + y / 8; |
baptistepennelle | 0:b8e5f03fdaaf | 114 | uint8_t bit = 7 - (y % 8); |
baptistepennelle | 0:b8e5f03fdaaf | 115 | uint8_t pixel = (*byte >> bit) & 1; |
baptistepennelle | 0:b8e5f03fdaaf | 116 | |
baptistepennelle | 0:b8e5f03fdaaf | 117 | drawPoint(x, y, pixel); |
baptistepennelle | 0:b8e5f03fdaaf | 118 | } |
baptistepennelle | 0:b8e5f03fdaaf | 119 | } |
baptistepennelle | 0:b8e5f03fdaaf | 120 | } |
baptistepennelle | 0:b8e5f03fdaaf | 121 | |
baptistepennelle | 0:b8e5f03fdaaf | 122 | void LEDMatrix::clear() |
baptistepennelle | 0:b8e5f03fdaaf | 123 | { |
baptistepennelle | 0:b8e5f03fdaaf | 124 | uint8_t *ptr = drawBuf; |
baptistepennelle | 0:b8e5f03fdaaf | 125 | for (uint16_t i = 0; i < (width * height); i++) { |
baptistepennelle | 0:b8e5f03fdaaf | 126 | *ptr = 0x00; |
baptistepennelle | 0:b8e5f03fdaaf | 127 | ptr++; |
baptistepennelle | 0:b8e5f03fdaaf | 128 | } |
baptistepennelle | 0:b8e5f03fdaaf | 129 | } |
baptistepennelle | 0:b8e5f03fdaaf | 130 | |
baptistepennelle | 0:b8e5f03fdaaf | 131 | void LEDMatrix::reverse() |
baptistepennelle | 0:b8e5f03fdaaf | 132 | { |
baptistepennelle | 0:b8e5f03fdaaf | 133 | mask = ~mask; |
baptistepennelle | 0:b8e5f03fdaaf | 134 | } |
baptistepennelle | 0:b8e5f03fdaaf | 135 | |
baptistepennelle | 0:b8e5f03fdaaf | 136 | uint8_t LEDMatrix::isReversed() |
baptistepennelle | 0:b8e5f03fdaaf | 137 | { |
baptistepennelle | 0:b8e5f03fdaaf | 138 | return mask; |
baptistepennelle | 0:b8e5f03fdaaf | 139 | } |
baptistepennelle | 0:b8e5f03fdaaf | 140 | |
baptistepennelle | 0:b8e5f03fdaaf | 141 | void LEDMatrix::scan() |
baptistepennelle | 0:b8e5f03fdaaf | 142 | { |
baptistepennelle | 0:b8e5f03fdaaf | 143 | static uint8_t row = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 144 | |
baptistepennelle | 0:b8e5f03fdaaf | 145 | if (!state) { |
baptistepennelle | 0:b8e5f03fdaaf | 146 | return; |
baptistepennelle | 0:b8e5f03fdaaf | 147 | } |
baptistepennelle | 0:b8e5f03fdaaf | 148 | |
baptistepennelle | 0:b8e5f03fdaaf | 149 | int debut1 = 2048 + row * width ; //1024 |
baptistepennelle | 0:b8e5f03fdaaf | 150 | int debut2 = 6144 + row * width ; //3072 |
baptistepennelle | 0:b8e5f03fdaaf | 151 | int debut3 = 2112 + row * width ; |
baptistepennelle | 0:b8e5f03fdaaf | 152 | int debut4 = 6208 + row * width ; |
baptistepennelle | 0:b8e5f03fdaaf | 153 | |
baptistepennelle | 0:b8e5f03fdaaf | 154 | for (uint8_t i = 0; i <64 ; i++) { |
baptistepennelle | 0:b8e5f03fdaaf | 155 | clk = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 156 | r1 = displaybuf[debut1+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 157 | r2 = displaybuf[debut2+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 158 | r3 = displaybuf[debut3+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 159 | r4 = displaybuf[debut4+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 160 | g1 = (displaybuf[debut1+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 161 | g2 = (displaybuf[debut2+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 162 | g3 = (displaybuf[debut3+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 163 | g4 = (displaybuf[debut4+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 164 | b1 = (displaybuf[debut1+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 165 | b2 = (displaybuf[debut2+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 166 | b3 = (displaybuf[debut3+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 167 | b4 = (displaybuf[debut4+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 168 | clk = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 169 | } |
baptistepennelle | 0:b8e5f03fdaaf | 170 | |
baptistepennelle | 0:b8e5f03fdaaf | 171 | debut1 = 0 + row * width;//0 |
baptistepennelle | 0:b8e5f03fdaaf | 172 | debut2 = 4096 + row * width;//2048 |
baptistepennelle | 0:b8e5f03fdaaf | 173 | debut3 = 64 + row * width; |
baptistepennelle | 0:b8e5f03fdaaf | 174 | debut4 = 4160 + row * width; |
baptistepennelle | 0:b8e5f03fdaaf | 175 | |
baptistepennelle | 0:b8e5f03fdaaf | 176 | for (uint8_t i = 0; i <64 ; i++) { |
baptistepennelle | 0:b8e5f03fdaaf | 177 | clk = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 178 | r1 = displaybuf[debut1+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 179 | r2 = displaybuf[debut2+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 180 | r3 = displaybuf[debut3+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 181 | r4 = displaybuf[debut4+i] & 0x01; |
baptistepennelle | 0:b8e5f03fdaaf | 182 | g1 = (displaybuf[debut1+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 183 | g2 = (displaybuf[debut2+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 184 | g3 = (displaybuf[debut3+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 185 | g4 = (displaybuf[debut4+i] & 0x02) >> 1; |
baptistepennelle | 0:b8e5f03fdaaf | 186 | b1 = (displaybuf[debut1+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 187 | b2 = (displaybuf[debut2+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 188 | b3 = (displaybuf[debut3+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 189 | b4 = (displaybuf[debut4+i] & 0x04) >> 2; |
baptistepennelle | 0:b8e5f03fdaaf | 190 | clk = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 191 | } |
baptistepennelle | 0:b8e5f03fdaaf | 192 | |
baptistepennelle | 0:b8e5f03fdaaf | 193 | oe = 1; // disable display |
baptistepennelle | 0:b8e5f03fdaaf | 194 | |
baptistepennelle | 0:b8e5f03fdaaf | 195 | // select row |
baptistepennelle | 0:b8e5f03fdaaf | 196 | a = (row & 0x01); |
baptistepennelle | 0:b8e5f03fdaaf | 197 | b = (row & 0x02); |
baptistepennelle | 0:b8e5f03fdaaf | 198 | c = (row & 0x04); |
baptistepennelle | 0:b8e5f03fdaaf | 199 | d = (row & 0x08); |
baptistepennelle | 0:b8e5f03fdaaf | 200 | |
baptistepennelle | 0:b8e5f03fdaaf | 201 | // latch data |
baptistepennelle | 0:b8e5f03fdaaf | 202 | stb = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 203 | stb = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 204 | |
baptistepennelle | 0:b8e5f03fdaaf | 205 | oe = 0; // enable display |
baptistepennelle | 0:b8e5f03fdaaf | 206 | |
baptistepennelle | 0:b8e5f03fdaaf | 207 | row=(row + 1) & 0x0F; |
baptistepennelle | 0:b8e5f03fdaaf | 208 | |
baptistepennelle | 0:b8e5f03fdaaf | 209 | if (row==0) { |
baptistepennelle | 0:b8e5f03fdaaf | 210 | if (flagSwap == 1) { |
baptistepennelle | 0:b8e5f03fdaaf | 211 | if (bufferIndex==0) { |
baptistepennelle | 0:b8e5f03fdaaf | 212 | bufferIndex = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 213 | displaybuf = memoBuf + width*height; |
baptistepennelle | 0:b8e5f03fdaaf | 214 | drawBuf = memoBuf; |
baptistepennelle | 0:b8e5f03fdaaf | 215 | } else { |
baptistepennelle | 0:b8e5f03fdaaf | 216 | bufferIndex = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 217 | displaybuf = memoBuf; |
baptistepennelle | 0:b8e5f03fdaaf | 218 | drawBuf = memoBuf + width*height; |
baptistepennelle | 0:b8e5f03fdaaf | 219 | } |
baptistepennelle | 0:b8e5f03fdaaf | 220 | flagSwap = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 221 | } |
baptistepennelle | 0:b8e5f03fdaaf | 222 | } |
baptistepennelle | 0:b8e5f03fdaaf | 223 | } |
baptistepennelle | 0:b8e5f03fdaaf | 224 | |
baptistepennelle | 0:b8e5f03fdaaf | 225 | void LEDMatrix::on() |
baptistepennelle | 0:b8e5f03fdaaf | 226 | { |
baptistepennelle | 0:b8e5f03fdaaf | 227 | state = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 228 | } |
baptistepennelle | 0:b8e5f03fdaaf | 229 | |
baptistepennelle | 0:b8e5f03fdaaf | 230 | void LEDMatrix::off() |
baptistepennelle | 0:b8e5f03fdaaf | 231 | { |
baptistepennelle | 0:b8e5f03fdaaf | 232 | state = 0; |
baptistepennelle | 0:b8e5f03fdaaf | 233 | oe = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 234 | } |
baptistepennelle | 0:b8e5f03fdaaf | 235 | |
baptistepennelle | 0:b8e5f03fdaaf | 236 | void LEDMatrix::swap() |
baptistepennelle | 0:b8e5f03fdaaf | 237 | { |
baptistepennelle | 0:b8e5f03fdaaf | 238 | flagSwap = 1; |
baptistepennelle | 0:b8e5f03fdaaf | 239 | } |
baptistepennelle | 0:b8e5f03fdaaf | 240 | |
baptistepennelle | 0:b8e5f03fdaaf | 241 | int LEDMatrix::synchro() |
baptistepennelle | 0:b8e5f03fdaaf | 242 | { |
baptistepennelle | 0:b8e5f03fdaaf | 243 | return !flagSwap; |
baptistepennelle | 0:b8e5f03fdaaf | 244 | } |