Subversion Repositories Code-Repo

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
121 Kevin 1
#include "maindefs.h"
2
#include "oled_ssd1331.h"
3
#include "spi.h"
4
#include "string.h"
5
#include "Adafruit_GFX.h"
6
#include <delays.h>
7
 
8
void SSD1331_Init() {
9
    GFX_Init(SSD1331_LCDWIDTH, SSD1331_LCDHEIGHT);
10
}
11
 
12
void SSD1331_Begin() {
13
    unsigned char buffer[37];
14
 
15
    // Toggle reset pin
16
    LATBbits.LATB6 = 0;
17
    Delay10KTCYx(1);
18
    LATBbits.LATB6 = 1;
19
 
20
    // Initialization Sequence
21
    buffer[0] = SSD1331_CMD_DISPLAYOFF; // 0xAE
22
    buffer[1] = SSD1331_CMD_SETREMAP; // 0xA0
23
#if defined SSD1331_COLORORDER_RGB
24
    buffer[2] = 0x72; // RGB Color
25
#else
26
    buffer[2] = 0x76; // BGR Color
27
#endif
28
    buffer[3] = SSD1331_CMD_STARTLINE; // 0xA1
29
    buffer[4] = 0x0;
30
    buffer[5] = SSD1331_CMD_DISPLAYOFFSET; // 0xA2
31
    buffer[6] = 0x0;
32
    buffer[7] = SSD1331_CMD_NORMALDISPLAY; // 0xA4
33
    buffer[8] = SSD1331_CMD_SETMULTIPLEX; // 0xA8
34
    buffer[9] = 0x3F; // 0x3F 1/64 duty
35
    buffer[10] = SSD1331_CMD_SETMASTER; // 0xAD
36
    buffer[11] = 0x8E;
37
    buffer[12] = SSD1331_CMD_POWERMODE; // 0xB0
38
    buffer[13] = 0x0B;
39
    buffer[14] = SSD1331_CMD_PRECHARGE; // 0xB1
40
    buffer[15] = 0x31;
41
    buffer[16] = SSD1331_CMD_CLOCKDIV; // 0xB3
42
    buffer[17] = 0xF0; // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16)
43
    buffer[18] = SSD1331_CMD_PRECHARGEA; // 0x8A
44
    buffer[19] = 0x64;
45
    buffer[20] = SSD1331_CMD_PRECHARGEB; // 0x8B
46
    buffer[21] = 0x78;
47
    buffer[22] = SSD1331_CMD_PRECHARGEA; // 0x8C
48
    buffer[23] = 0x64;
49
    buffer[24] = SSD1331_CMD_PRECHARGELEVEL; // 0xBB
50
    buffer[25] = 0x3A;
51
    buffer[26] = SSD1331_CMD_VCOMH; // 0xBE
52
    buffer[27] = 0x3E;
53
    buffer[28] = SSD1331_CMD_MASTERCURRENT; // 0x87
54
    buffer[29] = 0x06;
55
    buffer[30] = SSD1331_CMD_CONTRASTA; // 0x81
56
    buffer[31] = 0x91;
57
    buffer[32] = SSD1331_CMD_CONTRASTB; // 0x82
58
    buffer[33] = 0x50;
59
    buffer[34] = SSD1331_CMD_CONTRASTC; // 0x83
60
    buffer[35] = 0x7D;
61
    buffer[36] = SSD1331_CMD_DISPLAYON; //--turn on oled panel
62
 
63
    LATBbits.LATB5 = 0; // D/C low (cmd)
64
    SPI2_Write(buffer, 37);
65
}
66
 
67
void SSD1331_GoTo(int x, int y) {
68
    unsigned char buffer[6];
69
    if ((x >= SSD1331_LCDWIDTH) || (y >= SSD1331_LCDHEIGHT)) return;
70
 
71
    // set x and y coordinate
72
    buffer[0] = (SSD1331_CMD_SETCOLUMN);
127 Kevin 73
    buffer[1] = (x); // Start x address
74
    buffer[2] = (SSD1331_LCDWIDTH - 1); // End x address
121 Kevin 75
 
76
    buffer[3] = (SSD1331_CMD_SETROW);
127 Kevin 77
    buffer[4] = (y); // Start y address
78
    buffer[5] = (SSD1331_LCDHEIGHT - 1); // End y address
121 Kevin 79
 
80
    LATBbits.LATB5 = 0; // D/C low (cmd)
81
    SPI2_Write(buffer, 6);
82
}
83
 
84
void SSD1331_Reset() {
85
 
86
}
87
 
