M tamaki
/
adafruiLEDMat
Adafruit LED Matrix Display program
Revision 0:86b6f02fab12, committed 2015-07-11
- Comitter:
- tamaki
- Date:
- Sat Jul 11 01:16:40 2015 +0000
- Commit message:
- adafruit LED matrix Display program(Test)
Changed in this revision
diff -r 000000000000 -r 86b6f02fab12 Adafruit_GFX.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Adafruit_GFX.h Sat Jul 11 01:16:40 2015 +0000 @@ -0,0 +1,84 @@ + +#ifndef _ADAFRUIT_GFX_H +#define _ADAFRUIT_GFX_H + +#include "mbed.h" +//#include "Arduino.h" +//#include "Print.h" + +#define swap(a, b) { int16_t t = a; a = b; b = t; } + +class Adafruit_GFX : public Print { // THIS LINE RIGHT HERE + + public: + + Adafruit_GFX(int16_t w, int16_t h); // Constructor + + // This MUST be defined by the subclass: + virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; + + // These MAY be overridden by the subclass to provide device-specific + // optimized code. Otherwise 'generic' versions are used. + virtual void + drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color), + drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), + drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), + drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color), + fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color), + fillScreen(uint16_t color), + invertDisplay(bool i); + + // These exist only with Adafruit_GFX (no subclass overrides) + void + drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), + drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, + uint16_t color), + fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), + fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, + int16_t delta, uint16_t color), + drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color), + fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color), + drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color), + fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color), + drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, + int16_t w, int16_t h, uint16_t color), + drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, + uint16_t bg, uint8_t size), + setCursor(int16_t x, int16_t y), + setTextColor(uint16_t c), + setTextColor(uint16_t c, uint16_t bg), + setTextSize(uint8_t s), + setTextWrap(bool w), + setRotation(uint8_t r); + +#if ARDUINO >= 100 + virtual size_t write(uint8_t); +#else + virtual void write(uint8_t); +#endif + + int16_t + height(void), + width(void); + + uint8_t getRotation(void); + + protected: + const int16_t + WIDTH, HEIGHT; // This is the 'raw' display w/h - never changes + int16_t + _width, _height, // Display w/h as modified by current rotation + cursor_x, cursor_y; + uint16_t + textcolor, textbgcolor; + uint8_t + textsize, + rotation; + bool + wrap; // If set, 'wrap' text at right edge of display +}; +
diff -r 000000000000 -r 86b6f02fab12 RGBmatrixPanel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RGBmatrixPanel.cpp Sat Jul 11 01:16:40 2015 +0000 @@ -0,0 +1,403 @@ + /* +This is the core graphics library for all our displays, +providing a common set of graphics primitives (points, lines, circles, etc.). +It needs to be paired with a hardware-specific library for each display device we carry (to handle the lower-level functions). + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information. +All text above must be included in any redistribution. +*/ + +/* + * Modified by Tatsuki Fukuda 25/5/2014 for use in mbed + */ + +#include "Adafruit_GFX.h" + +// Draw a circle outline +void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) +{ + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + drawPixel(x0 , y0+r, color); + drawPixel(x0 , y0-r, color); + drawPixel(x0+r, y0 , color); + drawPixel(x0-r, y0 , color); + + while (x<y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 - x, y0 + y, color); + drawPixel(x0 + x, y0 - y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 + y, y0 + x, color); + drawPixel(x0 - y, y0 + x, color); + drawPixel(x0 + y, y0 - x, color); + drawPixel(x0 - y, y0 - x, color); + } +} + +void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0, + int16_t r, uint8_t cornername, uint16_t color) +{ + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + while (x<y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + if (cornername & 0x4) { + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 + y, y0 + x, color); + } + if (cornername & 0x2) { + drawPixel(x0 + x, y0 - y, color); + drawPixel(x0 + y, y0 - x, color); + } + if (cornername & 0x8) { + drawPixel(x0 - y, y0 + x, color); + drawPixel(x0 - x, y0 + y, color); + } + if (cornername & 0x1) { + drawPixel(x0 - y, y0 - x, color); + drawPixel(x0 - x, y0 - y, color); + } + } +} + +void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) +{ + drawFastVLine(x0, y0-r, 2*r+1, color); + fillCircleHelper(x0, y0, r, 3, 0, color); +} + +// Used to do circles and roundrects +void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, + uint8_t cornername, int16_t delta, uint16_t color) +{ + + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + while (x<y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + if (cornername & 0x1) { + drawFastVLine(x0+x, y0-y, 2*y+1+delta, color); + drawFastVLine(x0+y, y0-x, 2*x+1+delta, color); + } + if (cornername & 0x2) { + drawFastVLine(x0-x, y0-y, 2*y+1+delta, color); + drawFastVLine(x0-y, y0-x, 2*x+1+delta, color); + } + } +} + +// Bresenham's algorithm - thx wikpedia +void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, + int16_t x1, int16_t y1, + uint16_t color) +{ + int16_t steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + swap(x0, y0); + swap(x1, y1); + } + + if (x0 > x1) { + swap(x0, x1); + swap(y0, y1); + } + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int16_t ystep; + + if (y0 < y1) { + ystep = 1; + } else { + ystep = -1; + } + + for (; x0<=x1; x0++) { + if (steep) { + drawPixel(y0, x0, color); + } else { + drawPixel(x0, y0, color); + } + err -= dy; + if (err < 0) { + y0 += ystep; + err += dx; + } + } +} + +// Draw a rectangle +void Adafruit_GFX::drawRect(int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t color) +{ + drawFastHLine(x, y, w, color); + drawFastHLine(x, y+h-1, w, color); + drawFastVLine(x, y, h, color); + drawFastVLine(x+w-1, y, h, color); +} + +void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, + int16_t h, uint16_t color) +{ + // Update in subclasses if desired! + drawLine(x, y, x, y+h-1, color); +} + +void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, + int16_t w, uint16_t color) +{ + // Update in subclasses if desired! + drawLine(x, y, x+w-1, y, color); +} + +void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) +{ + // Update in subclasses if desired! + for (int16_t i=x; i<x+w; i++) { + drawFastVLine(i, y, h, color); + } +} + +void Adafruit_GFX::fillScreen(uint16_t color) +{ + fillRect(0, 0, _width, _height, color); +} + +// Draw a rounded rectangle +void Adafruit_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w, + int16_t h, int16_t r, uint16_t color) +{ + // smarter version + drawFastHLine(x+r , y , w-2*r, color); // Top + drawFastHLine(x+r , y+h-1, w-2*r, color); // Bottom + drawFastVLine(x , y+r , h-2*r, color); // Left + drawFastVLine(x+w-1, y+r , h-2*r, color); // Right + // draw four corners + drawCircleHelper(x+r , y+r , r, 1, color); + drawCircleHelper(x+w-r-1, y+r , r, 2, color); + drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color); + drawCircleHelper(x+r , y+h-r-1, r, 8, color); +} + +// Fill a rounded rectangle +void Adafruit_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w, + int16_t h, int16_t r, uint16_t color) +{ + // smarter version + fillRect(x+r, y, w-2*r, h, color); + + // draw four corners + fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color); + fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color); +} + +// Draw a triangle +void Adafruit_GFX::drawTriangle(int16_t x0, int16_t y0, + int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color) +{ + drawLine(x0, y0, x1, y1, color); + drawLine(x1, y1, x2, y2, color); + drawLine(x2, y2, x0, y0, color); +} + +// Fill a triangle +void Adafruit_GFX::fillTriangle ( int16_t x0, int16_t y0, + int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color) +{ + + int16_t a, b, y, last; + + // Sort coordinates by Y order (y2 >= y1 >= y0) + if (y0 > y1) { + swap(y0, y1); + swap(x0, x1); + } + if (y1 > y2) { + swap(y2, y1); + swap(x2, x1); + } + if (y0 > y1) { + swap(y0, y1); + swap(x0, x1); + } + + if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing + a = b = x0; + if(x1 < a) a = x1; + else if(x1 > b) b = x1; + if(x2 < a) a = x2; + else if(x2 > b) b = x2; + drawFastHLine(a, y0, b-a+1, color); + return; + } + + int16_t + dx01 = x1 - x0, + dy01 = y1 - y0, + dx02 = x2 - x0, + dy02 = y2 - y0, + dx12 = x2 - x1, + dy12 = y2 - y1, + sa = 0, + sb = 0; + + // For upper part of triangle, find scanline crossings for segments + // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 + // is included here (and second loop will be skipped, avoiding a /0 + // error there), otherwise scanline y1 is skipped here and handled + // in the second loop...which also avoids a /0 error here if y0=y1 + // (flat-topped triangle). + if(y1 == y2) last = y1; // Include y1 scanline + else last = y1-1; // Skip it + + for(y=y0; y<=last; y++) { + a = x0 + sa / dy01; + b = x0 + sb / dy02; + sa += dx01; + sb += dx02; + /* longhand: + a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); + b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); + */ + if(a > b) swap(a,b); + drawFastHLine(a, y, b-a+1, color); + } + + // For lower part of triangle, find scanline crossings for segments + // 0-2 and 1-2. This loop is skipped if y1=y2. + sa = dx12 * (y - y1); + sb = dx02 * (y - y0); + for(; y<=y2; y++) { + a = x1 + sa / dy12; + b = x0 + sb / dy02; + sa += dx12; + sb += dx02; + /* longhand: + a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); + b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); + */ + if(a > b) swap(a,b); + drawFastHLine(a, y, b-a+1, color); + } +} + +void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) +{ + int16_t i, j; + for(j=0; j<h; j++) { + for(i=0; i<w; i++ ) { + if(bitmap[i+(j/8)*w]& _BV(j%8) ) + drawPixel(x+i, y+j, color); + } + } +} + +size_t Adafruit_GFX::writeChar(uint8_t c) +{ + if (c == '\n') { + cursor_y += textsize*8; + cursor_x = 0; + } else if (c == '\r') { + cursor_x = 0; + } else { + drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize); + cursor_x += textsize*6; + if (wrap && (cursor_x > (_width - textsize*6))) { + cursor_y += textsize*8; + cursor_x = 0; + } + } + return 1; +} + +// Draw a character +void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) +{ + if((x >= _width)|| // Clip right + (y >= _height)|| // Clip bottom + ((x + 6 * size - 1) < 0) || // Clip left + ((y + 8 * size - 1) < 0))// Clip top + return; + + for (int8_t i=0; i<6; i++ ) { + uint8_t line; + if (i == 5) + line = 0x0; + else + line = font[(c*5)+i]; + for (int8_t j = 0; j<8; j++) { + if (line & 0x1) { + if (size == 1) // default size + drawPixel(x+i, y+j, color); + else { // big size + fillRect(x+(i*size), y+(j*size), size, size, color); + } + } else if (bg != color) { + if (size == 1) // default size + drawPixel(x+i, y+j, bg); + else { // big size + fillRect(x+i*size, y+j*size, size, size, bg); + } + } + line >>= 1; + } + } +} + + +void Adafruit_GFX::invertDisplay(bool i) +{ + // Do nothing, must be subclassed if supported +} + +
diff -r 000000000000 -r 86b6f02fab12 RGBmatrixPanel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RGBmatrixPanel.h Sat Jul 11 01:16:40 2015 +0000 @@ -0,0 +1,190 @@ +#include "mbed.h" +#include "Adafruit_GFX.h" + +#ifndef _BV +#define _BV(bit) (1<<(bit)) +#endif + +#ifdef DEBUG +#define log_debug(format,...) std::printf(format,##__VA_ARGS__) +#else +#define log_debug(...) +#endif + +//** RGBmatrixPanel is class for full color LED matrix + +#include "mbed.h" +#include "RGBmatrixPanel.h" // Hardware-specific library + +PinName ub1=p6; +PinName ug1=p7; +PinName ur1=p8; +PinName lb2=p9; +PinName lg2=p10; +PinName lr2=p11; +RGBmatrixPanel matrix(ur1,ug1,ub1,lr2,lg2,lb2,p12,p13,p14,p15,p16,p17,false); +//RGBmatrixPanel(r1, g1, b1, r2, g2, b2, a, b, c, sclk, latch, oe, enable double_buffer); + +int main() +{ + matrix.begin(); + while(1) { + // fill the screen with 'black' + matrix.fillScreen(matrix.Color333(0, 0, 0)); + // draw a pixel in solid white + matrix.drawPixel(0, 0, matrix.Color333(7, 7, 7)); + wait_ms(500); + + // fix the screen with green + matrix.fillRect(0, 0, 32, 16, matrix.Color333(0, 7, 0)); + wait_ms(500); + + // draw a box in yellow + matrix.drawRect(0, 0, 32, 16, matrix.Color333(7, 7, 0)); + wait_ms(500); + + // draw an 'X' in red + matrix.drawLine(0, 0, 31, 15, matrix.Color333(7, 0, 0)); + matrix.drawLine(31, 0, 0, 15, matrix.Color333(7, 0, 0)); + wait_ms(500); + + // draw a blue circle + matrix.drawCircle(7, 7, 7, matrix.Color333(0, 0, 7)); + wait_ms(500); + + // fill a violet circle + matrix.fillCircle(23, 7, 7, matrix.Color333(7, 0, 7)); + wait_ms(500); + + // fill the screen with 'black' + matrix.fillScreen(matrix.Color333(0, 0, 0)); + + // draw some text! + matrix.setCursor(1, 0); // start at top left, with one pixel of spacing + matrix.setTextSize(1); // size 1 == 8 pixels high + + // printff each letter with a rainbow color + matrix.setTextColor(matrix.Color333(7,0,0)); + matrix.putc('1'); + matrix.setTextColor(matrix.Color333(7,4,0)); + matrix.putc('6'); + matrix.setTextColor(matrix.Color333(7,7,0)); + matrix.putc('x'); + matrix.setTextColor(matrix.Color333(4,7,0)); + matrix.putc('3'); + matrix.setTextColor(matrix.Color333(0,7,0)); + matrix.putc('2'); + + matrix.setCursor(1, 9); // next line + matrix.setTextColor(matrix.Color333(0,7,7)); + matrix.putc('*'); + matrix.setTextColor(matrix.Color333(0,4,7)); + matrix.putc('R'); + matrix.setTextColor(matrix.Color333(0,0,7)); + matrix.putc('G'); + matrix.setTextColor(matrix.Color333(4,0,7)); + matrix.putc('B'); + matrix.setTextColor(matrix.Color333(7,0,4)); + matrix.putc('*'); + wait_ms(500); + } +} + + +class RGBmatrixPanel : public Adafruit_GFX +{ + +public: + // Constructor for 16x32 panel: + RGBmatrixPanel(PinName r1,PinName g1,PinName b1,PinName r2,PinName g2,PinName b2,PinName a,PinName b,PinName c,PinName sclk,PinName latch,PinName oe, bool dbuf); + + // Constructor for 32x32 panel (adds 'd' pin): + RGBmatrixPanel(PinName r1,PinName r2,PinName g1,PinName g2,PinName b1,PinName b2,PinName a,PinName b,PinName c,PinName d,PinName sclk, PinName latch,PinName oe,bool dbuf); + + /** @fn void RGBmatrixPanel::begin(void) + * @bref Attach a updateDisplay() to be called by the Ticker(every 100us) + */ + void begin(void); + /** @fn void RGBmatrixPanel::drawPixel(int16_t x, int16_t y, uint16_t c) + * @bref drawPixel + */ + virtual void drawPixel(int16_t x,int16_t y,uint16_t c); + /** @fn void RGBmatrixPanel::fillScreen(uint16_t c) + * @bref fillScreen + * @param c fill screen 16bit color 0x0000 ~ 0xFFFF + */ + virtual void fillScreen(uint16_t c); + /** @fn void RGBmatrixPanel::updateDisplay(void) + * @param c updateDisplay\n + * This method is called by the interrupt start at begin(). + */ + void updateDisplay(void); + /** @fn void RGBmatrixPanel::swapBuffers(bool copy) + * @param copy swap buffer (if you use double-buffer) + */ + void swapBuffers(bool copy); + /** @fn void RGBmatrixPanel::dumpMatrix(void) + * @bref dump to default USB Serial\n + * Declaration is required to use.(#define DEBUG) + */ + void dumpMatrix(void); + + uint8_t *backBuffer(void); + + /** @fn uint16_t RGBmatrixPanel::Color333(uint8_t r, uint8_t g, uint8_t b) + * @bref up convert to 16bit color from 9bit color. + * @return 16bit(uint16_t) color value + */ + uint16_t Color333(uint8_t r, uint8_t g, uint8_t b); + /** @fn uint16_t RGBmatrixPanel::Color444(uint8_t r, uint8_t g, uint8_t b) + * @bref up convert to 16bit color from 12bit color. + * @param r 0~7 + * @param g 0~7 + * @param b 0~7 + * @return 16bit(uint16_t) color value + */ + uint16_t Color444(uint8_t r, uint8_t g, uint8_t b); + /** @fn uint16_t RGBmatrixPanel::Color888(uint8_t r, uint8_t g, uint8_t b) + * @bref down convert to 16bit color from 24bit color. + * @return 16bit(uint16_t) color value + */ + uint16_t Color888(uint8_t r, uint8_t g, uint8_t b); + /** @fn uint16_t RGBmatrixPanel::Color888(uint8_t r, uint8_t g, uint8_t b, bool gflag) + * @bref down convert to 16bit color from 24bit color using the gamma value table. + * @return 16bit(uint16_t) color value + */ + uint16_t Color888(uint8_t r, uint8_t g, uint8_t b, bool gflag); + /** @fn uint16_t RGBmatrixPanel::ColorHSV(long hue, uint8_t sat, uint8_t val, bool gflag) + * @bref convert to 16bit color from (unsigned integer)HSV color using the gamma value table. + * @param hue 0~1536(decimal value) + * @param sat 0~255(decimal value) Does not make sense that it is not a multiple of 32. + * @param val 0~255(decimal value) Does not make sense that it is not a multiple of 32. + * @return 16bit(uint16_t) color value + */ + uint16_t ColorHSV(long hue, uint8_t sat, uint8_t val, bool gflag) + ; + /** @fn uint16_t RGBmatrixPanel::ColorHSV(float hue, float sat, float val, bool gflag) + * @bref convert to 16bit color from (float)HSV color using the gamma value table. + * @param hue Normalized value from 0.0 to 1.0 + * @param sat Normalized value from 0.0 to 1.0 + * @param val Normalized value from 0.0 to 1.0 + * @return 16bit(uint16_t) color value + */ + uint16_t ColorHSV(float hue, float sat, float val, bool gflag); +private: + uint8_t *matrixbuff[2]; + uint8_t nRows; + uint8_t backindex; + bool swapflag; + + // Init/alloc code common to both constructors: + void init(uint8_t rows, bool dbuf); + + BusOut _dataBus; + BusOut _rowBus; + DigitalOut _d,_sclk, _latch, _oe; + Ticker _refresh; + // Counters/pointers for interrupt handler: + uint8_t row, plane; + uint8_t *buffptr; +}; \ No newline at end of file
diff -r 000000000000 -r 86b6f02fab12 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Jul 11 01:16:40 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1 \ No newline at end of file