panneau

Dependencies:   mbed

Committer:
baptistepennelle
Date:
Tue May 15 11:58:50 2018 +0000
Revision:
0:b8e5f03fdaaf
panneau

Who changed what in which revision?

UserRevisionLine numberNew 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 }