Allen Litton
/
BreakoutBoardDemo
Demo Application for the Celeritous Breakout Board
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 13:41:30 by 1.7.2