88
void SSD1331_Command(unsigned char cmd) {
89
    LATBbits.LATB5 = 0; // D/C low (cmd)
90
    SPI2_Write(&cmd, 1);
91
}
92
 
93
void SSD1331_Data(unsigned char data) {
94
    LATBbits.LATB5 = 1; // D/C high (data)
95
    SPI2_Write(&data, 1);
96
}
97
 
98
void SSD1331_Draw_Pixel(int x, int y, unsigned int color) {
99
    unsigned char buffer[2];
100
    buffer[0] = color >> 8;
101
    buffer[1] = color;
102
    if ((x < 0) || (x >= GFX_width()) || (y < 0) || (y >= GFX_height())) return;
103
 
104
    // check rotation, move pixel around if necessary
105
    switch (GFX_getRotation()) {
106
        case 1:
107
            GFX_Swap(&x, &y);
108
            x = SSD1331_LCDWIDTH - x - 1;
109
            break;
110
        case 2:
111
            x = SSD1331_LCDWIDTH - x - 1;
112
            y = SSD1331_LCDHEIGHT - y - 1;
113
            break;
114
        case 3:
115
            GFX_Swap(&x, &y);
116
            y = SSD1331_LCDHEIGHT - y - 1;
117
            break;
118
    }
119
 
120
    SSD1331_GoTo(x, y);
121
 
122
    // setup for data
123
    LATBbits.LATB5 = 1; // D/C high (data)
124
 
125
    SPI2_Write(buffer, 2);
126
}
127
 
128
void SSD1331_Draw_Line(int x0, int y0, int x1, int y1, unsigned int color) {
129
    unsigned char buffer[8];
130
 
131
    // check rotation, move pixel around if necessary
132
    switch (GFX_getRotation()) {
133
        case 1:
134
            GFX_Swap(&x0, &y0);
135
            GFX_Swap(&x1, &y1);
136
            x0 = SSD1331_LCDWIDTH - x0 - 1;
137
            x1 = SSD1331_LCDWIDTH - x1 - 1;
138
            break;
139
        case 2:
140
            x0 = SSD1331_LCDWIDTH - x0 - 1;
141
            y0 = SSD1331_LCDHEIGHT - y0 - 1;
142
            x1 = SSD1331_LCDWIDTH - x1 - 1;
143
            y1 = SSD1331_LCDHEIGHT - y1 - 1;
144
            break;
145
        case 3:
146
            GFX_Swap(&x0, &y0);
147
            GFX_Swap(&x1, &y1);
148
            y0 = SSD1331_LCDHEIGHT - y0 - 1;
149
            y1 = SSD1331_LCDHEIGHT - y1 - 1;
150
            break;
151
    }
152
 
153
    // Boundary check
154
    if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT))
155
        return;
156
    if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH))
157
        return;
158
    if (x0 >= SSD1331_LCDWIDTH)
159
        x0 = SSD1331_LCDWIDTH - 1;
160
    if (y0 >= SSD1331_LCDHEIGHT)
161
        y0 = SSD1331_LCDHEIGHT - 1;
162
    if (x1 >= SSD1331_LCDWIDTH)
163
        x1 = SSD1331_LCDWIDTH - 1;
164
    if (y1 >= SSD1331_LCDHEIGHT)
165
        y1 = SSD1331_LCDHEIGHT - 1;
166
    if (x0 < 0)
167
        x0 = 0;
168
    if (y0 < 0)
169
        y0 = 0;
170
    if (x1 < 0)
171
        x1 = 0;
172
    if (y1 < 0)
173
        y1 = 0;
174
 
175
    buffer[0] = SSD1331_CMD_DRAWLINE;
176
    buffer[1] = x0;
177
    buffer[2] = y0;
178
    buffer[3] = x1;
179
    buffer[4] = y1;
180
    buffer[5] = (color >> 11) << 1;
181
    buffer[6] = (color >> 5) & 0x3F;
182
    buffer[7] = (color << 1) & 0x3F;
183
 
184
    LATBbits.LATB5 = 0; // D/C low (cmd)
185
    SPI2_Write(buffer, 8);
186
}
187
 
