Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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