SSD1331 Oled driver library for 96x64 colour Oled display. Demo included in .h file
Dependents: Oled-SSD1331 PJ12_device
Revision 1:f3f6624f45d4, committed 2016-05-01
- Comitter:
- star297
- Date:
- Sun May 01 12:37:44 2016 +0000
- Parent:
- 0:3d7d1aec706b
- Child:
- 2:1204274fad8f
- Commit message:
- Added external font and bitmap handling.
Changed in this revision
| ssd1331.cpp | Show annotated file Show diff for this revision Revisions of this file |
| ssd1331.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/ssd1331.cpp Tue Apr 26 22:51:28 2016 +0000
+++ b/ssd1331.cpp Sun May 01 12:37:44 2016 +0000
@@ -5,106 +5,106 @@
#define countof(x) ( sizeof(x) / sizeof(x[0]) )
static const char font6x8[0x60][6] = {
- { 0x00,0x00,0x00,0x00,0x00,0x00 } , /*SPC */
- { 0x00,0x00,0x5F,0x00,0x00,0x00 } , /* ! */
- { 0x04,0x03,0x04,0x03,0x00,0x00 } , /* " */
- { 0x28,0x7E,0x14,0x3F,0x0A,0x00 } , /* # */
- { 0x24,0x2A,0x7F,0x2A,0x12,0x00 } , /* $ */
- { 0x23,0x13,0x08,0x64,0x62,0x00 } , /* % */
- { 0x30,0x4E,0x59,0x26,0x50,0x00 } , /* & */
- { 0x00,0x00,0x02,0x01,0x00,0x00 } , /* ' */
- { 0x00,0x00,0x1C,0x22,0x41,0x00 } , /* ( */
- { 0x41,0x22,0x1C,0x00,0x00,0x00 } , /* ) */
- { 0x22,0x14,0x08,0x14,0x22,0x00 } , /* * */
- { 0x08,0x08,0x3E,0x08,0x08,0x00 } , /* + */
- { 0x50,0x30,0x00,0x00,0x00,0x00 } , /* , */
- { 0x08,0x08,0x08,0x08,0x08,0x00 } , /* - */
- { 0x60,0x60,0x00,0x00,0x00,0x00 } , /* . */
- { 0x20,0x10,0x08,0x04,0x02,0x00 } , /* / */
- { 0x3E,0x51,0x49,0x45,0x3E,0x00 } , /* 0 */
- { 0x00,0x42,0x7F,0x40,0x00,0x00 } , /* 1 */
- { 0x62,0x51,0x49,0x49,0x46,0x00 } , /* 2 */
- { 0x22,0x41,0x49,0x49,0x36,0x00 } , /* 3 */
- { 0x18,0x14,0x12,0x7F,0x10,0x00 } , /* 4 */
- { 0x2F,0x45,0x45,0x45,0x39,0x00 } , /* 5 */
- { 0x3E,0x49,0x49,0x49,0x32,0x00 } , /* 6 */
- { 0x01,0x61,0x19,0x05,0x03,0x00 } , /* 7 */
- { 0x36,0x49,0x49,0x49,0x36,0x00 } , /* 8 */
- { 0x26,0x49,0x49,0x49,0x3E,0x00 } , /* 9 */
- { 0x00,0x36,0x36,0x00,0x00,0x00 } , /* : */
- { 0x00,0x56,0x36,0x00,0x00,0x00 } , /* ; */
- { 0x00,0x08,0x14,0x22,0x41,0x00 } , /* < */
- { 0x14,0x14,0x14,0x14,0x14,0x00 } , /* = */
- { 0x41,0x22,0x14,0x08,0x00,0x00 } , /* > */
- { 0x02,0x01,0x59,0x09,0x06,0x00 } , /* ? */
- { 0x3E,0x41,0x5D,0x55,0x2E,0x00 } , /* @ */
- { 0x60,0x1C,0x13,0x1C,0x60,0x00 } , /* A */
- { 0x7F,0x49,0x49,0x49,0x36,0x00 } , /* B */
- { 0x3E,0x41,0x41,0x41,0x22,0x00 } , /* C */
- { 0x7F,0x41,0x41,0x22,0x1C,0x00 } , /* D */
- { 0x7F,0x49,0x49,0x49,0x41,0x00 } , /* E */
- { 0x7F,0x09,0x09,0x09,0x01,0x00 } , /* F */
- { 0x1C,0x22,0x41,0x49,0x3A,0x00 } , /* G */
- { 0x7F,0x08,0x08,0x08,0x7F,0x00 } , /* H */
- { 0x00,0x41,0x7F,0x41,0x00,0x00 } , /* I */
- { 0x20,0x40,0x40,0x40,0x3F,0x00 } , /* J */
- { 0x7F,0x08,0x14,0x22,0x41,0x00 } , /* K */
- { 0x7F,0x40,0x40,0x40,0x00,0x00 } , /* L */
- { 0x7F,0x04,0x18,0x04,0x7F,0x00 } , /* M */
- { 0x7F,0x04,0x08,0x10,0x7F,0x00 } , /* N */
- { 0x3E,0x41,0x41,0x41,0x3E,0x00 } , /* O */
- { 0x7F,0x09,0x09,0x09,0x06,0x00 } , /* P */
- { 0x3E,0x41,0x51,0x21,0x5E,0x00 } , /* Q */
- { 0x7F,0x09,0x19,0x29,0x46,0x00 } , /* R */
- { 0x26,0x49,0x49,0x49,0x32,0x00 } , /* S */
- { 0x01,0x01,0x7F,0x01,0x01,0x00 } , /* T */
- { 0x3F,0x40,0x40,0x40,0x3F,0x00 } , /* U */
- { 0x03,0x1C,0x60,0x1C,0x03,0x00 } , /* V */
- { 0x0F,0x70,0x0F,0x70,0x0F,0x00 } , /* W */
- { 0x41,0x36,0x08,0x36,0x41,0x00 } , /* X */
- { 0x01,0x06,0x78,0x02,0x01,0x00 } , /* Y */
- { 0x61,0x51,0x49,0x45,0x43,0x00 } , /* Z */
- { 0x00,0x00,0x7F,0x41,0x41,0x00 } , /* [ */
- { 0x15,0x16,0x7C,0x16,0x11,0x00 } , /* \ */
- { 0x41,0x41,0x7F,0x00,0x00,0x00 } , /* ] */
- { 0x00,0x02,0x01,0x02,0x00,0x00 } , /* ^ */
- { 0x40,0x40,0x40,0x40,0x40,0x00 } , /* _ */
- { 0x00,0x01,0x02,0x00,0x00,0x00 } , /* ` */
- { 0x00,0x20,0x54,0x54,0x78,0x00 } , /* a */
- { 0x00,0x7F,0x44,0x44,0x38,0x00 } , /* b */
- { 0x00,0x38,0x44,0x44,0x28,0x00 } , /* c */
- { 0x00,0x38,0x44,0x44,0x7F,0x00 } , /* d */
- { 0x00,0x38,0x54,0x54,0x18,0x00 } , /* e */
- { 0x00,0x04,0x3E,0x05,0x01,0x00 } , /* f */
- { 0x00,0x08,0x54,0x54,0x3C,0x00 } , /* g */
- { 0x00,0x7F,0x04,0x04,0x78,0x00 } , /* h */
- { 0x00,0x00,0x7D,0x00,0x00,0x00 } , /* i */
- { 0x00,0x40,0x40,0x3D,0x00,0x00 } , /* j */
- { 0x00,0x7F,0x10,0x28,0x44,0x00 } , /* k */
- { 0x00,0x01,0x7F,0x00,0x00,0x00 } , /* l */
- { 0x7C,0x04,0x7C,0x04,0x78,0x00 } , /* m */
- { 0x00,0x7C,0x04,0x04,0x78,0x00 } , /* n */
- { 0x00,0x38,0x44,0x44,0x38,0x00 } , /* o */
- { 0x00,0x7C,0x14,0x14,0x08,0x00 } , /* p */
- { 0x00,0x08,0x14,0x14,0x7C,0x00 } , /* q */
- { 0x00,0x7C,0x08,0x04,0x04,0x00 } , /* r */
- { 0x00,0x48,0x54,0x54,0x24,0x00 } , /* s */
- { 0x00,0x04,0x3E,0x44,0x40,0x00 } , /* t */
- { 0x00,0x3C,0x40,0x40,0x7C,0x00 } , /* u */
- { 0x00,0x7C,0x20,0x10,0x0C,0x00 } , /* v */
- { 0x1C,0x60,0x1C,0x60,0x1C,0x00 } , /* w */
- { 0x00,0x6C,0x10,0x10,0x6C,0x00 } , /* x */
- { 0x00,0x4C,0x50,0x30,0x1C,0x00 } , /* y */
- { 0x00,0x44,0x64,0x54,0x4C,0x00 } , /* z */
- { 0x00,0x08,0x36,0x41,0x41,0x00 } , /* { */
- { 0x00,0x00,0x7F,0x00,0x00,0x00 } , /* | */
- { 0x41,0x41,0x36,0x08,0x00,0x00 } , /* } */
- { 0x08,0x04,0x08,0x10,0x08,0x00 } , /* ~ */
- { 0x00,0x00,0x00,0x00,0x00,0x00 } /*null*/
+ { 0x00,0x00,0x00,0x00,0x00,0x00 } , /*SPC */
+ { 0x00,0x00,0x5F,0x00,0x00,0x00 } , /* ! */
+ { 0x04,0x03,0x04,0x03,0x00,0x00 } , /* " */
+ { 0x28,0x7E,0x14,0x3F,0x0A,0x00 } , /* # */
+ { 0x24,0x2A,0x7F,0x2A,0x12,0x00 } , /* $ */
+ { 0x23,0x13,0x08,0x64,0x62,0x00 } , /* % */
+ { 0x30,0x4E,0x59,0x26,0x50,0x00 } , /* & */
+ { 0x00,0x00,0x02,0x01,0x00,0x00 } , /* ' */
+ { 0x00,0x00,0x1C,0x22,0x41,0x00 } , /* ( */
+ { 0x41,0x22,0x1C,0x00,0x00,0x00 } , /* ) */
+ { 0x22,0x14,0x08,0x14,0x22,0x00 } , /* * */
+ { 0x08,0x08,0x3E,0x08,0x08,0x00 } , /* + */
+ { 0x50,0x30,0x00,0x00,0x00,0x00 } , /* , */
+ { 0x08,0x08,0x08,0x08,0x08,0x00 } , /* - */
+ { 0x60,0x60,0x00,0x00,0x00,0x00 } , /* . */
+ { 0x20,0x10,0x08,0x04,0x02,0x00 } , /* / */
+ { 0x3E,0x51,0x49,0x45,0x3E,0x00 } , /* 0 */
+ { 0x00,0x42,0x7F,0x40,0x00,0x00 } , /* 1 */
+ { 0x62,0x51,0x49,0x49,0x46,0x00 } , /* 2 */
+ { 0x22,0x41,0x49,0x49,0x36,0x00 } , /* 3 */
+ { 0x18,0x14,0x12,0x7F,0x10,0x00 } , /* 4 */
+ { 0x2F,0x45,0x45,0x45,0x39,0x00 } , /* 5 */
+ { 0x3E,0x49,0x49,0x49,0x32,0x00 } , /* 6 */
+ { 0x01,0x61,0x19,0x05,0x03,0x00 } , /* 7 */
+ { 0x36,0x49,0x49,0x49,0x36,0x00 } , /* 8 */
+ { 0x26,0x49,0x49,0x49,0x3E,0x00 } , /* 9 */
+ { 0x00,0x36,0x36,0x00,0x00,0x00 } , /* : */
+ { 0x00,0x56,0x36,0x00,0x00,0x00 } , /* ; */
+ { 0x00,0x08,0x14,0x22,0x41,0x00 } , /* < */
+ { 0x14,0x14,0x14,0x14,0x14,0x00 } , /* = */
+ { 0x41,0x22,0x14,0x08,0x00,0x00 } , /* > */
+ { 0x02,0x01,0x59,0x09,0x06,0x00 } , /* ? */
+ { 0x3E,0x41,0x5D,0x55,0x2E,0x00 } , /* @ */
+ { 0x60,0x1C,0x13,0x1C,0x60,0x00 } , /* A */
+ { 0x7F,0x49,0x49,0x49,0x36,0x00 } , /* B */
+ { 0x3E,0x41,0x41,0x41,0x22,0x00 } , /* C */
+ { 0x7F,0x41,0x41,0x22,0x1C,0x00 } , /* D */
+ { 0x7F,0x49,0x49,0x49,0x41,0x00 } , /* E */
+ { 0x7F,0x09,0x09,0x09,0x01,0x00 } , /* F */
+ { 0x1C,0x22,0x41,0x49,0x3A,0x00 } , /* G */
+ { 0x7F,0x08,0x08,0x08,0x7F,0x00 } , /* H */
+ { 0x00,0x41,0x7F,0x41,0x00,0x00 } , /* I */
+ { 0x20,0x40,0x40,0x40,0x3F,0x00 } , /* J */
+ { 0x7F,0x08,0x14,0x22,0x41,0x00 } , /* K */
+ { 0x7F,0x40,0x40,0x40,0x00,0x00 } , /* L */
+ { 0x7F,0x04,0x18,0x04,0x7F,0x00 } , /* M */
+ { 0x7F,0x04,0x08,0x10,0x7F,0x00 } , /* N */
+ { 0x3E,0x41,0x41,0x41,0x3E,0x00 } , /* O */
+ { 0x7F,0x09,0x09,0x09,0x06,0x00 } , /* P */
+ { 0x3E,0x41,0x51,0x21,0x5E,0x00 } , /* Q */
+ { 0x7F,0x09,0x19,0x29,0x46,0x00 } , /* R */
+ { 0x26,0x49,0x49,0x49,0x32,0x00 } , /* S */
+ { 0x01,0x01,0x7F,0x01,0x01,0x00 } , /* T */
+ { 0x3F,0x40,0x40,0x40,0x3F,0x00 } , /* U */
+ { 0x03,0x1C,0x60,0x1C,0x03,0x00 } , /* V */
+ { 0x0F,0x70,0x0F,0x70,0x0F,0x00 } , /* W */
+ { 0x41,0x36,0x08,0x36,0x41,0x00 } , /* X */
+ { 0x01,0x06,0x78,0x02,0x01,0x00 } , /* Y */
+ { 0x61,0x51,0x49,0x45,0x43,0x00 } , /* Z */
+ { 0x00,0x00,0x7F,0x41,0x41,0x00 } , /* [ */
+ { 0x15,0x16,0x7C,0x16,0x11,0x00 } , /* \ */
+ { 0x41,0x41,0x7F,0x00,0x00,0x00 } , /* ] */
+ { 0x00,0x02,0x01,0x02,0x00,0x00 } , /* ^ */
+ { 0x40,0x40,0x40,0x40,0x40,0x00 } , /* _ */
+ { 0x00,0x01,0x02,0x00,0x00,0x00 } , /* ` */
+ { 0x00,0x20,0x54,0x54,0x78,0x00 } , /* a */
+ { 0x00,0x7F,0x44,0x44,0x38,0x00 } , /* b */
+ { 0x00,0x38,0x44,0x44,0x28,0x00 } , /* c */
+ { 0x00,0x38,0x44,0x44,0x7F,0x00 } , /* d */
+ { 0x00,0x38,0x54,0x54,0x18,0x00 } , /* e */
+ { 0x00,0x04,0x3E,0x05,0x01,0x00 } , /* f */
+ { 0x00,0x08,0x54,0x54,0x3C,0x00 } , /* g */
+ { 0x00,0x7F,0x04,0x04,0x78,0x00 } , /* h */
+ { 0x00,0x00,0x7D,0x00,0x00,0x00 } , /* i */
+ { 0x00,0x40,0x40,0x3D,0x00,0x00 } , /* j */
+ { 0x00,0x7F,0x10,0x28,0x44,0x00 } , /* k */
+ { 0x00,0x01,0x7F,0x00,0x00,0x00 } , /* l */
+ { 0x7C,0x04,0x7C,0x04,0x78,0x00 } , /* m */
+ { 0x00,0x7C,0x04,0x04,0x78,0x00 } , /* n */
+ { 0x00,0x38,0x44,0x44,0x38,0x00 } , /* o */
+ { 0x00,0x7C,0x14,0x14,0x08,0x00 } , /* p */
+ { 0x00,0x08,0x14,0x14,0x7C,0x00 } , /* q */
+ { 0x00,0x7C,0x08,0x04,0x04,0x00 } , /* r */
+ { 0x00,0x48,0x54,0x54,0x24,0x00 } , /* s */
+ { 0x00,0x04,0x3E,0x44,0x40,0x00 } , /* t */
+ { 0x00,0x3C,0x40,0x40,0x7C,0x00 } , /* u */
+ { 0x00,0x7C,0x20,0x10,0x0C,0x00 } , /* v */
+ { 0x1C,0x60,0x1C,0x60,0x1C,0x00 } , /* w */
+ { 0x00,0x6C,0x10,0x10,0x6C,0x00 } , /* x */
+ { 0x00,0x4C,0x50,0x30,0x1C,0x00 } , /* y */
+ { 0x00,0x44,0x64,0x54,0x4C,0x00 } , /* z */
+ { 0x00,0x08,0x36,0x41,0x41,0x00 } , /* { */
+ { 0x00,0x00,0x7F,0x00,0x00,0x00 } , /* | */
+ { 0x41,0x41,0x36,0x08,0x00,0x00 } , /* } */
+ { 0x08,0x04,0x08,0x10,0x08,0x00 } , /* ~ */
+ { 0x00,0x00,0x00,0x00,0x00,0x00 } /*null*/
};
ssd1331::ssd1331(PinName cs_pin, PinName rst_pin, PinName a0_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin)
- : CS(cs_pin), RES(rst_pin), DC(a0_pin), spi(mosi_pin, miso_pin, sclk_pin)
+ : CS(cs_pin), RES(rst_pin), DC(a0_pin), spi(mosi_pin, miso_pin, sclk_pin)
{
Init();
}
@@ -112,16 +112,16 @@
void ssd1331::Init(void)
{
spi.format(8,3);
- spi.frequency(24000000);
-
+ spi.frequency(48000000); // 24Mhz suggested but works at 48MHz
+
// reset
wait_ms(200);
RES = 0; //Reset active
wait_ms(200);
- RES = 1;
-
+ RES = 1;
+
// initialize sequence
- RegWrite(0xAE); //OLED display OFF
+ RegWrite(0xAE); //OLED display OFF
RegWrite(0x75); /* Set Row Address */
RegWrite(0x00); /* Start = 0 */
RegWrite(0x3F); /* End = 63 */
@@ -165,8 +165,8 @@
RegWrite(0x80);
RegWrite(0xAF); //display ON
- x_locate = 0;
- y_locate = 0;
+ char_x = 0;
+ char_y = 0;
chr_size = NORMAL;
cls();
}
@@ -178,21 +178,394 @@
void ssd1331::off()
{
- RegWrite(display_off);
+ RegWrite(display_off);
}
void ssd1331::cls()
-{
- unsigned char cmd[5]={GAC_CLEAR_WINDOW,0,0,width,height};
+{
+ unsigned char cmd[5]= {GAC_CLEAR_WINDOW,0,0,width,height};
RegWriteM(cmd,5);
wait_us(500);
background(0);
-}
+}
+
+void ssd1331::set_font(unsigned char* f)
+{
+ font = f;
+ if (font==NULL) {
+ externalfont=0; // set display.font
+ } else {
+ externalfont=1;
+ }
+}
+
+void ssd1331::PutChar(int column,int row,unsigned int value)
+{
+ if(externalfont) { // external font
+ unsigned int hor,vert,offset,bpl,j,i,b;
+ const unsigned char* sign;
+ unsigned char z,w;
+ // read font parameter from start of array
+ offset = font[0]; // bytes / char
+ hor = font[1]; // get hor size of font
+ vert = font[2]; // get vert size of font
+ bpl = font[3]; // bytes per line
+ if(value == '\n') {
+ char_x = 0;
+ char_y = char_y + vert;
+ }
+ if ((value < 31) || (value > 127)) return; // test char range
+ if (char_x + hor > 95) {
+ char_x = 0;
+ char_y = char_y + vert;
+ if (char_y >= 63 - font[2]) {
+ char_y = 0;
+ }
+ }
+ window(char_x, char_y,hor,vert);
+ sign = &font[((value -32) * offset) + 4];
+ w = sign[0];
+ for (j=0; j<vert; j++) {
+ for (i=0; i<hor; i++) {
+ z = sign[bpl * i + ((j & 0xF8) >> 3)+1];
+ b = 1 << (j & 0x07);
+ if (( z & b ) == 0x00) {
+ putp(BGround_Color);
+ } else {
+ putp(Char_Color);
+ }
+ }
+ }
+ if ((w + 2) < hor) { // x offset to next char
+ char_x += w + 2;
+ } else char_x += hor;
+
+ } else {
+ // internal font
+ if(value == '\n') {
+ char_x = 0;
+ char_y = char_y + Y_height;
+ }
+ if ((value < 31) || (value > 127)) return; // test char range
+ if (char_x + X_width > width) {
+ char_x = 0;
+ char_y = char_y + Y_height;
+ if (char_y >= height - Y_height) {
+ char_y = 0;
+ }
+ }
+ int i,j,w,lpx,lpy,k,l,xw;
+ unsigned char Temp=0;
+ j = 0; i = 0;
+ w = X_width;
+ FontSizeConvert(&lpx, &lpy);
+ xw = X_width;
+
+ for(i=0; i<xw; i++) {
+ for ( l=0; l<lpx; l++) {
+ Temp = font6x8[value-32][i];
+ for(j=Y_height-1; j>=0; j--) {
+ for (k=0; k<lpy; k++) {
+ pixel(char_x+(i*lpx)+l, char_y+(((j+1)*lpy)-1)-k, ((Temp & 0x80)==0x80) ? Char_Color : BGround_Color);
+ }
+ Temp = Temp << 1;
+ }
+ }
+ }
+ FontSizeConvert(&lpx, &lpy);
+ char_x += (w*lpx);
+ }
+}
+
+void ssd1331::dim()
+{
+ unsigned char cmd[5]= {GAC_DIM_WINDOW,0,0,width,height};
+ RegWriteM(cmd,5);
+}
+
+void ssd1331::contrast(char value)
+{
+ int v = value*20;
+ if(v>180) {
+ v=180;
+ }
+ unsigned char cmd[7];
+ cmd[0] = contrastA;
+ cmd[1] = v;
+ cmd[2] = contrastB;
+ cmd[3] = v;
+ cmd[4] = contrastC;
+ cmd[5] = v;
+ RegWriteM(cmd, 6);
+}
+
+int ssd1331::toRGB(int R,int G,int B)
+{
+ uint16_t c;
+ c = R >> 3;
+ c <<= 6;
+ c |= G >> 2;
+ c <<= 5;
+ c |= B >> 3;
+ return c;
+}
+
+void ssd1331::rectangle(int x1,int y1,int x2,int y2,unsigned int colorline)
+{
+ if ( x1 < 0 ) x1 = 0;
+ else if ( x1 > width ) x1 = width;
+ if ( y1 < 0 ) y1 = 0;
+ else if ( y1 > height ) y1 = height;
+ if ( x2 < 0 ) x2 = 0;
+ else if ( x2 > width ) x2 = width;
+ if ( y2 < 0 ) y2 = 0;
+ else if ( y2 > height ) y2 = height;
+
+ unsigned char cmd[11]= { 0 };
+ cmd[0] = GAC_FILL_ENABLE_DISABLE;
+ cmd[1] = 0; // fill 1, empty 0
+ RegWriteM(cmd, 2);
+ cmd[0] = GAC_DRAW_RECTANGLE;
+ cmd[1] = (unsigned char)x1;
+ cmd[2] = (unsigned char)y1;
+ cmd[3] = (unsigned char)x2;
+ cmd[4] = (unsigned char)y2;
+ cmd[5] = (unsigned char)((colorline>> 11) << 1); // Outline Blue
+ cmd[6] = (unsigned char)((colorline>> 5 ) & 0x3F); // Outline Green
+ cmd[7] = (unsigned char)((colorline<< 1 ) & 0x3F); // Outline Red
+ cmd[8] = (0);
+ cmd[9] = (0);
+ cmd[10]= (0);
+ RegWriteM(cmd, 11);
+ wait_us(500);
+}
+
+void ssd1331::fillrectangle(int x1,int y1,int x2,int y2,unsigned int colorline,unsigned int colorfill)
+{
+ if ( x1 < 0 ) x1 = 0;
+ else if ( x1 > width ) x1 = width;
+ if ( y1 < 0 ) y1 = 0;
+ else if ( y1 > height ) y1 = height;
+ if ( x2 < 0 ) x2 = 0;
+ else if ( x2 > width ) x2 = width;
+ if ( y2 < 0 ) y2 = 0;
+ else if ( y2 > height ) y2 = height;
+
+ unsigned char cmd[11]= { 0 };
+ cmd[0] = GAC_FILL_ENABLE_DISABLE;
+ cmd[1] = 1; // fill 1, empty 0
+ RegWriteM(cmd, 2);
+ cmd[0] = GAC_DRAW_RECTANGLE;
+ cmd[1] = (unsigned char)x1;
+ cmd[2] = (unsigned char)y1;
+ cmd[3] = (unsigned char)x2;
+ cmd[4] = (unsigned char)y2;
+ cmd[5] = (unsigned char)((colorline>> 11) << 1); // Outline Blue
+ cmd[6] = (unsigned char)((colorline>> 5 ) & 0x3F); // Outline Green
+ cmd[7] = (unsigned char)((colorline<< 1 ) & 0x3F); // Outline Red
+ cmd[8] = (unsigned char)((colorfill>> 11) << 1); // fill Blue
+ cmd[9] = (unsigned char)((colorfill>> 5 ) & 0x3F); // fill Green
+ cmd[10]= (unsigned char)((colorfill<< 1 ) & 0x3F); // fill Red
+ RegWriteM(cmd, 11);
+ wait_us(500);
+}
+
+void ssd1331::line(int x1,int y1,int x2,int y2,unsigned int color)
+{
+ if ( x1 < 0 ) x1 = 0;
+ else if ( x1 > width ) x1 = width;
+ if ( y1 < 0 ) y1 = 0;
+ else if ( y1 > height ) y1 = height;
+ if ( x2 < 0 ) x2 = 0;
+ else if ( x2 > width ) x2 = width;
+ if ( y2 < 0 ) y2 = 0;
+ else if ( y2 > height ) y2 = height;
+
+ unsigned char cmd[11]= { 0 };
+ cmd[0] = GAC_FILL_ENABLE_DISABLE;
+ cmd[1] = 0; // fill 0, empty 0
+ RegWriteM(cmd, 2);
+ cmd[0] = GAC_DRAW_LINE;
+ cmd[1] = (unsigned char)x1;
+ cmd[2] = (unsigned char)y1;
+ cmd[3] = (unsigned char)x2;
+ cmd[4] = (unsigned char)y2;
+ cmd[5] = (unsigned char)(((color>>11)&0x1F)<<1); // Blue
+ cmd[6] = (unsigned char)((color>>5)&0x3F); // Green
+ cmd[7] = (unsigned char)((color&0x1F)<<1); // Red
+ RegWriteM(cmd, 8);
+ wait_us(500);
+}
+
+void ssd1331::circle (int radius, int x, int y , unsigned int col, int fill)
+{
+ int cx, cy, d;
+ d = 3 - 2 * radius;
+ cy = radius;
+ pixel(x, radius+y, col);
+ pixel(x, -radius+y, col);
+ pixel(radius+x, y, col);
+ pixel(-radius+x, y, col);
+ if(fill) {
+ line(x,radius+y,x,-radius+y,col);
+ line( radius+x,y,-radius+x,y,col);
+ }
+
+ for (cx = 0; cx <= cy; cx++) {
+ if(d>=0) {
+ d+=10+4*cx-4*cy;
+ cy--;
+ } else {
+ d+=6+4*cx;
+ }
+ pixel(cy+x, cx+y, col);
+ pixel(cx+x, cy+y, col);
+ pixel(-cx+x, cy+y, col);
+ pixel(-cy+x, cx+y, col);
+ pixel(-cy+x, -cx+y, col);
+ pixel(-cx+x, -cy+y, col);
+ pixel(cx+x, -cy+y, col);
+ pixel(cy+x, -cx+y, col);
+ if(fill) {
+ line(cy+x, cx+y, cy+x, -cx+y, col);
+ line(cx+x, cy+y, cx+x, -cy + y, col);
+ line(-cx+x, cy+y, -cx+x, cy+y, col);
+ line(-cy+x, cx+y, -cy+x, cx+y, col);
+ line(-cy+x, -cx+y, -cy+x, cx+y, col);
+ line(-cx+x, -cy+y, -cx+x, cy+y, col);
+ line(cx+x, -cy+y, cx+x, cy+y, col);
+ line(cy+x, -cx+y, cy+x, cx+y, col);
+ }
+ }
+}
+
+void ssd1331::ScrollSet(int horizontal, int startline, int linecount, int vertical , int frame_interval)
+{
+ unsigned char cmd[7];
+ if((startline>height+1)||((startline+linecount)>height+1)) return ;
+ if ( frame_interval > 3 ) frame_interval = 3;
+ cmd[0] = SCROLL_SETUP; //
+ cmd[1] = horizontal;
+ cmd[2] = startline;
+ cmd[3] = linecount;
+ cmd[4] = vertical;
+ cmd[5] = frame_interval;
+ RegWriteM(cmd,6);
+}
+void ssd1331::drawBitmap( const uint8_t *bitmap, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
+
+ int16_t i, j, byteWidth = (w + 7) / 8;
+ for(j=0; j<h; j++) {
+ for(i=0; i<w; i++ ) {
+ if(bitmap[ j * byteWidth + i / 8] & (128 >> (i & 7))) {
+ pixel(x+i, y+j, color);
+ }
+ }
+ }
+}
+
+int ssd1331::BMP_16(const char *Name_BMP, unsigned int x, unsigned int y)
+{
+#define OffsetPixelWidth 18
+#define OffsetPixelHeigh 22
+#define OffsetFileSize 34
+#define OffsetPixData 10
+#define OffsetBPP 28
+
+ char filename[50];
+ unsigned char BMP_Header[54];
+ unsigned short BPP_t;
+ unsigned int PixelWidth,PixelHeigh,start_data;
+ unsigned int i,off;
+ int padd,j;
+ unsigned short *line;
+
+ // get the filename
+ i=0;
+ while (*Name_BMP!='\0') {
+ filename[i++]=*Name_BMP++;
+ }
+ filename[i] = 0;
+
+ FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file
+ if (!Image) {
+ return(0); // error file not found !
+ }
+
+ fread(&BMP_Header[0],1,54,Image); // get the BMP Header
+
+ if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
+ fclose(Image);
+ return(-1); // error no BMP file
+ }
+
+ BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
+ if (BPP_t != 0x0010) {
+ fclose(Image);
+ return(-2); // error no 16 bit BMP
+ }
+
+ PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
+ PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
+ if (PixelHeigh > height + y || PixelWidth > width + x) {
+ fclose(Image);
+ return(-3); // to big
+ }
+
+ start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
+
+ line = (unsigned short *) malloc (2 * PixelHeigh); // we need a buffer for a line
+ if (line == NULL) {
+ return(-4); // error no memory
+ }
+ // the bmp lines are padded to multiple of 4 bytes
+ padd = -1;
+ do {
+ padd ++;
+ } while ((PixelHeigh * 2 + padd)%4 != 0);
+
+ window(x, y,PixelWidth ,PixelHeigh);
+
+ for (j = PixelWidth - 1; j >= 0; j--) { //Lines bottom up
+ off = j * (PixelHeigh * 2 + padd) + start_data; // start of line
+ fseek(Image, off ,SEEK_SET);
+ fread(line,1,PixelHeigh * 2,Image); // read a line - slow
+ for (i = 0; i < PixelHeigh; i++) { // copy pixel data to TFT
+
+ DataWrite(line[i]);
+ }
+ }
+ free (line);
+ fclose(Image);
+ window(0,0,width,height);
+ return(1);
+}
+
+void ssd1331::Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y)
+{
+ unsigned char cmd[8]= { 0 };
+ if ((src_x1>width)||(src_y1>height)||(src_x2>width)||(src_y2>height)) return;
+ if ((dst_x>width)||(dst_y>height))return;
+ cmd[0] = GAC_COPY_AREA; //
+ cmd[1] = (unsigned char)src_x1;
+ cmd[2] = (unsigned char)src_y1;
+ cmd[3] = (unsigned char)src_x2;
+ cmd[4] = (unsigned char)src_y2;
+ cmd[5] = (unsigned char)dst_x;
+ cmd[6] = (unsigned char)dst_y;
+ RegWriteM(cmd,7);
+}
+
+void ssd1331::Fill_Screen(unsigned int color)
+{
+ BGround_Color = color;
+ fillrectangle(0,0,width,height,color,color);
+}
void ssd1331::locate(int column, int row)
{
- x_locate = column;
- y_locate = row;
+ char_x = column;
+ char_y = row;
}
void ssd1331::foreground(unsigned int color)
@@ -209,299 +582,99 @@
chr_size = Csize;
}
-void ssd1331::Fill_Screen(unsigned int color)
-{
- BGround_Color = color;
- fillrectangle(0,0,width,height,color,color);
-}
-
-void ssd1331::dim()
-{
- unsigned char cmd[5]={GAC_DIM_WINDOW,0,0,width,height};
- RegWriteM(cmd,5);
-}
-
-void ssd1331::contrast(char value)
-{
- int v = value*20;
- if(v>180){v=180;}
- unsigned char cmd[7];
- cmd[0] = contrastA;
- cmd[1] = v;
- cmd[2] = contrastB;
- cmd[3] = v;
- cmd[4] = contrastC;
- cmd[5] = v;
- RegWriteM(cmd, 6);
-}
-
-int ssd1331::toRGB(int R,int G,int B)
-{
- uint16_t c;
- c = R >> 3;
- c <<= 6;
- c |= G >> 2;
- c <<= 5;
- c |= B >> 3;
- return c;
-}
-
-void ssd1331::rectangle(int x1,int y1,int x2,int y2,unsigned int colorline)
+void ssd1331::putp(int colour)
{
- if ( x1 < 0 ) x1 = 0;
- else if ( x1 > width ) x1 = width;
- if ( y1 < 0 ) y1 = 0;
- else if ( y1 > height ) y1 = height;
- if ( x2 < 0 ) x2 = 0;
- else if ( x2 > width ) x2 = width;
- if ( y2 < 0 ) y2 = 0;
- else if ( y2 > height ) y2 = height;
-
- unsigned char cmd[11]={ 0 };
- cmd[0] = GAC_FILL_ENABLE_DISABLE;
- cmd[1] = 0; // fill 1, empty 0
- RegWriteM(cmd, 2);
- cmd[0] = GAC_DRAW_RECTANGLE;
- cmd[1] = (unsigned char)x1;
- cmd[2] = (unsigned char)y1;
- cmd[3] = (unsigned char)x2;
- cmd[4] = (unsigned char)y2;
- cmd[5] = (unsigned char)((colorline>> 11) << 1); // Outline Blue
- cmd[6] = (unsigned char)((colorline>> 5 ) & 0x3F); // Outline Green
- cmd[7] = (unsigned char)((colorline<< 1 ) & 0x3F); // Outline Red
- cmd[8] = (0);
- cmd[9] = (0);
- cmd[10]= (0);
- RegWriteM(cmd, 11);
- wait_us(500);
-}
-
-void ssd1331::fillrectangle(int x1,int y1,int x2,int y2,unsigned int colorline,unsigned int colorfill)
-{
- if ( x1 < 0 ) x1 = 0;
- else if ( x1 > width ) x1 = width;
- if ( y1 < 0 ) y1 = 0;
- else if ( y1 > height ) y1 = height;
- if ( x2 < 0 ) x2 = 0;
- else if ( x2 > width ) x2 = width;
- if ( y2 < 0 ) y2 = 0;
- else if ( y2 > height ) y2 = height;
-
- unsigned char cmd[11]={ 0 };
- cmd[0] = GAC_FILL_ENABLE_DISABLE;
- cmd[1] = 1; // fill 1, empty 0
- RegWriteM(cmd, 2);
- cmd[0] = GAC_DRAW_RECTANGLE;
- cmd[1] = (unsigned char)x1;
- cmd[2] = (unsigned char)y1;
- cmd[3] = (unsigned char)x2;
- cmd[4] = (unsigned char)y2;
- cmd[5] = (unsigned char)((colorline>> 11) << 1); // Outline Blue
- cmd[6] = (unsigned char)((colorline>> 5 ) & 0x3F); // Outline Green
- cmd[7] = (unsigned char)((colorline<< 1 ) & 0x3F); // Outline Red
- cmd[8] = (unsigned char)((colorfill>> 11) << 1); // fill Blue
- cmd[9] = (unsigned char)((colorfill>> 5 ) & 0x3F); // fill Green
- cmd[10]= (unsigned char)((colorfill<< 1 ) & 0x3F); // fill Red
- RegWriteM(cmd, 11);
- wait_us(500);
-}
-
-void ssd1331::line(int x1,int y1,int x2,int y2,unsigned int color)
-{
- if ( x1 < 0 ) x1 = 0;
- else if ( x1 > width ) x1 = width;
- if ( y1 < 0 ) y1 = 0;
- else if ( y1 > height ) y1 = height;
- if ( x2 < 0 ) x2 = 0;
- else if ( x2 > width ) x2 = width;
- if ( y2 < 0 ) y2 = 0;
- else if ( y2 > height ) y2 = height;
-
- unsigned char cmd[11]={ 0 };
- cmd[0] = GAC_FILL_ENABLE_DISABLE;
- cmd[1] = 0; // fill 0, empty 0
- RegWriteM(cmd, 2);
- cmd[0] = GAC_DRAW_LINE;
- cmd[1] = (unsigned char)x1;
- cmd[2] = (unsigned char)y1;
- cmd[3] = (unsigned char)x2;
- cmd[4] = (unsigned char)y2;
- cmd[5] = (unsigned char)(((color>>11)&0x1F)<<1); // Blue
- cmd[6] = (unsigned char)((color>>5)&0x3F); // Green
- cmd[7] = (unsigned char)((color&0x1F)<<1); // Red
- RegWriteM(cmd, 8);
- wait_us(500);
-}
-
-void ssd1331::circle (int radius, int x, int y , unsigned int col, int fill)
-{
- int cx, cy, d;
- d = 3 - 2 * radius;
- cy = radius;
- pixel(x, radius+y, col);
- pixel(x, -radius+y, col);
- pixel(radius+x, y, col);
- pixel(-radius+x, y, col);
- if(fill){
- line(x,radius+y,x,-radius+y,col);
- line( radius+x,y,-radius+x,y,col);
- }
-
- for (cx = 0; cx <= cy; cx++){
- if(d>=0){
- d+=10+4*cx-4*cy;
- cy--;
- }else{
- d+=6+4*cx;
- }
- pixel(cy+x, cx+y, col);
- pixel(cx+x, cy+y, col);
- pixel(-cx+x, cy+y, col);
- pixel(-cy+x, cx+y, col);
- pixel(-cy+x, -cx+y, col);
- pixel(-cx+x, -cy+y, col);
- pixel(cx+x, -cy+y, col);
- pixel(cy+x, -cx+y, col);
- if(fill){
- line(cy+x, cx+y, cy+x, -cx+y, col);
- line(cx+x, cy+y, cx+x, -cy + y, col);
- line(-cx+x, cy+y, -cx+x, cy+y, col);
- line(-cy+x, cx+y, -cy+x, cx+y, col);
- line(-cy+x, -cx+y, -cy+x, cx+y, col);
- line(-cx+x, -cy+y, -cx+x, cy+y, col);
- line(cx+x, -cy+y, cx+x, cy+y, col);
- line(cy+x, -cx+y, cy+x, cx+y, col);
- }
- }
-}
-
-void ssd1331::pixel(int x,int y,unsigned int Color)
-{
- unsigned char cmd[7]={Set_Column_Address,0x00,0x00,Set_Row_Address,0x00,0x00};
- if ((x<0)||(y<0)||(x>width)||(y>height)) return ;
- cmd[1] = (unsigned char)x;
- cmd[2] = (unsigned char)x;
- cmd[4] = (unsigned char)y;
- cmd[5] = (unsigned char)y;
- RegWriteM(cmd, 6);
- DataWrite_to(Color);
-}
-
-void ssd1331::ScrollSet(int horizontal, int startline, int linecount, int vertical , int frame_interval)
-{
- unsigned char cmd[7];
- if((startline>height+1)||((startline+linecount)>height+1)) return ;
- if ( frame_interval > 3 ) frame_interval = 3;
- cmd[0] = SCROLL_SETUP; //
- cmd[1] = horizontal;
- cmd[2] = startline;
- cmd[3] = linecount;
- cmd[4] = vertical;
- cmd[5] = frame_interval;
- RegWriteM(cmd,6);
-}
-
-void ssd1331::Scrollstart()
-{
- RegWrite(SCROLL_START);
-}
-
-void ssd1331::Scrollstop()
-{
- RegWrite(SCROLL_STOP);
-}
-
-void ssd1331::PutChar(int x,int y,unsigned int a)
-{
- int i,j;
- unsigned char Temp=0;
- int lpx, lpy, k,l;
- int xw;
- j = 0;
- i = 0;
-
- FontSizeConvert(&lpx, &lpy);
- xw = X_width;
- if(a < 32)a=32;
-
- for(i=0; i<xw; i++){
- for ( l=0;l<lpx;l++){
- Temp = font6x8[a-32][i];
- for(j=Y_width-1;j>=0;j--){
- for (k=0;k<lpy;k++){
- pixel(x+(i*lpx)+l, y+(((j+1)*lpy)-1)-k, ((Temp & 0x80)==0x80) ? Char_Color : BGround_Color);
- }
- Temp = Temp << 1;
- }
+ pixel(_x, _y, colour);
+// wait_us(1000);
+ _x++;
+ if(_x > _x2) {
+ _x = _x1;
+ _y++;
+ if(_y > _y2) {
+ _y = _y1;
}
}
}
int ssd1331::_putc( int c )
-{
- int lpx, lpy, w;
- w = X_width;
- PutChar( x_locate , y_locate ,c);
- FontSizeConvert(&lpx, &lpy);
- x_locate += (w*lpx);
-
+{
+ PutChar( char_x , char_y ,c);
return c;
}
-int ssd1331::_getc()
+void ssd1331::pixel(int x,int y,unsigned int Color)
+{
+ unsigned char cmd[7]= {Set_Column_Address,0x00,0x00,Set_Row_Address,0x00,0x00};
+ if ((x<0)||(y<0)||(x>width)||(y>height)) return ;
+ cmd[1] = (unsigned char)x;
+ cmd[2] = (unsigned char)x;
+ cmd[4] = (unsigned char)y;
+ cmd[5] = (unsigned char)y;
+ RegWriteM(cmd, 6);
+ DataWrite_to(Color);
+}
+
+void ssd1331::window(int x, int y, int w, int h)
+{
+ // current pixel location
+ _x = x;
+ _y = y;
+ // window settings
+ _x1 = x;
+ _x2 = x + w - 1;
+ _y1 = y;
+ _y2 = y + h - 1;
+}
+
+void ssd1331::Scrollstart()
+{
+ RegWrite(SCROLL_START);
+}
+
+void ssd1331::Scrollstop()
+{
+ RegWrite(SCROLL_STOP);
+}
+
+int ssd1331::_getc()
{
return -1;
}
int ssd1331::row()
{
- return y_locate;
+ return char_y;
}
int ssd1331::column()
{
- return x_locate;
-}
-
-void ssd1331::Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y)
-{
- unsigned char cmd[8]={ 0 };
- if ((src_x1>width)||(src_y1>height)||(src_x2>width)||(src_y2>height)) return;
- if ((dst_x>width)||(dst_y>height))return;
- cmd[0] = GAC_COPY_AREA; //
- cmd[1] = (unsigned char)src_x1;
- cmd[2] = (unsigned char)src_y1;
- cmd[3] = (unsigned char)src_x2;
- cmd[4] = (unsigned char)src_y2;
- cmd[5] = (unsigned char)dst_x;
- cmd[6] = (unsigned char)dst_y;
- RegWriteM(cmd,7);
+ return char_x;
}
void ssd1331::FontSizeConvert(int *lpx,int *lpy)
{
- switch( chr_size ){
- case WIDE:
- *lpx=2;
- *lpy=1;
- break;
- case HIGH:
- *lpx=1;
- *lpy=2;
- break;
- case WH :
- *lpx=2;
- *lpy=2;
- break;
- case WHx36 :
- *lpx=6;
- *lpy=6;
- break;
- case NORMAL:
- default:
- *lpx=1;
- *lpy=1;
- break;
- }
+ switch( chr_size ) {
+ case WIDE:
+ *lpx=2;
+ *lpy=1;
+ break;
+ case HIGH:
+ *lpx=1;
+ *lpy=2;
+ break;
+ case WH :
+ *lpx=2;
+ *lpy=2;
+ break;
+ case WHx36 :
+ *lpx=6;
+ *lpy=6;
+ break;
+ case NORMAL:
+ default:
+ *lpx=1;
+ *lpy=1;
+ break;
+ }
}
void ssd1331::RegWrite(unsigned char Command)
@@ -517,25 +690,25 @@
int i;
DC = 0; // Command
CS = 0; // CS enable
- for( i=0;i<count;i++){
- spi.write(*Command++);
+ for( i=0; i<count; i++) {
+ spi.write(*Command++);
}
CS = 1; // CS dissable
}
void ssd1331::DataWrite(unsigned char c)
{
- DC = 1; // DATA
- CS = 0; // CS enable
- spi.write(c);
- CS = 1; // CS dissable
+ DC = 1; // DATA
+ CS = 0; // CS enable
+ spi.write(c);
+ CS = 1; // CS dissable
}
void ssd1331::DataWrite_to(unsigned int Dat)
{
- DC = 1; // DATA
- CS = 0; // CS enable
- spi.write((unsigned char)((Dat >> 8)));
- spi.write((unsigned char)(Dat));
- CS = 1; // CS dissable
+ DC = 1; // DATA
+ CS = 0; // CS enable
+ spi.write((unsigned char)((Dat >> 8)));
+ spi.write((unsigned char)(Dat));
+ CS = 1; // CS dissable
}
--- a/ssd1331.h Tue Apr 26 22:51:28 2016 +0000
+++ b/ssd1331.h Sun May 01 12:37:44 2016 +0000
@@ -4,7 +4,6 @@
#include "mbed.h"
-
// Screen Settings
#define width 96-1 // Max X axial direction in screen
#define height 64-1 // Max Y axial direction in screen
@@ -23,7 +22,7 @@
#define WH 3
#define WHx36 4
#define X_width 6 // character's width
-#define Y_width 8 // character's height
+#define Y_height 8 // character's height
// GAC hardware acceleration commands
@@ -160,6 +159,13 @@
void Scrollstart();
void Scrollstop();
void Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y);
+ void character(int x, int y, int c);
+ void set_font(unsigned char* f);
+ void drawBitmap(const uint8_t *bitmap, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+ int BMP_16(const char *Name_BMP, unsigned int x, unsigned int y);
+
+ int DrawBitmapFile(const char *Name_BMP);
+
protected:
// Stream implementation functions
@@ -173,14 +179,30 @@
void DataWrite_to(unsigned int Dat);
void FontSizeConvert(int *lpx, int *lpy);
void PutChar(int x,int y,unsigned int a);
+ void PutCharInt(int x,int y,unsigned int a);
+ void putp(int colour);
+ unsigned char* font;
unsigned int Char_Color; // text color
unsigned int BGround_Color; // background color
- int x_locate;
- int y_locate;
+ void window(int x, int y, int w, int h);
+ // pixel location
+ short _x;
+ short _y;
+
+ // window location
+ short _x1;
+ short _x2;
+ short _y1;
+ short _y2;
+ int char_x;
+ int char_y;
int chr_size;
-
+ int cwidth; // character's width
+ int cvert; // character's height
+ int externalfont;
DigitalOut CS, RES, DC;
SPI spi; // mosi, miso, sclk
};
-#endif
\ No newline at end of file
+#endif
+
Display Module .95" 96x64 Oled with SPI interface