Import of the Adafruit GP9002 VFD driver, demo and GFX library Driver tweaked to use 2MHz SPI not bitbang, also display right way up? Demo tweaked to display test bitmap GFX library tweaked to speed up filled triangles Note BSD licensed-see license.txt

Dependencies:   Adafruit-GFX-Library-master Adafruit-GP9002-Graphic-VFD-Library mbed

Committer:
oliverb
Date:
Sat May 07 12:56:20 2016 +0000
Revision:
5:b7e04b42554e
Parent:
4:414d6b60481f
Housekeeping, moved library code out

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oliverb 2:efef4231b922 1 #include <SPI.h>
oliverb 2:efef4231b922 2 #include "Adafruit_GFX.h"
oliverb 2:efef4231b922 3 #include "Adafruit_GP9002.h"
oliverb 2:efef4231b922 4
oliverb 2:efef4231b922 5 #define _MOSI p5 // VFD PIN#12
oliverb 2:efef4231b922 6 #define _MISO p6 // VFD PIN#8
oliverb 2:efef4231b922 7 #define _CLK p7 // VFD PIN#11
oliverb 2:efef4231b922 8 #define _CS p8 // VFD PIN#13
oliverb 2:efef4231b922 9 #define _DC p22 // VFD PIN#14
oliverb 2:efef4231b922 10 // connect VFD #15, #16, #17 to 5V
oliverb 2:efef4231b922 11 // connect VFD #9 #18 #19 #20 to ground
oliverb 2:efef4231b922 12 SPI SPIport(_MOSI,_MISO,_CLK);
oliverb 2:efef4231b922 13 Adafruit_GP9002 display = Adafruit_GP9002(SPIport, _CS, _DC);
oliverb 2:efef4231b922 14
oliverb 2:efef4231b922 15 // if using hardware SPI on an UNO or other classic Arduino, the pinouts are the same as
oliverb 2:efef4231b922 16 // above.
oliverb 2:efef4231b922 17 //Adafruit_GP9002 display = Adafruit_GP9002(_CS, _DC);
oliverb 2:efef4231b922 18
oliverb 2:efef4231b922 19 #ifndef min
oliverb 2:efef4231b922 20 #define min(a,b) ((a)<(b)?(a):(b))
oliverb 2:efef4231b922 21 #endif
oliverb 2:efef4231b922 22 #ifndef max
oliverb 2:efef4231b922 23 #define max(a,b) ((a)>(b)?(a):(b))
oliverb 2:efef4231b922 24 #endif
oliverb 2:efef4231b922 25
oliverb 2:efef4231b922 26
oliverb 2:efef4231b922 27 #define NUMFLAKES 10
oliverb 2:efef4231b922 28 #define XPOS 0
oliverb 2:efef4231b922 29 #define YPOS 1
oliverb 2:efef4231b922 30 #define DELTAY 2
oliverb 2:efef4231b922 31
oliverb 2:efef4231b922 32
oliverb 2:efef4231b922 33 #define LOGO16_GLCD_HEIGHT 16
oliverb 2:efef4231b922 34 #define LOGO16_GLCD_WIDTH 16
oliverb 2:efef4231b922 35 const unsigned char logo16_glcd_bmp[] =
oliverb 2:efef4231b922 36 { 0b00000000, 0b11000000,
oliverb 2:efef4231b922 37 0b00000001, 0b11000000,
oliverb 2:efef4231b922 38 0b00000001, 0b11000000,
oliverb 2:efef4231b922 39 0b00000011, 0b11100000,
oliverb 2:efef4231b922 40 0b11110011, 0b11100000,
oliverb 2:efef4231b922 41 0b11111110, 0b11111000,
oliverb 2:efef4231b922 42 0b01111110, 0b11111111,
oliverb 2:efef4231b922 43 0b00110011, 0b10011111,
oliverb 2:efef4231b922 44 0b00011111, 0b11111100,
oliverb 2:efef4231b922 45 0b00001101, 0b01110000,
oliverb 2:efef4231b922 46 0b00011011, 0b10100000,
oliverb 2:efef4231b922 47 0b00111111, 0b11100000,
oliverb 2:efef4231b922 48 0b00111111, 0b11110000,
oliverb 2:efef4231b922 49 0b01111100, 0b11110000,
oliverb 2:efef4231b922 50 0b01110000, 0b01110000,
oliverb 2:efef4231b922 51 0b00000000, 0b00110000 };
oliverb 2:efef4231b922 52
oliverb 2:efef4231b922 53 #include "adabmp.c"
oliverb 2:efef4231b922 54
oliverb 3:db1141757323 55 extern const unsigned char BitReverseTable256[];
oliverb 2:efef4231b922 56
oliverb 2:efef4231b922 57
oliverb 2:efef4231b922 58 void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
oliverb 2:efef4231b922 59 uint8_t icons[NUMFLAKES][3];
oliverb 2:efef4231b922 60 srand(666); // whatever seed
oliverb 2:efef4231b922 61
oliverb 2:efef4231b922 62 // initialize
oliverb 2:efef4231b922 63 for (uint8_t f=0; f< NUMFLAKES; f++) {
oliverb 2:efef4231b922 64 icons[f][XPOS] = rand() % display.width();
oliverb 2:efef4231b922 65 icons[f][YPOS] = 0;
oliverb 2:efef4231b922 66 icons[f][DELTAY] = rand() % 5 + 1;
oliverb 2:efef4231b922 67
oliverb 2:efef4231b922 68 /* Serial.print("x: ");
oliverb 2:efef4231b922 69 Serial.print(icons[f][XPOS], DEC);
oliverb 2:efef4231b922 70 Serial.print(" y: ");
oliverb 2:efef4231b922 71 Serial.print(icons[f][YPOS], DEC);
oliverb 2:efef4231b922 72 Serial.print(" dy: ");
oliverb 2:efef4231b922 73 Serial.println(icons[f][DELTAY], DEC);
oliverb 2:efef4231b922 74 */ }
oliverb 2:efef4231b922 75
oliverb 2:efef4231b922 76 while (1) {
oliverb 2:efef4231b922 77 // draw each icon
oliverb 2:efef4231b922 78 for (uint8_t f=0; f< NUMFLAKES; f++) {
oliverb 2:efef4231b922 79 display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE);
oliverb 2:efef4231b922 80 }
oliverb 2:efef4231b922 81 wait_ms(200);
oliverb 2:efef4231b922 82
oliverb 2:efef4231b922 83 // then erase it + move it
oliverb 2:efef4231b922 84 for (uint8_t f=0; f< NUMFLAKES; f++) {
oliverb 2:efef4231b922 85 display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
oliverb 2:efef4231b922 86 // move it
oliverb 2:efef4231b922 87 icons[f][YPOS] += icons[f][DELTAY];
oliverb 2:efef4231b922 88 // if its gone, reinit
oliverb 2:efef4231b922 89 if (icons[f][YPOS] > display.height()) {
oliverb 2:efef4231b922 90 icons[f][XPOS] = rand() % display.width();
oliverb 2:efef4231b922 91 icons[f][YPOS] = 0;
oliverb 2:efef4231b922 92 icons[f][DELTAY] = rand() % 5 + 1;
oliverb 2:efef4231b922 93 }
oliverb 2:efef4231b922 94 }
oliverb 2:efef4231b922 95 }
oliverb 2:efef4231b922 96 }
oliverb 2:efef4231b922 97
oliverb 2:efef4231b922 98
oliverb 2:efef4231b922 99 void testdrawchar(void) {
oliverb 2:efef4231b922 100 display.setTextSize(1);
oliverb 2:efef4231b922 101 display.setTextColor(WHITE);
oliverb 2:efef4231b922 102 display.setCursor(0,0);
oliverb 2:efef4231b922 103
oliverb 2:efef4231b922 104 for (uint8_t i=0; i < 168; i++) {
oliverb 2:efef4231b922 105 if (i == '\n') continue;
oliverb 2:efef4231b922 106 display.putc(i);
oliverb 2:efef4231b922 107 //if ((i > 0) && (i % 14 == 0))
oliverb 2:efef4231b922 108 //display.println();
oliverb 2:efef4231b922 109 }
oliverb 2:efef4231b922 110 }
oliverb 2:efef4231b922 111
oliverb 2:efef4231b922 112 void testdrawcircle(void) {
oliverb 2:efef4231b922 113 for (uint8_t i=0; i<display.height(); i+=2) {
oliverb 2:efef4231b922 114 display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
oliverb 2:efef4231b922 115 }
oliverb 2:efef4231b922 116 }
oliverb 2:efef4231b922 117
oliverb 2:efef4231b922 118 void testfillrect(void) {
oliverb 2:efef4231b922 119 uint8_t color = 1;
oliverb 2:efef4231b922 120 for (uint8_t i=0; i<display.height()/2; i+=3) {
oliverb 2:efef4231b922 121 // alternate colors
oliverb 2:efef4231b922 122 display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
oliverb 2:efef4231b922 123 color++;
oliverb 2:efef4231b922 124 }
oliverb 2:efef4231b922 125 }
oliverb 2:efef4231b922 126
oliverb 2:efef4231b922 127 void testdrawtriangle(void) {
oliverb 2:efef4231b922 128 for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
oliverb 2:efef4231b922 129 display.drawTriangle(display.width()/2, display.height()/2-i,
oliverb 2:efef4231b922 130 display.width()/2-i, display.height()/2+i,
oliverb 2:efef4231b922 131 display.width()/2+i, display.height()/2+i, WHITE);
oliverb 2:efef4231b922 132 }
oliverb 2:efef4231b922 133 }
oliverb 2:efef4231b922 134
oliverb 2:efef4231b922 135 void testfilltriangle(void) {
oliverb 2:efef4231b922 136 uint8_t color = WHITE;
oliverb 2:efef4231b922 137 for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
oliverb 2:efef4231b922 138 display.fillTriangle(display.width()/2, display.height()/2-i,
oliverb 2:efef4231b922 139 display.width()/2-i, display.height()/2+i,
oliverb 2:efef4231b922 140 display.width()/2+i, display.height()/2+i, color);
oliverb 2:efef4231b922 141 if (color == BLACK) color = WHITE;
oliverb 2:efef4231b922 142 else color = BLACK;
oliverb 2:efef4231b922 143 }
oliverb 2:efef4231b922 144 }
oliverb 0:414a9e6fed37 145
oliverb 2:efef4231b922 146 void testdrawroundrect(void) {
oliverb 3:db1141757323 147 for (uint8_t i=2; i<display.height()/4; i+=2) {
oliverb 2:efef4231b922 148 display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
oliverb 2:efef4231b922 149 }
oliverb 2:efef4231b922 150 }
oliverb 2:efef4231b922 151
oliverb 2:efef4231b922 152 void testfillroundrect(void) {
oliverb 2:efef4231b922 153 uint8_t color = WHITE;
oliverb 2:efef4231b922 154 for (uint8_t i=0; i<display.height()/4-2; i+=2) {
oliverb 2:efef4231b922 155 display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
oliverb 2:efef4231b922 156 if (color == BLACK) color = WHITE;
oliverb 2:efef4231b922 157 else color = BLACK;
oliverb 2:efef4231b922 158 }
oliverb 2:efef4231b922 159 }
oliverb 2:efef4231b922 160
oliverb 2:efef4231b922 161 void testdrawrect(void) {
oliverb 2:efef4231b922 162 for (uint8_t i=0; i<display.height()/2; i+=2) {
oliverb 2:efef4231b922 163 display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
oliverb 2:efef4231b922 164 }
oliverb 2:efef4231b922 165 }
oliverb 2:efef4231b922 166
oliverb 2:efef4231b922 167 void testdrawline() {
oliverb 2:efef4231b922 168 for (uint8_t i=0; i<display.width(); i+=4) {
oliverb 2:efef4231b922 169 display.drawLine(0, 0, i, display.height()-1, WHITE);
oliverb 2:efef4231b922 170 }
oliverb 2:efef4231b922 171 for (uint8_t i=0; i<display.height(); i+=4) {
oliverb 2:efef4231b922 172 display.drawLine(0, 0, display.width()-1, i, WHITE);
oliverb 2:efef4231b922 173 }
oliverb 2:efef4231b922 174 wait_ms(250);
oliverb 2:efef4231b922 175
oliverb 2:efef4231b922 176 display.clearDisplay();
oliverb 2:efef4231b922 177 for (uint8_t i=0; i<display.width(); i+=4) {
oliverb 2:efef4231b922 178 display.drawLine(0, display.height()-1, i, 0, WHITE);
oliverb 2:efef4231b922 179 }
oliverb 2:efef4231b922 180 for (int8_t i=display.height()-1; i>=0; i-=4) {
oliverb 2:efef4231b922 181 display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
oliverb 2:efef4231b922 182 }
oliverb 2:efef4231b922 183 wait_ms(250);
oliverb 2:efef4231b922 184
oliverb 2:efef4231b922 185 display.clearDisplay();
oliverb 2:efef4231b922 186 for (int8_t i=display.width()-1; i>=0; i-=4) {
oliverb 2:efef4231b922 187 display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
oliverb 2:efef4231b922 188 }
oliverb 2:efef4231b922 189 for (int8_t i=display.height()-1; i>=0; i-=4) {
oliverb 2:efef4231b922 190 display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
oliverb 2:efef4231b922 191 }
oliverb 2:efef4231b922 192 wait_ms(250);
oliverb 2:efef4231b922 193
oliverb 2:efef4231b922 194 display.clearDisplay();
oliverb 2:efef4231b922 195 for (uint8_t i=0; i<display.height(); i+=4) {
oliverb 2:efef4231b922 196 display.drawLine(display.width()-1, 0, 0, i, WHITE);
oliverb 2:efef4231b922 197 }
oliverb 2:efef4231b922 198 for (uint8_t i=0; i<display.width(); i+=4) {
oliverb 2:efef4231b922 199 display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
oliverb 2:efef4231b922 200 }
oliverb 2:efef4231b922 201 wait_ms(250);
oliverb 2:efef4231b922 202 }
oliverb 2:efef4231b922 203
oliverb 2:efef4231b922 204 int main() {
oliverb 2:efef4231b922 205 // Serial.begin(9600);
oliverb 2:efef4231b922 206
oliverb 2:efef4231b922 207 display.begin();
oliverb 2:efef4231b922 208 // init done
oliverb 2:efef4231b922 209
oliverb 3:db1141757323 210 // wait_ms(2000);
oliverb 2:efef4231b922 211 display.clearDisplay(); // clears the screen and buffer
oliverb 2:efef4231b922 212 /*
oliverb 3:db1141757323 213 display.drawPixel(10, 10, WHITE);
oliverb 2:efef4231b922 214 display.drawPixel(20, 20, WHITE);
oliverb 3:db1141757323 215 wait_ms(2000);
oliverb 2:efef4231b922 216
oliverb 2:efef4231b922 217 display.clearDisplay();
oliverb 2:efef4231b922 218
oliverb 2:efef4231b922 219 // draw many lines
oliverb 2:efef4231b922 220 testdrawline();
oliverb 2:efef4231b922 221 delay(2000);
oliverb 2:efef4231b922 222 display.clearDisplay();
oliverb 2:efef4231b922 223 // draw rectangles
oliverb 2:efef4231b922 224 testdrawrect();
oliverb 2:efef4231b922 225 delay(2000);
oliverb 2:efef4231b922 226 display.clearDisplay();
oliverb 2:efef4231b922 227
oliverb 2:efef4231b922 228 // draw multiple rectangles
oliverb 2:efef4231b922 229 testfillrect();
oliverb 2:efef4231b922 230 delay(2000);
oliverb 2:efef4231b922 231 display.clearDisplay();
oliverb 2:efef4231b922 232
oliverb 2:efef4231b922 233 // draw mulitple circles
oliverb 2:efef4231b922 234 testdrawcircle();
oliverb 2:efef4231b922 235 delay(2000);
oliverb 2:efef4231b922 236 display.clearDisplay();
oliverb 2:efef4231b922 237 */
oliverb 2:efef4231b922 238
oliverb 2:efef4231b922 239 // draw a circle, 10 pixel radius
oliverb 2:efef4231b922 240 display.fillCircle(20, 20, 20, WHITE);
oliverb 2:efef4231b922 241 wait_ms(2000);
oliverb 2:efef4231b922 242
oliverb 2:efef4231b922 243 display.clearDisplay();
oliverb 2:efef4231b922 244 testdrawroundrect();
oliverb 2:efef4231b922 245 wait_ms(2000);
oliverb 2:efef4231b922 246 display.clearDisplay();
oliverb 2:efef4231b922 247
oliverb 2:efef4231b922 248 testfillroundrect();
oliverb 2:efef4231b922 249 wait_ms(2000);
oliverb 2:efef4231b922 250 display.clearDisplay();
oliverb 2:efef4231b922 251
oliverb 2:efef4231b922 252 testdrawtriangle();
oliverb 2:efef4231b922 253 wait_ms(2000);
oliverb 2:efef4231b922 254 display.clearDisplay();
oliverb 2:efef4231b922 255
oliverb 2:efef4231b922 256 testfilltriangle();
oliverb 2:efef4231b922 257 wait_ms(2000);
oliverb 2:efef4231b922 258 display.clearDisplay();
oliverb 2:efef4231b922 259
oliverb 2:efef4231b922 260 // draw the first ~12 characters in the font
oliverb 2:efef4231b922 261 testdrawchar();
oliverb 2:efef4231b922 262 wait_ms(2000);
oliverb 2:efef4231b922 263 display.clearDisplay();
oliverb 2:efef4231b922 264
oliverb 2:efef4231b922 265 // text display tests
oliverb 2:efef4231b922 266 display.setTextSize(1);
oliverb 2:efef4231b922 267 display.setTextColor(WHITE);
oliverb 2:efef4231b922 268 display.setCursor(0,0);
oliverb 3:db1141757323 269 display.printf("Hello, world!\n");
oliverb 2:efef4231b922 270 display.setTextColor(BLACK, WHITE); // 'inverted' text
oliverb 2:efef4231b922 271 display.printf("%f",3.141592);
oliverb 2:efef4231b922 272 display.setTextSize(2);
oliverb 2:efef4231b922 273 display.setTextColor(WHITE);
oliverb 2:efef4231b922 274 display.printf("0x%8x",0xDEADBEEF);
oliverb 2:efef4231b922 275 wait_ms(2000);
oliverb 2:efef4231b922 276
oliverb 2:efef4231b922 277 // miniature bitmap display
oliverb 2:efef4231b922 278 display.clearDisplay();
oliverb 2:efef4231b922 279 display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
oliverb 2:efef4231b922 280
oliverb 2:efef4231b922 281 wait_ms(2000);
oliverb 3:db1141757323 282
oliverb 3:db1141757323 283 display.command(GP9002_ADDRINCR);
oliverb 3:db1141757323 284 display.command(GP9002_ADDRL);
oliverb 3:db1141757323 285 display.dataWrite(0x00);
oliverb 3:db1141757323 286 display.command(GP9002_ADDRH);
oliverb 3:db1141757323 287 display.dataWrite(0x00);
oliverb 3:db1141757323 288 display.command(GP9002_DATAWRITE);
oliverb 3:db1141757323 289 for(uint32_t count2=0;count2<128;count2++)
oliverb 3:db1141757323 290 {
oliverb 3:db1141757323 291 for(uint32_t count=count2;count<0x400;count+=128)
oliverb 3:db1141757323 292 {
oliverb 3:db1141757323 293 display.dataWrite(BitReverseTable256[adabmp[count]]);
oliverb 3:db1141757323 294 }
oliverb 3:db1141757323 295 }
oliverb 2:efef4231b922 296
oliverb 2:efef4231b922 297 }
oliverb 2:efef4231b922 298
oliverb 2:efef4231b922 299
oliverb 2:efef4231b922 300 void loop() {
oliverb 2:efef4231b922 301
oliverb 2:efef4231b922 302 }