Demo Application for the Celeritous Breakout Board

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ST7565R.cpp Source File

ST7565R.cpp

00001 
00002 #include "ST7565R.h"
00003 #include "mbed.h"
00004 
00005 ST7565R::ST7565R(PinName cs, PinName a0, PinName scl, PinName si, PinName rst, bool BackBuffer) : _cs(cs), _a0(a0), _spi(si, NC, scl), _rst(rst)
00006 {
00007     _spi.format(8,3);
00008     _spi.frequency(20000000);   //datasheet 50 ns sclk
00009     _rst=1;
00010     _a0=0;
00011     _cs=1;
00012     scr=1;
00013     reset();
00014     UsingBackBuffer = BackBuffer;
00015     BigTextMode=0;
00016 }
00017 void ST7565R::setTextMode(int mode)
00018 {
00019     BigTextMode = (mode > 0) ? true : false;
00020 }
00021 void ST7565R::reset()
00022 {
00023     _rst = 0;
00024     wait_ms(1);
00025     _rst = 1;
00026     wait_ms(1);
00027     command(0xA0);  
00028     command(0xAF);    
00029     command(0xC0);    
00030     command(0xA2);   
00031     command(0x2F);  
00032     command(0x24);    
00033     command(0x81);    
00034     command(0x00); 
00035     command(0xA7);    
00036 
00037 
00038     clearBuffer();
00039     
00040 }
00041 void ST7565R::moveto(int col, int row)
00042 {
00043     _column = col;
00044     _row = row;
00045 }
00046 void ST7565R::character(int column, int row, char c)
00047 {
00048     char v = c - 0x20;
00049     if (c >= 0x20 && c < 0x80)
00050     {
00051         c-=0x20; 
00052         if (BigTextMode) {
00053             bitblt(column*BIG_FONT_SIZE_X, row*BIG_FONT_SIZE_Y,
00054                     BIG_FONT_SIZE_X, BIG_FONT_SIZE_Y, (char*)BIG_TEXT,
00055                     BIG_TEXT_WIDTH, BIG_TEXT_HEIGHT,
00056              (v%0x10) * BIG_FONT_SIZE_X, (v/0x10)*BIG_FONT_SIZE_Y, BITBLT_SRCCOPY); }
00057         else {
00058         bitblt(column*FONT_SIZE_X,row*FONT_SIZE_Y, 
00059                       FONT_SIZE_X, FONT_SIZE_Y, (char*)TEXT, 
00060                       TEXT_WIDTH,  TEXT_HEIGHT,
00061            (v%0x10) * FONT_SIZE_X, (v/0x10)*FONT_SIZE_Y,BITBLT_SRCCOPY);  }
00062     }
00063 }
00064 int ST7565R::_putc(int value) {
00065      if (value == '\n') {
00066          _column = 0;
00067          _row++;
00068          if (_row >= rows()) {
00069              _row = 0;
00070          }
00071      } else {
00072          character(_column, _row, value);
00073          _column++;
00074          if (_column >= columns()) {
00075              _column = 0;
00076              _row++;
00077              if (_row >= rows()) {
00078                  _row = 0;
00079              }
00080        }
00081     }
00082     return value;
00083 }
00084  
00085 int ST7565R::rows() { 
00086 if (BigTextMode)
00087     return 2; 
00088 else
00089     return 4;
00090 }
00091 int ST7565R::columns() { 
00092 if (BigTextMode)
00093     return 10; 
00094 else
00095     return 21;
00096 }
00097 int ST7565R::_getc() {
00098      return -1;
00099 }
00100  
00101 
00102 void ST7565R::clearBuffer()
00103 {
00104     
00105     char * screen =getDrawingScreen();
00106     int i=512;
00107     while(i--)
00108         screen[i]=0xff;
00109         
00110         
00111     if (!UsingBackBuffer)
00112         swapBuffers();  //should just commit the white to memory
00113 }
00114 void ST7565R::setpixel(int x, int y)
00115 {    
00116     if (x < 0 || x > 127) return;
00117     if (y < 0 || y > 31) return;
00118     char * screen = getDrawingScreen();
00119     loc_t byte = { x , (y / 8) * 128};
00120     screen[byte.y + byte.x] |= 0x80 >> (y%8);
00121     
00122     //if theres no backbuffer,then we'll do our writes immediately
00123     if (!UsingBackBuffer)
00124     {
00125       command(0xb0 | ( (3-(y/8))+scr*4));
00126       command(0x10 | (x >> 4));    //column upper
00127       command(0x00 | (x & 0x0f));  //column lower
00128       data(screen[byte.y +byte.x]);    
00129     }
00130 }
00131 
00132 void ST7565R::clearpixel(int x, int y)
00133 {    
00134     if (x < 0 || x > 127) return;
00135     if (y < 0 || y > 31) return;
00136     char * screen = getDrawingScreen();
00137     loc_t byte = { x , (y / 8) * 128};
00138     screen[byte.y + byte.x] &= ~(0x80 >> (y%8));
00139     
00140     //if theres no backbuffer,then we'll do our writes immediately
00141     if (!UsingBackBuffer)
00142     {
00143       command(0xb0 | ( (3-(y/8))+scr*4));
00144       command(0x10 | (x >> 4));    //column upper
00145       command(0x00 | (x & 0x0f));  //column lower
00146       data(screen[byte.y +byte.x]);    
00147     }
00148 }
00149 
00150 void ST7565R::data(int value)
00151 {
00152     _cs = 0;
00153     _a0 = 1;
00154     _spi.write(value);
00155     _cs = 1;
00156 
00157 }
00158 void ST7565R::command(int value)
00159 {
00160     _cs = 0;
00161     _a0 = 0;
00162     _spi.write(value);
00163     _cs = 1;
00164 } 
00165 
00166 void ST7565R::swapBuffers()
00167 {
00168     char * screen = getDrawingScreen();
00169     for (int i=0; i<4; i++)
00170     {
00171     
00172         command(0xb0 | ( (3-i)+scr*4));
00173         command(0x10);  
00174         command(0x00);  
00175         for (int j=0; j<128; j++)
00176         {
00177             data(screen[i*128+j]);
00178         }
00179     }
00180     command(0x40 | scr * 32);
00181     if (UsingBackBuffer) scr^=1;
00182 }
00183 #define SCREEN_1 0
00184 #define SCREEN_2 1
00185 
00186 
00187 char * ST7565R::getDrawingScreen()
00188 {
00189     if (scr) 
00190         return screen.screen1;
00191     else    
00192         return screen.screen2;
00193 }
00194 void ST7565R::bitblt(int dstx, int dsty,
00195                      int blit_width, int blit_height,
00196                      char* img,
00197                      int img_width, int img_height,
00198                      int srcx, int srcy,
00199                      int format)
00200 {
00201     char * current_draw_buffer = getDrawingScreen();
00202     bool pixel = 0;
00203     int  byte_size_wide = img_width / 8;
00204     for (int i=0; i < blit_height; i++)
00205     {
00206         for (int j=0; j < blit_width; j++)
00207         {
00208             pixel = img[ byte_size_wide*(srcy+i) + (srcx+j)/8] & (0x80 >> ((srcx+j)%8));
00209                         
00210             switch(format)
00211             {
00212               case BITBLT_SRCCOPY: if (pixel)    setpixel(dstx+j,dsty+i); else 
00213                                                clearpixel(dstx+j,dsty+i); break;
00214               case BITBLT_SRCOR:   if (pixel)    setpixel(dstx+j,dsty+i); break;
00215               case BITBLT_SRCAND:  if (!pixel) clearpixel(dstx+j,dsty+i); break;
00216             }
00217         }
00218     }
00219 
00220 }