SSD1331 Oled driver library for 96x64 colour Oled display. Demo included in .h file

Dependents:   Oled-SSD1331 PJ12_device

Committer:
star297
Date:
Tue Apr 26 22:51:28 2016 +0000
Revision:
0:3d7d1aec706b
Child:
1:f3f6624f45d4
Initial version v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 0:3d7d1aec706b 1
star297 0:3d7d1aec706b 2 #include "mbed.h"
star297 0:3d7d1aec706b 3 #include "ssd1331.h"
star297 0:3d7d1aec706b 4
star297 0:3d7d1aec706b 5 #define countof(x) ( sizeof(x) / sizeof(x[0]) )
star297 0:3d7d1aec706b 6
star297 0:3d7d1aec706b 7 static const char font6x8[0x60][6] = {
star297 0:3d7d1aec706b 8 { 0x00,0x00,0x00,0x00,0x00,0x00 } , /*SPC */
star297 0:3d7d1aec706b 9 { 0x00,0x00,0x5F,0x00,0x00,0x00 } , /* ! */
star297 0:3d7d1aec706b 10 { 0x04,0x03,0x04,0x03,0x00,0x00 } , /* " */
star297 0:3d7d1aec706b 11 { 0x28,0x7E,0x14,0x3F,0x0A,0x00 } , /* # */
star297 0:3d7d1aec706b 12 { 0x24,0x2A,0x7F,0x2A,0x12,0x00 } , /* $ */
star297 0:3d7d1aec706b 13 { 0x23,0x13,0x08,0x64,0x62,0x00 } , /* % */
star297 0:3d7d1aec706b 14 { 0x30,0x4E,0x59,0x26,0x50,0x00 } , /* & */
star297 0:3d7d1aec706b 15 { 0x00,0x00,0x02,0x01,0x00,0x00 } , /* ' */
star297 0:3d7d1aec706b 16 { 0x00,0x00,0x1C,0x22,0x41,0x00 } , /* ( */
star297 0:3d7d1aec706b 17 { 0x41,0x22,0x1C,0x00,0x00,0x00 } , /* ) */
star297 0:3d7d1aec706b 18 { 0x22,0x14,0x08,0x14,0x22,0x00 } , /* * */
star297 0:3d7d1aec706b 19 { 0x08,0x08,0x3E,0x08,0x08,0x00 } , /* + */
star297 0:3d7d1aec706b 20 { 0x50,0x30,0x00,0x00,0x00,0x00 } , /* , */
star297 0:3d7d1aec706b 21 { 0x08,0x08,0x08,0x08,0x08,0x00 } , /* - */
star297 0:3d7d1aec706b 22 { 0x60,0x60,0x00,0x00,0x00,0x00 } , /* . */
star297 0:3d7d1aec706b 23 { 0x20,0x10,0x08,0x04,0x02,0x00 } , /* / */
star297 0:3d7d1aec706b 24 { 0x3E,0x51,0x49,0x45,0x3E,0x00 } , /* 0 */
star297 0:3d7d1aec706b 25 { 0x00,0x42,0x7F,0x40,0x00,0x00 } , /* 1 */
star297 0:3d7d1aec706b 26 { 0x62,0x51,0x49,0x49,0x46,0x00 } , /* 2 */
star297 0:3d7d1aec706b 27 { 0x22,0x41,0x49,0x49,0x36,0x00 } , /* 3 */
star297 0:3d7d1aec706b 28 { 0x18,0x14,0x12,0x7F,0x10,0x00 } , /* 4 */
star297 0:3d7d1aec706b 29 { 0x2F,0x45,0x45,0x45,0x39,0x00 } , /* 5 */
star297 0:3d7d1aec706b 30 { 0x3E,0x49,0x49,0x49,0x32,0x00 } , /* 6 */
star297 0:3d7d1aec706b 31 { 0x01,0x61,0x19,0x05,0x03,0x00 } , /* 7 */
star297 0:3d7d1aec706b 32 { 0x36,0x49,0x49,0x49,0x36,0x00 } , /* 8 */
star297 0:3d7d1aec706b 33 { 0x26,0x49,0x49,0x49,0x3E,0x00 } , /* 9 */
star297 0:3d7d1aec706b 34 { 0x00,0x36,0x36,0x00,0x00,0x00 } , /* : */
star297 0:3d7d1aec706b 35 { 0x00,0x56,0x36,0x00,0x00,0x00 } , /* ; */
star297 0:3d7d1aec706b 36 { 0x00,0x08,0x14,0x22,0x41,0x00 } , /* < */
star297 0:3d7d1aec706b 37 { 0x14,0x14,0x14,0x14,0x14,0x00 } , /* = */
star297 0:3d7d1aec706b 38 { 0x41,0x22,0x14,0x08,0x00,0x00 } , /* > */
star297 0:3d7d1aec706b 39 { 0x02,0x01,0x59,0x09,0x06,0x00 } , /* ? */
star297 0:3d7d1aec706b 40 { 0x3E,0x41,0x5D,0x55,0x2E,0x00 } , /* @ */
star297 0:3d7d1aec706b 41 { 0x60,0x1C,0x13,0x1C,0x60,0x00 } , /* A */
star297 0:3d7d1aec706b 42 { 0x7F,0x49,0x49,0x49,0x36,0x00 } , /* B */
star297 0:3d7d1aec706b 43 { 0x3E,0x41,0x41,0x41,0x22,0x00 } , /* C */
star297 0:3d7d1aec706b 44 { 0x7F,0x41,0x41,0x22,0x1C,0x00 } , /* D */
star297 0:3d7d1aec706b 45 { 0x7F,0x49,0x49,0x49,0x41,0x00 } , /* E */
star297 0:3d7d1aec706b 46 { 0x7F,0x09,0x09,0x09,0x01,0x00 } , /* F */
star297 0:3d7d1aec706b 47 { 0x1C,0x22,0x41,0x49,0x3A,0x00 } , /* G */
star297 0:3d7d1aec706b 48 { 0x7F,0x08,0x08,0x08,0x7F,0x00 } , /* H */
star297 0:3d7d1aec706b 49 { 0x00,0x41,0x7F,0x41,0x00,0x00 } , /* I */
star297 0:3d7d1aec706b 50 { 0x20,0x40,0x40,0x40,0x3F,0x00 } , /* J */
star297 0:3d7d1aec706b 51 { 0x7F,0x08,0x14,0x22,0x41,0x00 } , /* K */
star297 0:3d7d1aec706b 52 { 0x7F,0x40,0x40,0x40,0x00,0x00 } , /* L */
star297 0:3d7d1aec706b 53 { 0x7F,0x04,0x18,0x04,0x7F,0x00 } , /* M */
star297 0:3d7d1aec706b 54 { 0x7F,0x04,0x08,0x10,0x7F,0x00 } , /* N */
star297 0:3d7d1aec706b 55 { 0x3E,0x41,0x41,0x41,0x3E,0x00 } , /* O */
star297 0:3d7d1aec706b 56 { 0x7F,0x09,0x09,0x09,0x06,0x00 } , /* P */
star297 0:3d7d1aec706b 57 { 0x3E,0x41,0x51,0x21,0x5E,0x00 } , /* Q */
star297 0:3d7d1aec706b 58 { 0x7F,0x09,0x19,0x29,0x46,0x00 } , /* R */
star297 0:3d7d1aec706b 59 { 0x26,0x49,0x49,0x49,0x32,0x00 } , /* S */
star297 0:3d7d1aec706b 60 { 0x01,0x01,0x7F,0x01,0x01,0x00 } , /* T */
star297 0:3d7d1aec706b 61 { 0x3F,0x40,0x40,0x40,0x3F,0x00 } , /* U */
star297 0:3d7d1aec706b 62 { 0x03,0x1C,0x60,0x1C,0x03,0x00 } , /* V */
star297 0:3d7d1aec706b 63 { 0x0F,0x70,0x0F,0x70,0x0F,0x00 } , /* W */
star297 0:3d7d1aec706b 64 { 0x41,0x36,0x08,0x36,0x41,0x00 } , /* X */
star297 0:3d7d1aec706b 65 { 0x01,0x06,0x78,0x02,0x01,0x00 } , /* Y */
star297 0:3d7d1aec706b 66 { 0x61,0x51,0x49,0x45,0x43,0x00 } , /* Z */
star297 0:3d7d1aec706b 67 { 0x00,0x00,0x7F,0x41,0x41,0x00 } , /* [ */
star297 0:3d7d1aec706b 68 { 0x15,0x16,0x7C,0x16,0x11,0x00 } , /* \ */
star297 0:3d7d1aec706b 69 { 0x41,0x41,0x7F,0x00,0x00,0x00 } , /* ] */
star297 0:3d7d1aec706b 70 { 0x00,0x02,0x01,0x02,0x00,0x00 } , /* ^ */
star297 0:3d7d1aec706b 71 { 0x40,0x40,0x40,0x40,0x40,0x00 } , /* _ */
star297 0:3d7d1aec706b 72 { 0x00,0x01,0x02,0x00,0x00,0x00 } , /* ` */
star297 0:3d7d1aec706b 73 { 0x00,0x20,0x54,0x54,0x78,0x00 } , /* a */
star297 0:3d7d1aec706b 74 { 0x00,0x7F,0x44,0x44,0x38,0x00 } , /* b */
star297 0:3d7d1aec706b 75 { 0x00,0x38,0x44,0x44,0x28,0x00 } , /* c */
star297 0:3d7d1aec706b 76 { 0x00,0x38,0x44,0x44,0x7F,0x00 } , /* d */
star297 0:3d7d1aec706b 77 { 0x00,0x38,0x54,0x54,0x18,0x00 } , /* e */
star297 0:3d7d1aec706b 78 { 0x00,0x04,0x3E,0x05,0x01,0x00 } , /* f */
star297 0:3d7d1aec706b 79 { 0x00,0x08,0x54,0x54,0x3C,0x00 } , /* g */
star297 0:3d7d1aec706b 80 { 0x00,0x7F,0x04,0x04,0x78,0x00 } , /* h */
star297 0:3d7d1aec706b 81 { 0x00,0x00,0x7D,0x00,0x00,0x00 } , /* i */
star297 0:3d7d1aec706b 82 { 0x00,0x40,0x40,0x3D,0x00,0x00 } , /* j */
star297 0:3d7d1aec706b 83 { 0x00,0x7F,0x10,0x28,0x44,0x00 } , /* k */
star297 0:3d7d1aec706b 84 { 0x00,0x01,0x7F,0x00,0x00,0x00 } , /* l */
star297 0:3d7d1aec706b 85 { 0x7C,0x04,0x7C,0x04,0x78,0x00 } , /* m */
star297 0:3d7d1aec706b 86 { 0x00,0x7C,0x04,0x04,0x78,0x00 } , /* n */
star297 0:3d7d1aec706b 87 { 0x00,0x38,0x44,0x44,0x38,0x00 } , /* o */
star297 0:3d7d1aec706b 88 { 0x00,0x7C,0x14,0x14,0x08,0x00 } , /* p */
star297 0:3d7d1aec706b 89 { 0x00,0x08,0x14,0x14,0x7C,0x00 } , /* q */
star297 0:3d7d1aec706b 90 { 0x00,0x7C,0x08,0x04,0x04,0x00 } , /* r */
star297 0:3d7d1aec706b 91 { 0x00,0x48,0x54,0x54,0x24,0x00 } , /* s */
star297 0:3d7d1aec706b 92 { 0x00,0x04,0x3E,0x44,0x40,0x00 } , /* t */
star297 0:3d7d1aec706b 93 { 0x00,0x3C,0x40,0x40,0x7C,0x00 } , /* u */
star297 0:3d7d1aec706b 94 { 0x00,0x7C,0x20,0x10,0x0C,0x00 } , /* v */
star297 0:3d7d1aec706b 95 { 0x1C,0x60,0x1C,0x60,0x1C,0x00 } , /* w */
star297 0:3d7d1aec706b 96 { 0x00,0x6C,0x10,0x10,0x6C,0x00 } , /* x */
star297 0:3d7d1aec706b 97 { 0x00,0x4C,0x50,0x30,0x1C,0x00 } , /* y */
star297 0:3d7d1aec706b 98 { 0x00,0x44,0x64,0x54,0x4C,0x00 } , /* z */
star297 0:3d7d1aec706b 99 { 0x00,0x08,0x36,0x41,0x41,0x00 } , /* { */
star297 0:3d7d1aec706b 100 { 0x00,0x00,0x7F,0x00,0x00,0x00 } , /* | */
star297 0:3d7d1aec706b 101 { 0x41,0x41,0x36,0x08,0x00,0x00 } , /* } */
star297 0:3d7d1aec706b 102 { 0x08,0x04,0x08,0x10,0x08,0x00 } , /* ~ */
star297 0:3d7d1aec706b 103 { 0x00,0x00,0x00,0x00,0x00,0x00 } /*null*/
star297 0:3d7d1aec706b 104 };
star297 0:3d7d1aec706b 105
star297 0:3d7d1aec706b 106 ssd1331::ssd1331(PinName cs_pin, PinName rst_pin, PinName a0_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin)
star297 0:3d7d1aec706b 107 : CS(cs_pin), RES(rst_pin), DC(a0_pin), spi(mosi_pin, miso_pin, sclk_pin)
star297 0:3d7d1aec706b 108 {
star297 0:3d7d1aec706b 109 Init();
star297 0:3d7d1aec706b 110 }
star297 0:3d7d1aec706b 111
star297 0:3d7d1aec706b 112 void ssd1331::Init(void)
star297 0:3d7d1aec706b 113 {
star297 0:3d7d1aec706b 114 spi.format(8,3);
star297 0:3d7d1aec706b 115 spi.frequency(24000000);
star297 0:3d7d1aec706b 116
star297 0:3d7d1aec706b 117 // reset
star297 0:3d7d1aec706b 118 wait_ms(200);
star297 0:3d7d1aec706b 119 RES = 0; //Reset active
star297 0:3d7d1aec706b 120 wait_ms(200);
star297 0:3d7d1aec706b 121 RES = 1;
star297 0:3d7d1aec706b 122
star297 0:3d7d1aec706b 123 // initialize sequence
star297 0:3d7d1aec706b 124 RegWrite(0xAE); //OLED display OFF
star297 0:3d7d1aec706b 125 RegWrite(0x75); /* Set Row Address */
star297 0:3d7d1aec706b 126 RegWrite(0x00); /* Start = 0 */
star297 0:3d7d1aec706b 127 RegWrite(0x3F); /* End = 63 */
star297 0:3d7d1aec706b 128 RegWrite(0x15); /* Set Column Address */
star297 0:3d7d1aec706b 129 RegWrite(0x00); /* Start = 0 */
star297 0:3d7d1aec706b 130 RegWrite(0x5F); /* End = 95 */
star297 0:3d7d1aec706b 131 RegWrite(0xA0); //Set remap & data format 0111 0000
star297 0:3d7d1aec706b 132 RegWrite(0x72); // RGB colour
star297 0:3d7d1aec706b 133 RegWrite(0xA1); //set display start row RAM
star297 0:3d7d1aec706b 134 RegWrite(0x00);
star297 0:3d7d1aec706b 135 RegWrite(0xA2); //set dispaly offset
star297 0:3d7d1aec706b 136 RegWrite(0x00);
star297 0:3d7d1aec706b 137 RegWrite(0xA4); //Set Display Mode
star297 0:3d7d1aec706b 138 RegWrite(0xA8); //Set Multiplex Ratio
star297 0:3d7d1aec706b 139 RegWrite(0x3F);
star297 0:3d7d1aec706b 140 RegWrite(0xAD); //Set Master Configuration
star297 0:3d7d1aec706b 141 RegWrite(0x8F); //(External VCC Supply Selected)
star297 0:3d7d1aec706b 142 RegWrite(0xB0); //Set Power Saving Mode
star297 0:3d7d1aec706b 143 RegWrite(0x1A);
star297 0:3d7d1aec706b 144 RegWrite(0xB1); //Set Phase 1 & 2 Period Adjustment
star297 0:3d7d1aec706b 145 RegWrite(0x74);
star297 0:3d7d1aec706b 146 RegWrite(0xB3); //Set Display Clock Divide Ratio / Oscillator Frequency
star297 0:3d7d1aec706b 147 RegWrite(0xD0);
star297 0:3d7d1aec706b 148 RegWrite(0x8A); //Set Second Pre-charge Speed of Color A
star297 0:3d7d1aec706b 149 RegWrite(0x81);
star297 0:3d7d1aec706b 150 RegWrite(0x8B); //Set Second Pre-charge Speed of Color B
star297 0:3d7d1aec706b 151 RegWrite(0x82);
star297 0:3d7d1aec706b 152 RegWrite(0x8C); //Set Second Pre-charge Speed of Color C
star297 0:3d7d1aec706b 153 RegWrite(0x83);
star297 0:3d7d1aec706b 154 RegWrite(0xBB); //Set Pre-charge Level
star297 0:3d7d1aec706b 155 RegWrite(0x3E);
star297 0:3d7d1aec706b 156 RegWrite(0xBE); //Set VCOMH
star297 0:3d7d1aec706b 157 RegWrite(0x3E);
star297 0:3d7d1aec706b 158 RegWrite(0x87); //Set Master Current Control
star297 0:3d7d1aec706b 159 RegWrite(0x0F);
star297 0:3d7d1aec706b 160 RegWrite(0x81); //Set Contrast Control for Color &#129;gA&#129;h
star297 0:3d7d1aec706b 161 RegWrite(0x80);
star297 0:3d7d1aec706b 162 RegWrite(0x82); //Set Contrast Control for Color &#129;gB&#129;h
star297 0:3d7d1aec706b 163 RegWrite(0x80);
star297 0:3d7d1aec706b 164 RegWrite(0x83); //Set Contrast Control for Color &#129;gC&#129;h
star297 0:3d7d1aec706b 165 RegWrite(0x80);
star297 0:3d7d1aec706b 166 RegWrite(0xAF); //display ON
star297 0:3d7d1aec706b 167
star297 0:3d7d1aec706b 168 x_locate = 0;
star297 0:3d7d1aec706b 169 y_locate = 0;
star297 0:3d7d1aec706b 170 chr_size = NORMAL;
star297 0:3d7d1aec706b 171 cls();
star297 0:3d7d1aec706b 172 }
star297 0:3d7d1aec706b 173
star297 0:3d7d1aec706b 174 void ssd1331::on()
star297 0:3d7d1aec706b 175 {
star297 0:3d7d1aec706b 176 RegWrite(display_on);
star297 0:3d7d1aec706b 177 }
star297 0:3d7d1aec706b 178
star297 0:3d7d1aec706b 179 void ssd1331::off()
star297 0:3d7d1aec706b 180 {
star297 0:3d7d1aec706b 181 RegWrite(display_off);
star297 0:3d7d1aec706b 182 }
star297 0:3d7d1aec706b 183
star297 0:3d7d1aec706b 184 void ssd1331::cls()
star297 0:3d7d1aec706b 185 {
star297 0:3d7d1aec706b 186 unsigned char cmd[5]={GAC_CLEAR_WINDOW,0,0,width,height};
star297 0:3d7d1aec706b 187 RegWriteM(cmd,5);
star297 0:3d7d1aec706b 188 wait_us(500);
star297 0:3d7d1aec706b 189 background(0);
star297 0:3d7d1aec706b 190 }
star297 0:3d7d1aec706b 191
star297 0:3d7d1aec706b 192 void ssd1331::locate(int column, int row)
star297 0:3d7d1aec706b 193 {
star297 0:3d7d1aec706b 194 x_locate = column;
star297 0:3d7d1aec706b 195 y_locate = row;
star297 0:3d7d1aec706b 196 }
star297 0:3d7d1aec706b 197
star297 0:3d7d1aec706b 198 void ssd1331::foreground(unsigned int color)
star297 0:3d7d1aec706b 199 {
star297 0:3d7d1aec706b 200 Char_Color = color;
star297 0:3d7d1aec706b 201 }
star297 0:3d7d1aec706b 202 void ssd1331::background(unsigned int color)
star297 0:3d7d1aec706b 203 {
star297 0:3d7d1aec706b 204 BGround_Color = color;
star297 0:3d7d1aec706b 205 }
star297 0:3d7d1aec706b 206
star297 0:3d7d1aec706b 207 void ssd1331::SetFontSize(int Csize)
star297 0:3d7d1aec706b 208 {
star297 0:3d7d1aec706b 209 chr_size = Csize;
star297 0:3d7d1aec706b 210 }
star297 0:3d7d1aec706b 211
star297 0:3d7d1aec706b 212 void ssd1331::Fill_Screen(unsigned int color)
star297 0:3d7d1aec706b 213 {
star297 0:3d7d1aec706b 214 BGround_Color = color;
star297 0:3d7d1aec706b 215 fillrectangle(0,0,width,height,color,color);
star297 0:3d7d1aec706b 216 }
star297 0:3d7d1aec706b 217
star297 0:3d7d1aec706b 218 void ssd1331::dim()
star297 0:3d7d1aec706b 219 {
star297 0:3d7d1aec706b 220 unsigned char cmd[5]={GAC_DIM_WINDOW,0,0,width,height};
star297 0:3d7d1aec706b 221 RegWriteM(cmd,5);
star297 0:3d7d1aec706b 222 }
star297 0:3d7d1aec706b 223
star297 0:3d7d1aec706b 224 void ssd1331::contrast(char value)
star297 0:3d7d1aec706b 225 {
star297 0:3d7d1aec706b 226 int v = value*20;
star297 0:3d7d1aec706b 227 if(v>180){v=180;}
star297 0:3d7d1aec706b 228 unsigned char cmd[7];
star297 0:3d7d1aec706b 229 cmd[0] = contrastA;
star297 0:3d7d1aec706b 230 cmd[1] = v;
star297 0:3d7d1aec706b 231 cmd[2] = contrastB;
star297 0:3d7d1aec706b 232 cmd[3] = v;
star297 0:3d7d1aec706b 233 cmd[4] = contrastC;
star297 0:3d7d1aec706b 234 cmd[5] = v;
star297 0:3d7d1aec706b 235 RegWriteM(cmd, 6);
star297 0:3d7d1aec706b 236 }
star297 0:3d7d1aec706b 237
star297 0:3d7d1aec706b 238 int ssd1331::toRGB(int R,int G,int B)
star297 0:3d7d1aec706b 239 {
star297 0:3d7d1aec706b 240 uint16_t c;
star297 0:3d7d1aec706b 241 c = R >> 3;
star297 0:3d7d1aec706b 242 c <<= 6;
star297 0:3d7d1aec706b 243 c |= G >> 2;
star297 0:3d7d1aec706b 244 c <<= 5;
star297 0:3d7d1aec706b 245 c |= B >> 3;
star297 0:3d7d1aec706b 246 return c;
star297 0:3d7d1aec706b 247 }
star297 0:3d7d1aec706b 248
star297 0:3d7d1aec706b 249 void ssd1331::rectangle(int x1,int y1,int x2,int y2,unsigned int colorline)
star297 0:3d7d1aec706b 250 {
star297 0:3d7d1aec706b 251 if ( x1 < 0 ) x1 = 0;
star297 0:3d7d1aec706b 252 else if ( x1 > width ) x1 = width;
star297 0:3d7d1aec706b 253 if ( y1 < 0 ) y1 = 0;
star297 0:3d7d1aec706b 254 else if ( y1 > height ) y1 = height;
star297 0:3d7d1aec706b 255 if ( x2 < 0 ) x2 = 0;
star297 0:3d7d1aec706b 256 else if ( x2 > width ) x2 = width;
star297 0:3d7d1aec706b 257 if ( y2 < 0 ) y2 = 0;
star297 0:3d7d1aec706b 258 else if ( y2 > height ) y2 = height;
star297 0:3d7d1aec706b 259
star297 0:3d7d1aec706b 260 unsigned char cmd[11]={ 0 };
star297 0:3d7d1aec706b 261 cmd[0] = GAC_FILL_ENABLE_DISABLE;
star297 0:3d7d1aec706b 262 cmd[1] = 0; // fill 1, empty 0
star297 0:3d7d1aec706b 263 RegWriteM(cmd, 2);
star297 0:3d7d1aec706b 264 cmd[0] = GAC_DRAW_RECTANGLE;
star297 0:3d7d1aec706b 265 cmd[1] = (unsigned char)x1;
star297 0:3d7d1aec706b 266 cmd[2] = (unsigned char)y1;
star297 0:3d7d1aec706b 267 cmd[3] = (unsigned char)x2;
star297 0:3d7d1aec706b 268 cmd[4] = (unsigned char)y2;
star297 0:3d7d1aec706b 269 cmd[5] = (unsigned char)((colorline>> 11) << 1); // Outline Blue
star297 0:3d7d1aec706b 270 cmd[6] = (unsigned char)((colorline>> 5 ) & 0x3F); // Outline Green
star297 0:3d7d1aec706b 271 cmd[7] = (unsigned char)((colorline<< 1 ) & 0x3F); // Outline Red
star297 0:3d7d1aec706b 272 cmd[8] = (0);
star297 0:3d7d1aec706b 273 cmd[9] = (0);
star297 0:3d7d1aec706b 274 cmd[10]= (0);
star297 0:3d7d1aec706b 275 RegWriteM(cmd, 11);
star297 0:3d7d1aec706b 276 wait_us(500);
star297 0:3d7d1aec706b 277 }
star297 0:3d7d1aec706b 278
star297 0:3d7d1aec706b 279 void ssd1331::fillrectangle(int x1,int y1,int x2,int y2,unsigned int colorline,unsigned int colorfill)
star297 0:3d7d1aec706b 280 {
star297 0:3d7d1aec706b 281 if ( x1 < 0 ) x1 = 0;
star297 0:3d7d1aec706b 282 else if ( x1 > width ) x1 = width;
star297 0:3d7d1aec706b 283 if ( y1 < 0 ) y1 = 0;
star297 0:3d7d1aec706b 284 else if ( y1 > height ) y1 = height;
star297 0:3d7d1aec706b 285 if ( x2 < 0 ) x2 = 0;
star297 0:3d7d1aec706b 286 else if ( x2 > width ) x2 = width;
star297 0:3d7d1aec706b 287 if ( y2 < 0 ) y2 = 0;
star297 0:3d7d1aec706b 288 else if ( y2 > height ) y2 = height;
star297 0:3d7d1aec706b 289
star297 0:3d7d1aec706b 290 unsigned char cmd[11]={ 0 };
star297 0:3d7d1aec706b 291 cmd[0] = GAC_FILL_ENABLE_DISABLE;
star297 0:3d7d1aec706b 292 cmd[1] = 1; // fill 1, empty 0
star297 0:3d7d1aec706b 293 RegWriteM(cmd, 2);
star297 0:3d7d1aec706b 294 cmd[0] = GAC_DRAW_RECTANGLE;
star297 0:3d7d1aec706b 295 cmd[1] = (unsigned char)x1;
star297 0:3d7d1aec706b 296 cmd[2] = (unsigned char)y1;
star297 0:3d7d1aec706b 297 cmd[3] = (unsigned char)x2;
star297 0:3d7d1aec706b 298 cmd[4] = (unsigned char)y2;
star297 0:3d7d1aec706b 299 cmd[5] = (unsigned char)((colorline>> 11) << 1); // Outline Blue
star297 0:3d7d1aec706b 300 cmd[6] = (unsigned char)((colorline>> 5 ) & 0x3F); // Outline Green
star297 0:3d7d1aec706b 301 cmd[7] = (unsigned char)((colorline<< 1 ) & 0x3F); // Outline Red
star297 0:3d7d1aec706b 302 cmd[8] = (unsigned char)((colorfill>> 11) << 1); // fill Blue
star297 0:3d7d1aec706b 303 cmd[9] = (unsigned char)((colorfill>> 5 ) & 0x3F); // fill Green
star297 0:3d7d1aec706b 304 cmd[10]= (unsigned char)((colorfill<< 1 ) & 0x3F); // fill Red
star297 0:3d7d1aec706b 305 RegWriteM(cmd, 11);
star297 0:3d7d1aec706b 306 wait_us(500);
star297 0:3d7d1aec706b 307 }
star297 0:3d7d1aec706b 308
star297 0:3d7d1aec706b 309 void ssd1331::line(int x1,int y1,int x2,int y2,unsigned int color)
star297 0:3d7d1aec706b 310 {
star297 0:3d7d1aec706b 311 if ( x1 < 0 ) x1 = 0;
star297 0:3d7d1aec706b 312 else if ( x1 > width ) x1 = width;
star297 0:3d7d1aec706b 313 if ( y1 < 0 ) y1 = 0;
star297 0:3d7d1aec706b 314 else if ( y1 > height ) y1 = height;
star297 0:3d7d1aec706b 315 if ( x2 < 0 ) x2 = 0;
star297 0:3d7d1aec706b 316 else if ( x2 > width ) x2 = width;
star297 0:3d7d1aec706b 317 if ( y2 < 0 ) y2 = 0;
star297 0:3d7d1aec706b 318 else if ( y2 > height ) y2 = height;
star297 0:3d7d1aec706b 319
star297 0:3d7d1aec706b 320 unsigned char cmd[11]={ 0 };
star297 0:3d7d1aec706b 321 cmd[0] = GAC_FILL_ENABLE_DISABLE;
star297 0:3d7d1aec706b 322 cmd[1] = 0; // fill 0, empty 0
star297 0:3d7d1aec706b 323 RegWriteM(cmd, 2);
star297 0:3d7d1aec706b 324 cmd[0] = GAC_DRAW_LINE;
star297 0:3d7d1aec706b 325 cmd[1] = (unsigned char)x1;
star297 0:3d7d1aec706b 326 cmd[2] = (unsigned char)y1;
star297 0:3d7d1aec706b 327 cmd[3] = (unsigned char)x2;
star297 0:3d7d1aec706b 328 cmd[4] = (unsigned char)y2;
star297 0:3d7d1aec706b 329 cmd[5] = (unsigned char)(((color>>11)&0x1F)<<1); // Blue
star297 0:3d7d1aec706b 330 cmd[6] = (unsigned char)((color>>5)&0x3F); // Green
star297 0:3d7d1aec706b 331 cmd[7] = (unsigned char)((color&0x1F)<<1); // Red
star297 0:3d7d1aec706b 332 RegWriteM(cmd, 8);
star297 0:3d7d1aec706b 333 wait_us(500);
star297 0:3d7d1aec706b 334 }
star297 0:3d7d1aec706b 335
star297 0:3d7d1aec706b 336 void ssd1331::circle (int radius, int x, int y , unsigned int col, int fill)
star297 0:3d7d1aec706b 337 {
star297 0:3d7d1aec706b 338 int cx, cy, d;
star297 0:3d7d1aec706b 339 d = 3 - 2 * radius;
star297 0:3d7d1aec706b 340 cy = radius;
star297 0:3d7d1aec706b 341 pixel(x, radius+y, col);
star297 0:3d7d1aec706b 342 pixel(x, -radius+y, col);
star297 0:3d7d1aec706b 343 pixel(radius+x, y, col);
star297 0:3d7d1aec706b 344 pixel(-radius+x, y, col);
star297 0:3d7d1aec706b 345 if(fill){
star297 0:3d7d1aec706b 346 line(x,radius+y,x,-radius+y,col);
star297 0:3d7d1aec706b 347 line( radius+x,y,-radius+x,y,col);
star297 0:3d7d1aec706b 348 }
star297 0:3d7d1aec706b 349
star297 0:3d7d1aec706b 350 for (cx = 0; cx <= cy; cx++){
star297 0:3d7d1aec706b 351 if(d>=0){
star297 0:3d7d1aec706b 352 d+=10+4*cx-4*cy;
star297 0:3d7d1aec706b 353 cy--;
star297 0:3d7d1aec706b 354 }else{
star297 0:3d7d1aec706b 355 d+=6+4*cx;
star297 0:3d7d1aec706b 356 }
star297 0:3d7d1aec706b 357 pixel(cy+x, cx+y, col);
star297 0:3d7d1aec706b 358 pixel(cx+x, cy+y, col);
star297 0:3d7d1aec706b 359 pixel(-cx+x, cy+y, col);
star297 0:3d7d1aec706b 360 pixel(-cy+x, cx+y, col);
star297 0:3d7d1aec706b 361 pixel(-cy+x, -cx+y, col);
star297 0:3d7d1aec706b 362 pixel(-cx+x, -cy+y, col);
star297 0:3d7d1aec706b 363 pixel(cx+x, -cy+y, col);
star297 0:3d7d1aec706b 364 pixel(cy+x, -cx+y, col);
star297 0:3d7d1aec706b 365 if(fill){
star297 0:3d7d1aec706b 366 line(cy+x, cx+y, cy+x, -cx+y, col);
star297 0:3d7d1aec706b 367 line(cx+x, cy+y, cx+x, -cy + y, col);
star297 0:3d7d1aec706b 368 line(-cx+x, cy+y, -cx+x, cy+y, col);
star297 0:3d7d1aec706b 369 line(-cy+x, cx+y, -cy+x, cx+y, col);
star297 0:3d7d1aec706b 370 line(-cy+x, -cx+y, -cy+x, cx+y, col);
star297 0:3d7d1aec706b 371 line(-cx+x, -cy+y, -cx+x, cy+y, col);
star297 0:3d7d1aec706b 372 line(cx+x, -cy+y, cx+x, cy+y, col);
star297 0:3d7d1aec706b 373 line(cy+x, -cx+y, cy+x, cx+y, col);
star297 0:3d7d1aec706b 374 }
star297 0:3d7d1aec706b 375 }
star297 0:3d7d1aec706b 376 }
star297 0:3d7d1aec706b 377
star297 0:3d7d1aec706b 378 void ssd1331::pixel(int x,int y,unsigned int Color)
star297 0:3d7d1aec706b 379 {
star297 0:3d7d1aec706b 380 unsigned char cmd[7]={Set_Column_Address,0x00,0x00,Set_Row_Address,0x00,0x00};
star297 0:3d7d1aec706b 381 if ((x<0)||(y<0)||(x>width)||(y>height)) return ;
star297 0:3d7d1aec706b 382 cmd[1] = (unsigned char)x;
star297 0:3d7d1aec706b 383 cmd[2] = (unsigned char)x;
star297 0:3d7d1aec706b 384 cmd[4] = (unsigned char)y;
star297 0:3d7d1aec706b 385 cmd[5] = (unsigned char)y;
star297 0:3d7d1aec706b 386 RegWriteM(cmd, 6);
star297 0:3d7d1aec706b 387 DataWrite_to(Color);
star297 0:3d7d1aec706b 388 }
star297 0:3d7d1aec706b 389
star297 0:3d7d1aec706b 390 void ssd1331::ScrollSet(int horizontal, int startline, int linecount, int vertical , int frame_interval)
star297 0:3d7d1aec706b 391 {
star297 0:3d7d1aec706b 392 unsigned char cmd[7];
star297 0:3d7d1aec706b 393 if((startline>height+1)||((startline+linecount)>height+1)) return ;
star297 0:3d7d1aec706b 394 if ( frame_interval > 3 ) frame_interval = 3;
star297 0:3d7d1aec706b 395 cmd[0] = SCROLL_SETUP; //
star297 0:3d7d1aec706b 396 cmd[1] = horizontal;
star297 0:3d7d1aec706b 397 cmd[2] = startline;
star297 0:3d7d1aec706b 398 cmd[3] = linecount;
star297 0:3d7d1aec706b 399 cmd[4] = vertical;
star297 0:3d7d1aec706b 400 cmd[5] = frame_interval;
star297 0:3d7d1aec706b 401 RegWriteM(cmd,6);
star297 0:3d7d1aec706b 402 }
star297 0:3d7d1aec706b 403
star297 0:3d7d1aec706b 404 void ssd1331::Scrollstart()
star297 0:3d7d1aec706b 405 {
star297 0:3d7d1aec706b 406 RegWrite(SCROLL_START);
star297 0:3d7d1aec706b 407 }
star297 0:3d7d1aec706b 408
star297 0:3d7d1aec706b 409 void ssd1331::Scrollstop()
star297 0:3d7d1aec706b 410 {
star297 0:3d7d1aec706b 411 RegWrite(SCROLL_STOP);
star297 0:3d7d1aec706b 412 }
star297 0:3d7d1aec706b 413
star297 0:3d7d1aec706b 414 void ssd1331::PutChar(int x,int y,unsigned int a)
star297 0:3d7d1aec706b 415 {
star297 0:3d7d1aec706b 416 int i,j;
star297 0:3d7d1aec706b 417 unsigned char Temp=0;
star297 0:3d7d1aec706b 418 int lpx, lpy, k,l;
star297 0:3d7d1aec706b 419 int xw;
star297 0:3d7d1aec706b 420 j = 0;
star297 0:3d7d1aec706b 421 i = 0;
star297 0:3d7d1aec706b 422
star297 0:3d7d1aec706b 423 FontSizeConvert(&lpx, &lpy);
star297 0:3d7d1aec706b 424 xw = X_width;
star297 0:3d7d1aec706b 425 if(a < 32)a=32;
star297 0:3d7d1aec706b 426
star297 0:3d7d1aec706b 427 for(i=0; i<xw; i++){
star297 0:3d7d1aec706b 428 for ( l=0;l<lpx;l++){
star297 0:3d7d1aec706b 429 Temp = font6x8[a-32][i];
star297 0:3d7d1aec706b 430 for(j=Y_width-1;j>=0;j--){
star297 0:3d7d1aec706b 431 for (k=0;k<lpy;k++){
star297 0:3d7d1aec706b 432 pixel(x+(i*lpx)+l, y+(((j+1)*lpy)-1)-k, ((Temp & 0x80)==0x80) ? Char_Color : BGround_Color);
star297 0:3d7d1aec706b 433 }
star297 0:3d7d1aec706b 434 Temp = Temp << 1;
star297 0:3d7d1aec706b 435 }
star297 0:3d7d1aec706b 436 }
star297 0:3d7d1aec706b 437 }
star297 0:3d7d1aec706b 438 }
star297 0:3d7d1aec706b 439
star297 0:3d7d1aec706b 440 int ssd1331::_putc( int c )
star297 0:3d7d1aec706b 441 {
star297 0:3d7d1aec706b 442 int lpx, lpy, w;
star297 0:3d7d1aec706b 443 w = X_width;
star297 0:3d7d1aec706b 444 PutChar( x_locate , y_locate ,c);
star297 0:3d7d1aec706b 445 FontSizeConvert(&lpx, &lpy);
star297 0:3d7d1aec706b 446 x_locate += (w*lpx);
star297 0:3d7d1aec706b 447
star297 0:3d7d1aec706b 448 return c;
star297 0:3d7d1aec706b 449 }
star297 0:3d7d1aec706b 450
star297 0:3d7d1aec706b 451 int ssd1331::_getc()
star297 0:3d7d1aec706b 452 {
star297 0:3d7d1aec706b 453 return -1;
star297 0:3d7d1aec706b 454 }
star297 0:3d7d1aec706b 455
star297 0:3d7d1aec706b 456 int ssd1331::row()
star297 0:3d7d1aec706b 457 {
star297 0:3d7d1aec706b 458 return y_locate;
star297 0:3d7d1aec706b 459 }
star297 0:3d7d1aec706b 460 int ssd1331::column()
star297 0:3d7d1aec706b 461 {
star297 0:3d7d1aec706b 462 return x_locate;
star297 0:3d7d1aec706b 463 }
star297 0:3d7d1aec706b 464
star297 0:3d7d1aec706b 465 void ssd1331::Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y)
star297 0:3d7d1aec706b 466 {
star297 0:3d7d1aec706b 467 unsigned char cmd[8]={ 0 };
star297 0:3d7d1aec706b 468 if ((src_x1>width)||(src_y1>height)||(src_x2>width)||(src_y2>height)) return;
star297 0:3d7d1aec706b 469 if ((dst_x>width)||(dst_y>height))return;
star297 0:3d7d1aec706b 470 cmd[0] = GAC_COPY_AREA; //
star297 0:3d7d1aec706b 471 cmd[1] = (unsigned char)src_x1;
star297 0:3d7d1aec706b 472 cmd[2] = (unsigned char)src_y1;
star297 0:3d7d1aec706b 473 cmd[3] = (unsigned char)src_x2;
star297 0:3d7d1aec706b 474 cmd[4] = (unsigned char)src_y2;
star297 0:3d7d1aec706b 475 cmd[5] = (unsigned char)dst_x;
star297 0:3d7d1aec706b 476 cmd[6] = (unsigned char)dst_y;
star297 0:3d7d1aec706b 477 RegWriteM(cmd,7);
star297 0:3d7d1aec706b 478 }
star297 0:3d7d1aec706b 479
star297 0:3d7d1aec706b 480 void ssd1331::FontSizeConvert(int *lpx,int *lpy)
star297 0:3d7d1aec706b 481 {
star297 0:3d7d1aec706b 482 switch( chr_size ){
star297 0:3d7d1aec706b 483 case WIDE:
star297 0:3d7d1aec706b 484 *lpx=2;
star297 0:3d7d1aec706b 485 *lpy=1;
star297 0:3d7d1aec706b 486 break;
star297 0:3d7d1aec706b 487 case HIGH:
star297 0:3d7d1aec706b 488 *lpx=1;
star297 0:3d7d1aec706b 489 *lpy=2;
star297 0:3d7d1aec706b 490 break;
star297 0:3d7d1aec706b 491 case WH :
star297 0:3d7d1aec706b 492 *lpx=2;
star297 0:3d7d1aec706b 493 *lpy=2;
star297 0:3d7d1aec706b 494 break;
star297 0:3d7d1aec706b 495 case WHx36 :
star297 0:3d7d1aec706b 496 *lpx=6;
star297 0:3d7d1aec706b 497 *lpy=6;
star297 0:3d7d1aec706b 498 break;
star297 0:3d7d1aec706b 499 case NORMAL:
star297 0:3d7d1aec706b 500 default:
star297 0:3d7d1aec706b 501 *lpx=1;
star297 0:3d7d1aec706b 502 *lpy=1;
star297 0:3d7d1aec706b 503 break;
star297 0:3d7d1aec706b 504 }
star297 0:3d7d1aec706b 505 }
star297 0:3d7d1aec706b 506
star297 0:3d7d1aec706b 507 void ssd1331::RegWrite(unsigned char Command)
star297 0:3d7d1aec706b 508 {
star297 0:3d7d1aec706b 509 DC = 0; // Command
star297 0:3d7d1aec706b 510 CS = 0; // CS enable
star297 0:3d7d1aec706b 511 spi.write(Command);
star297 0:3d7d1aec706b 512 CS = 1; // CS dissable
star297 0:3d7d1aec706b 513 }
star297 0:3d7d1aec706b 514
star297 0:3d7d1aec706b 515 void ssd1331::RegWriteM(unsigned char *Command, int count)
star297 0:3d7d1aec706b 516 {
star297 0:3d7d1aec706b 517 int i;
star297 0:3d7d1aec706b 518 DC = 0; // Command
star297 0:3d7d1aec706b 519 CS = 0; // CS enable
star297 0:3d7d1aec706b 520 for( i=0;i<count;i++){
star297 0:3d7d1aec706b 521 spi.write(*Command++);
star297 0:3d7d1aec706b 522 }
star297 0:3d7d1aec706b 523 CS = 1; // CS dissable
star297 0:3d7d1aec706b 524 }
star297 0:3d7d1aec706b 525
star297 0:3d7d1aec706b 526 void ssd1331::DataWrite(unsigned char c)
star297 0:3d7d1aec706b 527 {
star297 0:3d7d1aec706b 528 DC = 1; // DATA
star297 0:3d7d1aec706b 529 CS = 0; // CS enable
star297 0:3d7d1aec706b 530 spi.write(c);
star297 0:3d7d1aec706b 531 CS = 1; // CS dissable
star297 0:3d7d1aec706b 532 }
star297 0:3d7d1aec706b 533
star297 0:3d7d1aec706b 534 void ssd1331::DataWrite_to(unsigned int Dat)
star297 0:3d7d1aec706b 535 {
star297 0:3d7d1aec706b 536 DC = 1; // DATA
star297 0:3d7d1aec706b 537 CS = 0; // CS enable
star297 0:3d7d1aec706b 538 spi.write((unsigned char)((Dat >> 8)));
star297 0:3d7d1aec706b 539 spi.write((unsigned char)(Dat));
star297 0:3d7d1aec706b 540 CS = 1; // CS dissable
star297 0:3d7d1aec706b 541 }