Version de base du panneau

Dependencies:   mbed

Committer:
iut_cachan01
Date:
Fri Mar 23 13:28:47 2018 +0000
Revision:
0:c78ec5cab98d
Panneau Base

Who changed what in which revision?

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