Vadim Artamonov / SSD1327

Dependents:   drive drive1 drive213 drive123213

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SSD1327.cpp Source File

SSD1327.cpp

00001 #include "mbed.h"
00002 #include "SSD1327.h"
00003 
00004 /// 96x96 pixel SSD1327 SeeedStudio 1.12" OLED display
00005 /// http://www.displayfuture.com/Display/datasheet/controller/SSD1327.pdf
00006 /// based on https://github.com/blitz/mbed-arch-pro
00007 
00008 // font info
00009 int font_w;
00010 int font_h;
00011 int font_bpc; //bytes per char width
00012 uint8_t *font_s;
00013 
00014 unsigned char currR, currC;
00015 
00016 unsigned char grayH;
00017 unsigned char grayL;
00018 
00019 
00020 bool SSD1327::send(char mode, const char data[], size_t len)
00021     {
00022         for (size_t c = 0; c < len; c++) {
00023             const char snd[2]= { mode, data[c] };
00024             if (i2c.write(address, snd, sizeof(snd)) != 0)
00025                 return false;
00026         }
00027 
00028         return true;
00029     }
00030 
00031 /*bool SSD1327::sendf(char mode, char data[], size_t len)
00032     {
00033         for (size_t c = 0; c < len; c++) {
00034             const char snd[2]= { mode, data[c] };
00035             if (i2c.write(address, snd, sizeof(snd)) != 0)
00036                 return false;
00037         }
00038 
00039         return true;
00040     } */
00041 
00042 bool SSD1327::sendx(char mode, char data[], size_t len)
00043     {
00044         char snd[52];
00045         snd[0]=mode;
00046         for (char c=0;c<len;c++) snd[c+1]=data[c];
00047         if (i2c.write(address, snd, len+1) != 0)
00048                 return false;
00049         return true;
00050     }
00051 
00052 void SSD1327::tribyte_cmd(uint8_t a, uint8_t b, uint8_t c)
00053     {
00054         char data[] = { a, b, c };
00055         send(cmd_mode, data, sizeof(data));
00056 
00057     }
00058 
00059 void SSD1327::set_column_address(uint8_t start, uint8_t end)
00060     {
00061         tribyte_cmd(0x15, start, end);
00062     }
00063 
00064 void SSD1327::set_row_address(uint8_t start, uint8_t end)
00065     {
00066         tribyte_cmd(0x75, start, end);
00067     }
00068     
00069 void SSD1327::set_gray_level(unsigned char level)
00070     {
00071         grayL =  level & 0x0F;
00072         grayH =  grayL<<4;
00073     }
00074     
00075 void SSD1327::set_text_rc(unsigned char row, unsigned char column)
00076 {
00077   currR=row;
00078   currC=column;
00079   set_column_address(8+column*font_w/2,8+column*font_w/2+font_w/2-1);
00080   set_row_address(0x00+(row*font_h),0x00+(row*font_h+(font_h-1)));
00081 }    
00082 
00083 void SSD1327::set_rc(unsigned char row, unsigned char column)
00084 {
00085   if (row>PIXELS) row=PIXELS;
00086   if (column>PIXELS) column=PIXELS;
00087   currR=row;
00088   currC=column/2;
00089   set_column_address(8+column/2,8+column/2+font_w/2-1);
00090   set_row_address(row,row+(font_h-1));
00091 }    
00092 
00093 void SSD1327::putc(unsigned char C)
00094 {
00095   uint8_t line;
00096   uint8_t *pchar;
00097   char cc=0;
00098    char out[50];
00099 
00100     if(C < 32 || C > 127) //Ignore non-printable ASCII characters. This can be modified for multilingual font.
00101     {
00102         C=' '; //Space
00103     }
00104 
00105     pchar=font_s+((C-32)*font_h*font_bpc);
00106 
00107     for (char i = 0; i < font_h; i++) {
00108       char outcc=0;
00109       for (char j=0; j<font_bpc; j++) {
00110           line=pchar[cc++];
00111           for (char k=0; k<4;k++) {
00112             char c=0x00;
00113             char bit1=line & 0x80; line<<=1;
00114             char bit2=line & 0x80; line<<=1;
00115             c|=(bit1)?grayH:0x00;
00116             c|=(bit2)?grayL:0x00;
00117             out[outcc++]=c;
00118           }
00119       }
00120       sendx(data_mode,out,font_bpc*4);
00121     }
00122     set_text_rc(currR,currC+1);
00123 }
00124 
00125 void SSD1327::puts(const char *str)
00126 {
00127     unsigned char i=0;
00128     while(str[i])
00129     {
00130         putc(str[i]);
00131         i++;
00132     }
00133 }
00134 
00135 void SSD1327::set_font(const uint8_t *Font, int width, int height) {
00136   font_s= (uint8_t *) Font;
00137   font_h=height;
00138   font_w=width;
00139   font_bpc=width/8;
00140 }
00141 
00142 
00143 
00144 void SSD1327::clear()
00145     {
00146         char empty[48]={0};    
00147         set_column_address(8, 8 + PIXELS/2 - 1);
00148         set_row_address   (0, PIXELS - 1);
00149         for (char j=0;j<96;j++) sendx(data_mode, empty, sizeof(empty));
00150     }
00151 
00152 SSD1327::SSD1327(I2C &i2c)
00153         : i2c(i2c)
00154     {
00155         // Init gray level for text. Default:Brightest White
00156         grayH= 0xF0;
00157         grayL= 0x0F;
00158 
00159         static const char init[] = { 0xFD, 0x12, 0xAE, 0xA8, 0x5F, 0xA1,
00160                                      0x00, 0xA2, 0x60, 0xA0, 0x46, 0xAB,
00161                                      0x01, 0x81, 0x53, 0xB1, 0x51, 0xB3,
00162                                      0x01, 0xB9, 0xBC, 0x08, 0xBE, 0x07,
00163                                      0xB6, 0x01, 0xD5, 0x62, 0xA4, 0x2E,
00164                                      0xAF };
00165 
00166         if (not send(cmd_mode, init, sizeof(init))) {
00167 //            pc.printf("SSD1327 init failed.\n");
00168         }
00169 
00170         wait_ms(100);
00171 
00172         static const char init2[] = { 0xA0, 0x42,
00173                                       0x15, 0x08, 0x37, 0x75, 0x00, 0x5f  };
00174 
00175         if (not send(cmd_mode, init2, sizeof(init2))) {
00176 //            pc.printf("SSD1327 init2 failed.\n");
00177         }
00178 //        pc.printf("SSD1327 initialized.\n");
00179         clear();
00180     }
00181 
00182 // EOF