188
void SSD1331_Draw_Rect(int tx0, int ty0, int tx1, int ty1, unsigned int color) {
189
    unsigned char buffer[13];
190
    int x0,y0,x1,y1;
191
 
192
    // check rotation, move pixel around if necessary
193
    switch (GFX_getRotation()) {
194
        case 0:
195
            x0 = tx0;
196
            y0 = ty0;
197
            x1 = tx1;
198
            y1 = ty1;
199
            break;
200
        case 1:
201
            x0 = SSD1331_LCDWIDTH - ty1 - 1;
202
            y0 = tx0;
203
            x1 = SSD1331_LCDWIDTH - ty0 - 1;
204
            y1 = tx1;
205
            break;
206
        case 2:
207
            x0 = SSD1331_LCDWIDTH - tx1 - 1;
208
            y0 = SSD1331_LCDHEIGHT - ty1 - 1;
209
            x1 = SSD1331_LCDWIDTH - tx0 - 1;
210
            y1 = SSD1331_LCDHEIGHT - ty0 - 1;
211
            break;
212
        case 3:
213
            x0 = ty0;
214
            y0 = SSD1331_LCDHEIGHT - tx1 - 1;
215
            x1 = ty1;
216
            y1 = SSD1331_LCDHEIGHT - tx0 - 1;
217
            break;
218
    }
219
 
220
    // Boundary check
221
    if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT))
222
        return;
223
    if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH))
224
        return;
225
    if (x0 >= SSD1331_LCDWIDTH)
226
        x0 = SSD1331_LCDWIDTH - 1;
227
    if (y0 >= SSD1331_LCDHEIGHT)
228
        y0 = SSD1331_LCDHEIGHT - 1;
229
    if (x1 >= SSD1331_LCDWIDTH)
230
        x1 = SSD1331_LCDWIDTH - 1;
231
    if (y1 >= SSD1331_LCDHEIGHT)
232
        y1 = SSD1331_LCDHEIGHT - 1;
233
    if (x0 < 0)
234
        x0 = 0;
235
    if (y0 < 0)
236
        y0 = 0;
237
    if (x1 < 0)
238
        x1 = 0;
239
    if (y1 < 0)
240
        y1 = 0;
241
 
242
    buffer[0] = SSD1331_CMD_FILL;
243
    buffer[1] = 0;
244
    buffer[2] = SSD1331_CMD_DRAWRECT;
245
    buffer[3] = x0;
246
    buffer[4] = y0;
247
    buffer[5] = x1;
248
    buffer[6] = y1;
249
    buffer[7] = (color >> 11) << 1;
250
    buffer[8] = (color >> 5) & 0x3F;
251
    buffer[9] = (color << 1) & 0x3F;
252
    buffer[10] = 0;
253
    buffer[11] = 0;
254
    buffer[12] = 0;
255
 
256
    LATBbits.LATB5 = 0; // D/C low (cmd)
257
    SPI2_Write(buffer, 13);
258
}
259
 
260
void SSD1331_Fill_Rect(int tx0, int ty0, int tx1, int ty1, unsigned int color) {
261
    unsigned char buffer[13];
262
    int x0,y0,x1,y1;
263
 
264
    // check rotation, move pixel around if necessary
265
    switch (GFX_getRotation()) {
266
        case 0:
267
            x0 = tx0;
268
            y0 = ty0;
269
            x1 = tx1;
270
            y1 = ty1;
271
            break;
272
        case 1:
273
            x0 = SSD1331_LCDWIDTH - ty1 - 1;
274
            y0 = tx0;
275
            x1 = SSD1331_LCDWIDTH - ty0 - 1;
276
            y1 = tx1;
277
            break;
278
        case 2:
279
            x0 = SSD1331_LCDWIDTH - tx1 - 1;
280
            y0 = SSD1331_LCDHEIGHT - ty1 - 1;
281
            x1 = SSD1331_LCDWIDTH - tx0 - 1;
282
            y1 = SSD1331_LCDHEIGHT - ty0 - 1;
283
            break;
284
        case 3:
285
            x0 = ty0;
286
            y0 = SSD1331_LCDHEIGHT - tx1 - 1;
287
            x1 = ty1;
288
            y1 = SSD1331_LCDHEIGHT - tx0 - 1;
289
            break;
290
    }
291
 
292
    // Boundary check
293
    if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT))
294
        return;
295
    if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH))
296
        return;
297
    if (x0 >= SSD1331_LCDWIDTH)
298
        x0 = SSD1331_LCDWIDTH - 1;
299
    if (y0 >= SSD1331_LCDHEIGHT)
300
        y0 = SSD1331_LCDHEIGHT - 1;
301
    if (x1 >= SSD1331_LCDWIDTH)
302
        x1 = SSD1331_LCDWIDTH - 1;
303
    if (y1 >= SSD1331_LCDHEIGHT)
304
        y1 = SSD1331_LCDHEIGHT - 1;
305
    if (x0 < 0)
306
        x0 = 0;
307
    if (y0 < 0)
308
        y0 = 0;
309
    if (x1 < 0)
310
        x1 = 0;
