SSD1331 Oled driver library for 96x64 colour Oled display. Demo included in .h file
Dependents: Oled-SSD1331 PJ12_device
Diff: ssd1331.cpp
- Revision:
- 1:f3f6624f45d4
- Parent:
- 0:3d7d1aec706b
- Child:
- 2:1204274fad8f
--- 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 }