311
    if (y1 < 0)
312
        y1 = 0;
313
 
314
    buffer[0] = SSD1331_CMD_FILL;
315
    buffer[1] = 1;
316
    buffer[2] = SSD1331_CMD_DRAWRECT;
317
    buffer[3] = x0;
318
    buffer[4] = y0;
319
    buffer[5] = x1;
320
    buffer[6] = y1;
321
    buffer[7] = (color >> 11) << 1;
322
    buffer[8] = (color >> 5) & 0x3F;
323
    buffer[9] = (color << 1) & 0x3F;
324
    buffer[10] = (color >> 11) << 1;
325
    buffer[11] = (color >> 5) & 0x3F;
326
    buffer[12] = (color << 1) & 0x3F;
327
 
328
    LATBbits.LATB5 = 0; // D/C low (cmd)
329
    SPI2_Write(buffer, 13);
330
 
331
    Delay1KTCYx(4);
332
}
333
 
334
void SSD1331_Clear_Display() {
335
    unsigned char buffer[5];
336
 
337
    buffer[0] = SSD1331_CMD_CLEARWINDOW;
338
    buffer[1] = 0;
339
    buffer[2] = 0;
340
    buffer[3] = SSD1331_LCDWIDTH-1;
341
    buffer[4] = SSD1331_LCDHEIGHT-1;
342
 
343
    LATBbits.LATB5 = 0; // D/C low (cmd)
344
    SPI2_Write(buffer, 5);
345
 
346
    Delay1KTCYx(4);
347
}
348
 
349
unsigned int SSD1331_Color565(unsigned char r, unsigned char g, unsigned char b) {
350
    unsigned int c;
351
    c = r >> 3;
352
    c <<= 6;
353
    c |= g >> 2;
354
    c <<= 5;
355
    c |= b >> 3;
356
 
357
    return c;
358
}
359
 
360
void SSD1331_Test_DrawLines(unsigned int color) {
361
    int x, y;
362
    GFX_clearScreen();
363
    for (x = 0; x < GFX_width() - 1; x += 6) {
364
        GFX_drawLine(0, 0, x, GFX_height() - 1, color);
365
    }
366
    for (y = 0; y < GFX_height() - 1; y += 6) {
367
        GFX_drawLine(0, 0, GFX_width() - 1, y, color);
368
    }
369
 
370
    GFX_clearScreen();
371
    for (x = 0; x < GFX_width() - 1; x += 6) {
372
        GFX_drawLine(GFX_width() - 1, 0, x, GFX_height() - 1, color);
373
    }
374
    for (y = 0; y < GFX_height() - 1; y += 6) {
375
        GFX_drawLine(GFX_width() - 1, 0, 0, y, color);
376
    }
377
 
378
    GFX_clearScreen();
379
    for (x = 0; x < GFX_width() - 1; x += 6) {
380
        GFX_drawLine(0, GFX_height() - 1, x, 0, color);
381
    }
382
    for (y = 0; y < GFX_height() - 1; y += 6) {
383
        GFX_drawLine(0, GFX_height() - 1, GFX_width() - 1, y, color);
384
    }
385
 
386
    GFX_clearScreen();
387
    for (x = 0; x < GFX_width() - 1; x += 6) {
388
        GFX_drawLine(GFX_width() - 1, GFX_height() - 1, x, 0, color);
389
    }
390
    for (y = 0; y < GFX_height() - 1; y += 6) {
391
        GFX_drawLine(GFX_width() - 1, GFX_height() - 1, 0, y, color);
392
    }
393
}
394
 
395
void SSD1331_Test_DrawRect(unsigned int color) {
396
    int x;
397
    GFX_clearScreen();
398
    if (GFX_height() < GFX_width()) {
399
        for (x = 0; x < GFX_height() - 1; x += 6) {
400
            GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color);
401
        }
402
    } else {
403
        for (x = 0; x < GFX_width() - 1; x += 6) {
404
            GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color);
405
        }
406
    }
407
}
408
 
409
void SSD1331_Test_FillRect(unsigned int color1, unsigned int color2) {
410
    int x;
411
    GFX_clearScreen();
412
    if (GFX_height() < GFX_width()) {
413
        for (x = GFX_height() - 1; x > 6; x -= 6) {
414
            GFX_fillRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color1);
415
            GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color2);
416
        }
417
    } else {
418
        for (x = GFX_width() - 1; x > 6; x -= 6) {
419
            GFX_fillRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color1);
420
            GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color2);
421
        }
422
    }
423
}
424
 
425
void SSD1331_Test_DrawCircle(unsigned int radius, unsigned int color) {
426
    int x, y;
427
    for (x = 0; x < GFX_width() - 1 + radius; x += radius * 2) {
428
        for (y = 0; y < GFX_height() - 1 + radius; y += radius * 2) {
429
            GFX_drawCircle(x, y, radius, color);
430
        }
431
    }
432
}
433
 
434
void SSD1331_Test_FillCircle(unsigned int radius, unsigned int color) {
435
    unsigned char x, y;
436
    for (x = radius; x < GFX_width() - 1; x += radius * 2) {
437
        for (y = radius; y < GFX_height() - 1; y += radius * 2) {
438
            GFX_fillCircle(x, y, radius, color);
439
        }
440
    }
441
}
442
 
443
void SSD1331_Test_DrawTria(void) {
444
    int color = 0xF800;
445
    int t;
446
    int w = GFX_width() / 2;
447
    int x = GFX_height();
448
    int y = 0;
449
    int z = GFX_width();
450
    GFX_clearScreen();
451
    for (t = 0; t <= 15; t += 1) {
452
        GFX_drawTriangle(w, y, y, x, z, x, color);
453
        x -= 4;
454
        y += 4;
455
        z -= 4;
456
        color += 100;
457
    }
458
}
459
 
460
void SSD1331_Test_DrawRoundRect(void) {
461
    int color = 100;
462
    int i, t, x, y, w, h;
463
    GFX_clearScreen();
464
    for (t = 0; t <= 4; t += 1) {
465
        x = 0;
466
        y = 0;
467
        w = GFX_width();
468
        h = GFX_height();
469
        for (i = 0; i <= 24; i += 1) {
470
            GFX_drawRoundRect(x, y, w, h, 5, color);
471
            x += 2;
472
            y += 3;
473
            w -= 4;
474
            h -= 6;
475
            color += 1100;
476
        }
477
        color += 100;
478
    }
479
}
480
 
481
void SSD1331_Test_MediaButtons(void) {
482
    // play
483
    GFX_clearScreen();
484
    GFX_fillRoundRect(25, 10, 78, 60, 8, SSD1331_WHITE);
485
    GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_RED);
486
    Delay10KTCYx(100);
487
    // pause
488
    GFX_fillRoundRect(25, 90, 78, 60, 8, SSD1331_WHITE);
489
    GFX_fillRoundRect(39, 98, 20, 45, 5, SSD1331_GREEN);
490
    GFX_fillRoundRect(69, 98, 20, 45, 5, SSD1331_GREEN);
491
    Delay10KTCYx(100);
492
    // play color
493
    GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_BLUE);
494
    Delay10KTCYx(100);
495
    // pause color
496
    GFX_fillRoundRect(39, 98, 20, 45, 5, SSD1331_RED);
497
    GFX_fillRoundRect(69, 98, 20, 45, 5, SSD1331_RED);
498
    // play color
499
    GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_GREEN);
500
}
501
 
502
void SSD1331_Test_Pattern(void) {
503
    unsigned char buffer[2];
504
    unsigned int i, j;
505
    SSD1331_GoTo(0, 0);
506
 
507
    for (i = 0; i < 64; i++) {
508
        for (j = 0; j < 96; j++) {
509
            if (i > 55) {
510
                buffer[0] = (SSD1331_WHITE >> 8);
511
                buffer[1] = (SSD1331_WHITE);
512
            } else if (i > 47) {
513
                buffer[0] = (SSD1331_BLUE >> 8);
514
                buffer[1] = (SSD1331_BLUE);
515
            } else if (i > 39) {
516
                buffer[0] = (SSD1331_GREEN >> 8);
517
                buffer[1] = (SSD1331_GREEN);
518
            } else if (i > 31) {
519
                buffer[0] = (SSD1331_CYAN >> 8);
520
                buffer[1] = (SSD1331_CYAN);
521
            } else if (i > 23) {
522
                buffer[0] = (SSD1331_RED >> 8);
523
                buffer[1] = (SSD1331_RED);
524
            } else if (i > 15) {
525
                buffer[0] = (SSD1331_MAGENTA >> 8);
526
                buffer[1] = (SSD1331_MAGENTA);
527
            } else if (i > 7) {
528
                buffer[0] = (SSD1331_YELLOW >> 8);
529
                buffer[1] = (SSD1331_YELLOW);
530
            } else {
531
                buffer[0] = (SSD1331_BLACK >> 8);
532
                buffer[1] = (SSD1331_BLACK);
533
            }
534
            LATBbits.LATB5 = 1; // D/C high (data)
535
            SPI2_Write(buffer, 2);
536
        }
537
    }
538
}