Extended library from C12832 Lib. by Peter Drescher, Chris Styles & Mihail Stoyanov. LCD in the market such as AQM1248A (Akizuki), AD-12864-SPI (antendo), NHD-C12832 (Newhaven), ST7565 (adafruit) and so on

Dependents:   CW_Decoder_using_FFT_on_F446 LPC1114_SPI_LCD_ST7565family_test

Fork of C12832 by Components

Original library is below link.
http://mbed.org/teams/components/code/C12832/
https://mbed.org/users/dreschpe/code/C12832_lcd/

I extended applicable LCD's not only 128 x 32 but also 128 x 48 and 128 x 64 type of SPI LCD using ST7565 controller.
I have checked AD-12864-SPI and AQM1248 LCD.
/media/uploads/kenjiArai/ad-12864-spi_12.png /media/uploads/kenjiArai/aqm12848_2.png

Import programLPC1114_SPI_LCD_ST7565family_test

Controller chip is ST7565

Committer:
kenjiArai
Date:
Sun Sep 21 10:04:45 2014 +0000
Revision:
20:5b329c2a1ffe
Parent:
19:871eed87d8ea
Child:
22:7d03976a0cb3
Clear DEBUG  condition

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 19:871eed87d8ea 1 /*
kenjiArai 19:871eed87d8ea 2 EXTEND for SPI interface LCD which is using ST7565 controller
kenjiArai 19:871eed87d8ea 3 Modified by Kenji Arai / JH1PJL
kenjiArai 19:871eed87d8ea 4 http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 19:871eed87d8ea 5 http://mbed.org/users/kenjiArai/
kenjiArai 19:871eed87d8ea 6 Started: September 20th, 2014
kenjiArai 19:871eed87d8ea 7 Revised: September 21st, 2014
kenjiArai 19:871eed87d8ea 8
kenjiArai 19:871eed87d8ea 9 original file: C12832.cpp
kenjiArai 19:871eed87d8ea 10 original Library name: C12832
kenjiArai 19:871eed87d8ea 11 */
kenjiArai 19:871eed87d8ea 12
kenjiArai 19:871eed87d8ea 13 //---------- ORIGINAL Header ----------------------------------------------------
kenjiArai 19:871eed87d8ea 14 /* mbed library for the mbed Lab Board 128*32 pixel LCD
kenjiArai 19:871eed87d8ea 15 * use C12832 controller
kenjiArai 19:871eed87d8ea 16 * Copyright (c) 2012 Peter Drescher - DC2PD
kenjiArai 19:871eed87d8ea 17 * Released under the MIT License: http://mbed.org/license/mit
kenjiArai 19:871eed87d8ea 18 *
kenjiArai 19:871eed87d8ea 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kenjiArai 19:871eed87d8ea 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kenjiArai 19:871eed87d8ea 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kenjiArai 19:871eed87d8ea 22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kenjiArai 19:871eed87d8ea 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 19:871eed87d8ea 24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
kenjiArai 19:871eed87d8ea 25 * THE SOFTWARE.
kenjiArai 19:871eed87d8ea 26 */
kenjiArai 19:871eed87d8ea 27
kenjiArai 19:871eed87d8ea 28 // 13.10.12 initial design
kenjiArai 19:871eed87d8ea 29 // 25.10.12 add autorefresh of screen
kenjiArai 19:871eed87d8ea 30 // 25.10.12 add standart font
kenjiArai 19:871eed87d8ea 31 // 20.12.12 add bitmap graphics
kenjiArai 19:871eed87d8ea 32
kenjiArai 19:871eed87d8ea 33 #include "ST7565_SPI_LCD.h"
kenjiArai 19:871eed87d8ea 34 #include "mbed.h"
kenjiArai 19:871eed87d8ea 35 #include "stdio.h"
kenjiArai 19:871eed87d8ea 36 #include "Small_7.h"
kenjiArai 19:871eed87d8ea 37
kenjiArai 19:871eed87d8ea 38 #define BPP 1 // Bits per pixel
kenjiArai 19:871eed87d8ea 39
kenjiArai 20:5b329c2a1ffe 40 //#define DEBUG
kenjiArai 19:871eed87d8ea 41 // Com
kenjiArai 19:871eed87d8ea 42 #ifdef DEBUG
kenjiArai 19:871eed87d8ea 43 #define BAUD(x) pcx.baud(x)
kenjiArai 19:871eed87d8ea 44 #define GETC(x) pcx.getc(x)
kenjiArai 19:871eed87d8ea 45 #define PUTC(x) pcx.putc(x)
kenjiArai 19:871eed87d8ea 46 #define PRINTF(...) pcx.printf(__VA_ARGS__)
kenjiArai 19:871eed87d8ea 47 #define READABLE(x) pcx.readable(x)
kenjiArai 19:871eed87d8ea 48 #else
kenjiArai 19:871eed87d8ea 49 #define BAUD(x) {;}
kenjiArai 19:871eed87d8ea 50 #define GETC(x) {;}
kenjiArai 19:871eed87d8ea 51 #define PUTC(x) {;}
kenjiArai 19:871eed87d8ea 52 #define PRINTF(...) {;}
kenjiArai 19:871eed87d8ea 53 #define READABLE(x) {;}
kenjiArai 19:871eed87d8ea 54 #endif
kenjiArai 19:871eed87d8ea 55 #ifdef DEBUG
kenjiArai 20:5b329c2a1ffe 56 // com !!!Please specify the pin!!!!
kenjiArai 20:5b329c2a1ffe 57 Serial pcx(?,?); // Communication with Host
kenjiArai 19:871eed87d8ea 58 #endif
kenjiArai 19:871eed87d8ea 59
kenjiArai 19:871eed87d8ea 60 ST7565::ST7565(PinName mosi, PinName sck,
kenjiArai 19:871eed87d8ea 61 PinName reset, PinName a0, PinName ncs, LCDType type, const char* name)
kenjiArai 19:871eed87d8ea 62 : GraphicsDisplay(name),_spi(mosi,NC,sck),_reset(reset),_A0(a0),_CS(ncs)
kenjiArai 19:871eed87d8ea 63 {
kenjiArai 19:871eed87d8ea 64 initialize(type);
kenjiArai 19:871eed87d8ea 65 }
kenjiArai 19:871eed87d8ea 66
kenjiArai 19:871eed87d8ea 67 ST7565::ST7565(SPI& p_spi, PinName reset, PinName a0, PinName ncs, LCDType type, const char* name)
kenjiArai 19:871eed87d8ea 68 : GraphicsDisplay(name),_spi(p_spi),_reset(reset),_A0(a0),_CS(ncs)
kenjiArai 19:871eed87d8ea 69 {
kenjiArai 19:871eed87d8ea 70 initialize(type);
kenjiArai 19:871eed87d8ea 71 }
kenjiArai 19:871eed87d8ea 72
kenjiArai 19:871eed87d8ea 73 void ST7565::initialize(LCDType type){
kenjiArai 19:871eed87d8ea 74 switch (type){
kenjiArai 19:871eed87d8ea 75 case LCD128x32:
kenjiArai 19:871eed87d8ea 76 lcd_width = 128;
kenjiArai 19:871eed87d8ea 77 lcd_height = 32;
kenjiArai 19:871eed87d8ea 78 break;
kenjiArai 19:871eed87d8ea 79 case LCD128x48:
kenjiArai 19:871eed87d8ea 80 lcd_width = 128;
kenjiArai 19:871eed87d8ea 81 lcd_height = 48;
kenjiArai 19:871eed87d8ea 82 break;
kenjiArai 19:871eed87d8ea 83 case LCD128x64:
kenjiArai 19:871eed87d8ea 84 lcd_width = 128;
kenjiArai 19:871eed87d8ea 85 lcd_height = 64;
kenjiArai 19:871eed87d8ea 86 break;
kenjiArai 19:871eed87d8ea 87 default:
kenjiArai 19:871eed87d8ea 88 lcd_width = 128;
kenjiArai 19:871eed87d8ea 89 lcd_height = 64;
kenjiArai 19:871eed87d8ea 90 }
kenjiArai 19:871eed87d8ea 91 draw_mode = NORMAL;
kenjiArai 19:871eed87d8ea 92 char_x = 0;
kenjiArai 19:871eed87d8ea 93 lcd_reset();
kenjiArai 19:871eed87d8ea 94 }
kenjiArai 19:871eed87d8ea 95
kenjiArai 19:871eed87d8ea 96 int ST7565::width(){
kenjiArai 19:871eed87d8ea 97 // PRINTF("W:%d",lcd_width);
kenjiArai 19:871eed87d8ea 98 return(lcd_width);
kenjiArai 19:871eed87d8ea 99 }
kenjiArai 19:871eed87d8ea 100
kenjiArai 19:871eed87d8ea 101 int ST7565::height(){
kenjiArai 19:871eed87d8ea 102 // PRINTF("H:%d",lcd_height);
kenjiArai 19:871eed87d8ea 103 return(lcd_height);
kenjiArai 19:871eed87d8ea 104 }
kenjiArai 19:871eed87d8ea 105
kenjiArai 19:871eed87d8ea 106 void ST7565::invert(unsigned int o){
kenjiArai 19:871eed87d8ea 107 if(o == 0){
kenjiArai 19:871eed87d8ea 108 wr_cmd(0xA6);
kenjiArai 19:871eed87d8ea 109 } else {
kenjiArai 19:871eed87d8ea 110 wr_cmd(0xA7);
kenjiArai 19:871eed87d8ea 111 }
kenjiArai 19:871eed87d8ea 112 }
kenjiArai 19:871eed87d8ea 113
kenjiArai 19:871eed87d8ea 114 void ST7565::set_contrast(unsigned int o){
kenjiArai 19:871eed87d8ea 115 contrast = o;
kenjiArai 19:871eed87d8ea 116 wr_cmd(0x81); // set volume
kenjiArai 19:871eed87d8ea 117 wr_cmd(o & 0x3F);
kenjiArai 19:871eed87d8ea 118 }
kenjiArai 19:871eed87d8ea 119
kenjiArai 19:871eed87d8ea 120 unsigned int ST7565::get_contrast(void){
kenjiArai 19:871eed87d8ea 121 return(contrast);
kenjiArai 19:871eed87d8ea 122 }
kenjiArai 19:871eed87d8ea 123
kenjiArai 19:871eed87d8ea 124 // write command to lcd controller
kenjiArai 19:871eed87d8ea 125 void ST7565::wr_cmd(unsigned char cmd){
kenjiArai 19:871eed87d8ea 126 _A0 = 0;
kenjiArai 19:871eed87d8ea 127 _CS = 0;
kenjiArai 19:871eed87d8ea 128 _spi.write(cmd);
kenjiArai 19:871eed87d8ea 129 _CS = 1;
kenjiArai 19:871eed87d8ea 130 }
kenjiArai 19:871eed87d8ea 131
kenjiArai 19:871eed87d8ea 132 // write data to lcd controller
kenjiArai 19:871eed87d8ea 133 void ST7565::wr_dat(unsigned char dat){
kenjiArai 19:871eed87d8ea 134 _A0 = 1;
kenjiArai 19:871eed87d8ea 135 _CS = 0;
kenjiArai 19:871eed87d8ea 136 _spi.write(dat);
kenjiArai 19:871eed87d8ea 137 _CS = 1;
kenjiArai 19:871eed87d8ea 138 }
kenjiArai 19:871eed87d8ea 139
kenjiArai 19:871eed87d8ea 140 // reset and init the lcd controller
kenjiArai 19:871eed87d8ea 141 void ST7565::lcd_reset(){
kenjiArai 19:871eed87d8ea 142 _spi.format(8,0);
kenjiArai 19:871eed87d8ea 143 _spi.frequency(10000000); // 10 MHz SPI clock
kenjiArai 19:871eed87d8ea 144 _A0 = 0;
kenjiArai 19:871eed87d8ea 145 _CS = 1;
kenjiArai 19:871eed87d8ea 146 _reset = 0; // display reset
kenjiArai 19:871eed87d8ea 147 wait_us(50);
kenjiArai 19:871eed87d8ea 148 _reset = 1; // end reset
kenjiArai 19:871eed87d8ea 149 wait_ms(5);
kenjiArai 19:871eed87d8ea 150 // initialize sequence
kenjiArai 19:871eed87d8ea 151 wr_cmd(0xaf); // display on
kenjiArai 19:871eed87d8ea 152 wr_cmd(0x2f); // power control set
kenjiArai 19:871eed87d8ea 153 wr_cmd(0x81); // set electronic volume mode
kenjiArai 19:871eed87d8ea 154 wr_cmd(0x00); // electronic volume data 00-3f
kenjiArai 19:871eed87d8ea 155 wr_cmd(0x27); // Volatge Regulator Internal Resister Ratio Set
kenjiArai 19:871eed87d8ea 156 wr_cmd(0xa2); // LCD Bias Set ... 1/9 bias
kenjiArai 19:871eed87d8ea 157 wr_cmd(0xc8); // Common Output Mode Select ... Reverse
kenjiArai 19:871eed87d8ea 158 wr_cmd(0xa0); // ADC Select ... Norma
kenjiArai 19:871eed87d8ea 159 wr_cmd(0xa4); // Display All Points ON/OFF ... normal
kenjiArai 19:871eed87d8ea 160 wr_cmd(0xa6); // Display Normal/Reverse ... normal
kenjiArai 19:871eed87d8ea 161 wr_cmd(0xac); // Static Indicator ... off
kenjiArai 19:871eed87d8ea 162 wr_cmd(0x00); // off
kenjiArai 19:871eed87d8ea 163 wr_cmd(0x40); // Display Strat Line Set ... 0
kenjiArai 19:871eed87d8ea 164 wr_cmd(0xe0); // Write Mode Set
kenjiArai 19:871eed87d8ea 165 // clear and update LCD
kenjiArai 19:871eed87d8ea 166 memset(buffer,0x00,1024); // clear display buffer
kenjiArai 19:871eed87d8ea 167 copy_to_lcd();
kenjiArai 19:871eed87d8ea 168 auto_up = 1; // switch on auto update
kenjiArai 19:871eed87d8ea 169 // dont do this by default. Make the user call
kenjiArai 19:871eed87d8ea 170 //claim(stdout); // redirect printf to lcd
kenjiArai 19:871eed87d8ea 171 locate(0,0);
kenjiArai 19:871eed87d8ea 172 set_font((unsigned char*)Small_7); // standart font
kenjiArai 19:871eed87d8ea 173 }
kenjiArai 19:871eed87d8ea 174
kenjiArai 19:871eed87d8ea 175 // set one pixel in buffer
kenjiArai 19:871eed87d8ea 176 void ST7565::pixel(int x, int y, int color){
kenjiArai 19:871eed87d8ea 177 // first check parameter
kenjiArai 19:871eed87d8ea 178 if(x > lcd_width || y > lcd_height || x < 0 || y < 0) return;
kenjiArai 19:871eed87d8ea 179 if(draw_mode == NORMAL) {
kenjiArai 19:871eed87d8ea 180 if(color == 0)
kenjiArai 19:871eed87d8ea 181 buffer[x + ((y/8) * 128)] &= ~(1 << (y%8)); // erase pixel
kenjiArai 19:871eed87d8ea 182 else
kenjiArai 19:871eed87d8ea 183 buffer[x + ((y/8) * 128)] |= (1 << (y%8)); // set pixel
kenjiArai 19:871eed87d8ea 184 } else { // XOR mode
kenjiArai 19:871eed87d8ea 185 if(color == 1)
kenjiArai 19:871eed87d8ea 186 buffer[x + ((y/8) * 128)] ^= (1 << (y%8)); // xor pixel
kenjiArai 19:871eed87d8ea 187 }
kenjiArai 19:871eed87d8ea 188 }
kenjiArai 19:871eed87d8ea 189
kenjiArai 19:871eed87d8ea 190 // update lcd
kenjiArai 19:871eed87d8ea 191 void ST7565::copy_to_lcd(void){
kenjiArai 19:871eed87d8ea 192 int i=0;
kenjiArai 19:871eed87d8ea 193
kenjiArai 19:871eed87d8ea 194 // page 0
kenjiArai 19:871eed87d8ea 195 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 196 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 197 wr_cmd(0xB0); // set page address 0
kenjiArai 19:871eed87d8ea 198 _A0 = 1;
kenjiArai 19:871eed87d8ea 199 for(i=0; i<128; i++) {
kenjiArai 19:871eed87d8ea 200 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 201 }
kenjiArai 19:871eed87d8ea 202 // page 1
kenjiArai 19:871eed87d8ea 203 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 204 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 205 wr_cmd(0xB1); // set page address 1
kenjiArai 19:871eed87d8ea 206 _A0 = 1;
kenjiArai 19:871eed87d8ea 207 for(i=128; i<256; i++) {
kenjiArai 19:871eed87d8ea 208 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 209 }
kenjiArai 19:871eed87d8ea 210 // page 2
kenjiArai 19:871eed87d8ea 211 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 212 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 213 wr_cmd(0xB2); // set page address 2
kenjiArai 19:871eed87d8ea 214 _A0 = 1;
kenjiArai 19:871eed87d8ea 215 for(i=256; i<384; i++) {
kenjiArai 19:871eed87d8ea 216 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 217 }
kenjiArai 19:871eed87d8ea 218 // page 3
kenjiArai 19:871eed87d8ea 219 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 220 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 221 wr_cmd(0xB3); // set page address 3
kenjiArai 19:871eed87d8ea 222 _A0 = 1;
kenjiArai 19:871eed87d8ea 223 for(i=384; i<512; i++) {
kenjiArai 19:871eed87d8ea 224 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 225 }
kenjiArai 19:871eed87d8ea 226 if ((lcd_height == 48) || (lcd_height == 64)){
kenjiArai 19:871eed87d8ea 227 // page 4
kenjiArai 19:871eed87d8ea 228 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 229 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 230 wr_cmd(0xB4); // set page address 4
kenjiArai 19:871eed87d8ea 231 _A0 = 1;
kenjiArai 19:871eed87d8ea 232 for(i=512; i<640; i++) {
kenjiArai 19:871eed87d8ea 233 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 234 }
kenjiArai 19:871eed87d8ea 235 // page 5
kenjiArai 19:871eed87d8ea 236 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 237 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 238 wr_cmd(0xB5); // set page address 5
kenjiArai 19:871eed87d8ea 239 _A0 = 1;
kenjiArai 19:871eed87d8ea 240 for(i=640; i<768; i++) {
kenjiArai 19:871eed87d8ea 241 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 242 }
kenjiArai 19:871eed87d8ea 243 }
kenjiArai 19:871eed87d8ea 244 if (lcd_height == 64){
kenjiArai 19:871eed87d8ea 245 // page 6
kenjiArai 19:871eed87d8ea 246 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 247 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 248 wr_cmd(0xB6); // set page address 6
kenjiArai 19:871eed87d8ea 249 _A0 = 1;
kenjiArai 19:871eed87d8ea 250 for(i=768; i<896; i++) {
kenjiArai 19:871eed87d8ea 251 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 252 }
kenjiArai 19:871eed87d8ea 253 // page 7
kenjiArai 19:871eed87d8ea 254 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 255 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 256 wr_cmd(0xB7); // set page address 7
kenjiArai 19:871eed87d8ea 257 _A0 = 1;
kenjiArai 19:871eed87d8ea 258 for(i=896; i<1024; i++) {
kenjiArai 19:871eed87d8ea 259 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 260 }
kenjiArai 19:871eed87d8ea 261 }
kenjiArai 19:871eed87d8ea 262 _CS = 0;
kenjiArai 19:871eed87d8ea 263 }
kenjiArai 19:871eed87d8ea 264
kenjiArai 19:871eed87d8ea 265 void ST7565::cls(void){
kenjiArai 19:871eed87d8ea 266 memset(buffer,0x00,1024); // clear display buffer
kenjiArai 19:871eed87d8ea 267 copy_to_lcd();
kenjiArai 19:871eed87d8ea 268 }
kenjiArai 19:871eed87d8ea 269
kenjiArai 19:871eed87d8ea 270 void ST7565::line(int x0, int y0, int x1, int y1, int color){
kenjiArai 19:871eed87d8ea 271 int dx = 0, dy = 0;
kenjiArai 19:871eed87d8ea 272 int dx_sym = 0, dy_sym = 0;
kenjiArai 19:871eed87d8ea 273 int dx_x2 = 0, dy_x2 = 0;
kenjiArai 19:871eed87d8ea 274 int di = 0;
kenjiArai 19:871eed87d8ea 275
kenjiArai 19:871eed87d8ea 276 dx = x1-x0;
kenjiArai 19:871eed87d8ea 277 dy = y1-y0;
kenjiArai 19:871eed87d8ea 278 // if (dx == 0) { /* vertical line */
kenjiArai 19:871eed87d8ea 279 // if (y1 > y0) vline(x0,y0,y1,color);
kenjiArai 19:871eed87d8ea 280 // else vline(x0,y1,y0,color);
kenjiArai 19:871eed87d8ea 281 // return;
kenjiArai 19:871eed87d8ea 282 // }
kenjiArai 19:871eed87d8ea 283 if (dx > 0) {
kenjiArai 19:871eed87d8ea 284 dx_sym = 1;
kenjiArai 19:871eed87d8ea 285 } else {
kenjiArai 19:871eed87d8ea 286 dx_sym = -1;
kenjiArai 19:871eed87d8ea 287 }
kenjiArai 19:871eed87d8ea 288 // if (dy == 0) { /* horizontal line */
kenjiArai 19:871eed87d8ea 289 // if (x1 > x0) hline(x0,x1,y0,color);
kenjiArai 19:871eed87d8ea 290 // else hline(x1,x0,y0,color);
kenjiArai 19:871eed87d8ea 291 // return;
kenjiArai 19:871eed87d8ea 292 // }
kenjiArai 19:871eed87d8ea 293 if (dy > 0) {
kenjiArai 19:871eed87d8ea 294 dy_sym = 1;
kenjiArai 19:871eed87d8ea 295 } else {
kenjiArai 19:871eed87d8ea 296 dy_sym = -1;
kenjiArai 19:871eed87d8ea 297 }
kenjiArai 19:871eed87d8ea 298 dx = dx_sym*dx;
kenjiArai 19:871eed87d8ea 299 dy = dy_sym*dy;
kenjiArai 19:871eed87d8ea 300 dx_x2 = dx*2;
kenjiArai 19:871eed87d8ea 301 dy_x2 = dy*2;
kenjiArai 19:871eed87d8ea 302 if (dx >= dy) {
kenjiArai 19:871eed87d8ea 303 di = dy_x2 - dx;
kenjiArai 19:871eed87d8ea 304 while (x0 != x1) {
kenjiArai 19:871eed87d8ea 305 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 306 x0 += dx_sym;
kenjiArai 19:871eed87d8ea 307 if (di<0) {
kenjiArai 19:871eed87d8ea 308 di += dy_x2;
kenjiArai 19:871eed87d8ea 309 } else {
kenjiArai 19:871eed87d8ea 310 di += dy_x2 - dx_x2;
kenjiArai 19:871eed87d8ea 311 y0 += dy_sym;
kenjiArai 19:871eed87d8ea 312 }
kenjiArai 19:871eed87d8ea 313 }
kenjiArai 19:871eed87d8ea 314 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 315 } else {
kenjiArai 19:871eed87d8ea 316 di = dx_x2 - dy;
kenjiArai 19:871eed87d8ea 317 while (y0 != y1) {
kenjiArai 19:871eed87d8ea 318 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 319 y0 += dy_sym;
kenjiArai 19:871eed87d8ea 320 if (di < 0) {
kenjiArai 19:871eed87d8ea 321 di += dx_x2;
kenjiArai 19:871eed87d8ea 322 } else {
kenjiArai 19:871eed87d8ea 323 di += dx_x2 - dy_x2;
kenjiArai 19:871eed87d8ea 324 x0 += dx_sym;
kenjiArai 19:871eed87d8ea 325 }
kenjiArai 19:871eed87d8ea 326 }
kenjiArai 19:871eed87d8ea 327 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 328 }
kenjiArai 19:871eed87d8ea 329 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 330 }
kenjiArai 19:871eed87d8ea 331
kenjiArai 19:871eed87d8ea 332 void ST7565::rect(int x0, int y0, int x1, int y1, int color){
kenjiArai 19:871eed87d8ea 333 if (x1 > x0){ line(x0,y0,x1,y0,color);
kenjiArai 19:871eed87d8ea 334 } else { line(x1,y0,x0,y0,color);}
kenjiArai 19:871eed87d8ea 335 if (y1 > y0){ line(x0,y0,x0,y1,color);
kenjiArai 19:871eed87d8ea 336 } else { line(x0,y1,x0,y0,color);}
kenjiArai 19:871eed87d8ea 337 if (x1 > x0){ line(x0,y1,x1,y1,color);
kenjiArai 19:871eed87d8ea 338 } else { line(x1,y1,x0,y1,color);}
kenjiArai 19:871eed87d8ea 339 if (y1 > y0){ line(x1,y0,x1,y1,color);
kenjiArai 19:871eed87d8ea 340 } else { line(x1,y1,x1,y0,color);}
kenjiArai 19:871eed87d8ea 341 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 342 }
kenjiArai 19:871eed87d8ea 343
kenjiArai 19:871eed87d8ea 344 void ST7565::fillrect(int x0, int y0, int x1, int y1, int color){
kenjiArai 19:871eed87d8ea 345 int l,c,i;
kenjiArai 19:871eed87d8ea 346
kenjiArai 19:871eed87d8ea 347 if(x0 > x1) {
kenjiArai 19:871eed87d8ea 348 i = x0;
kenjiArai 19:871eed87d8ea 349 x0 = x1;
kenjiArai 19:871eed87d8ea 350 x1 = i;
kenjiArai 19:871eed87d8ea 351 }
kenjiArai 19:871eed87d8ea 352 if(y0 > y1) {
kenjiArai 19:871eed87d8ea 353 i = y0;
kenjiArai 19:871eed87d8ea 354 y0 = y1;
kenjiArai 19:871eed87d8ea 355 y1 = i;
kenjiArai 19:871eed87d8ea 356 }
kenjiArai 19:871eed87d8ea 357 for(l = x0; l<= x1; l ++) {
kenjiArai 19:871eed87d8ea 358 for(c = y0; c<= y1; c++) {
kenjiArai 19:871eed87d8ea 359 pixel(l,c,color);
kenjiArai 19:871eed87d8ea 360 }
kenjiArai 19:871eed87d8ea 361 }
kenjiArai 19:871eed87d8ea 362 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 363 }
kenjiArai 19:871eed87d8ea 364
kenjiArai 19:871eed87d8ea 365 void ST7565::circle(int x0, int y0, int r, int color){
kenjiArai 19:871eed87d8ea 366 int draw_x0, draw_y0;
kenjiArai 19:871eed87d8ea 367 int draw_x1, draw_y1;
kenjiArai 19:871eed87d8ea 368 int draw_x2, draw_y2;
kenjiArai 19:871eed87d8ea 369 int draw_x3, draw_y3;
kenjiArai 19:871eed87d8ea 370 int draw_x4, draw_y4;
kenjiArai 19:871eed87d8ea 371 int draw_x5, draw_y5;
kenjiArai 19:871eed87d8ea 372 int draw_x6, draw_y6;
kenjiArai 19:871eed87d8ea 373 int draw_x7, draw_y7;
kenjiArai 19:871eed87d8ea 374 int xx, yy;
kenjiArai 19:871eed87d8ea 375 int di;
kenjiArai 19:871eed87d8ea 376
kenjiArai 19:871eed87d8ea 377 //WindowMax();
kenjiArai 19:871eed87d8ea 378 if (r == 0) { /* no radius */
kenjiArai 19:871eed87d8ea 379 return;
kenjiArai 19:871eed87d8ea 380 }
kenjiArai 19:871eed87d8ea 381 draw_x0 = draw_x1 = x0;
kenjiArai 19:871eed87d8ea 382 draw_y0 = draw_y1 = y0 + r;
kenjiArai 19:871eed87d8ea 383 if (draw_y0 < height()) {
kenjiArai 19:871eed87d8ea 384 pixel(draw_x0, draw_y0, color); /* 90 degree */
kenjiArai 19:871eed87d8ea 385 }
kenjiArai 19:871eed87d8ea 386 draw_x2 = draw_x3 = x0;
kenjiArai 19:871eed87d8ea 387 draw_y2 = draw_y3 = y0 - r;
kenjiArai 19:871eed87d8ea 388 if (draw_y2 >= 0) {
kenjiArai 19:871eed87d8ea 389 pixel(draw_x2, draw_y2, color); /* 270 degree */
kenjiArai 19:871eed87d8ea 390 }
kenjiArai 19:871eed87d8ea 391 draw_x4 = draw_x6 = x0 + r;
kenjiArai 19:871eed87d8ea 392 draw_y4 = draw_y6 = y0;
kenjiArai 19:871eed87d8ea 393 if (draw_x4 < width()) {
kenjiArai 19:871eed87d8ea 394 pixel(draw_x4, draw_y4, color); /* 0 degree */
kenjiArai 19:871eed87d8ea 395 }
kenjiArai 19:871eed87d8ea 396 draw_x5 = draw_x7 = x0 - r;
kenjiArai 19:871eed87d8ea 397 draw_y5 = draw_y7 = y0;
kenjiArai 19:871eed87d8ea 398 if (draw_x5>=0) {
kenjiArai 19:871eed87d8ea 399 pixel(draw_x5, draw_y5, color); /* 180 degree */
kenjiArai 19:871eed87d8ea 400 }
kenjiArai 19:871eed87d8ea 401 if (r == 1) {
kenjiArai 19:871eed87d8ea 402 return;
kenjiArai 19:871eed87d8ea 403 }
kenjiArai 19:871eed87d8ea 404 di = 3 - 2*r;
kenjiArai 19:871eed87d8ea 405 xx = 0;
kenjiArai 19:871eed87d8ea 406 yy = r;
kenjiArai 19:871eed87d8ea 407 while (xx < yy) {
kenjiArai 19:871eed87d8ea 408 if (di < 0) {
kenjiArai 19:871eed87d8ea 409 di += 4*xx + 6;
kenjiArai 19:871eed87d8ea 410 } else {
kenjiArai 19:871eed87d8ea 411 di += 4*(xx - yy) + 10;
kenjiArai 19:871eed87d8ea 412 yy--;
kenjiArai 19:871eed87d8ea 413 draw_y0--;
kenjiArai 19:871eed87d8ea 414 draw_y1--;
kenjiArai 19:871eed87d8ea 415 draw_y2++;
kenjiArai 19:871eed87d8ea 416 draw_y3++;
kenjiArai 19:871eed87d8ea 417 draw_x4--;
kenjiArai 19:871eed87d8ea 418 draw_x5++;
kenjiArai 19:871eed87d8ea 419 draw_x6--;
kenjiArai 19:871eed87d8ea 420 draw_x7++;
kenjiArai 19:871eed87d8ea 421 }
kenjiArai 19:871eed87d8ea 422 xx++;
kenjiArai 19:871eed87d8ea 423 draw_x0++;
kenjiArai 19:871eed87d8ea 424 draw_x1--;
kenjiArai 19:871eed87d8ea 425 draw_x2++;
kenjiArai 19:871eed87d8ea 426 draw_x3--;
kenjiArai 19:871eed87d8ea 427 draw_y4++;
kenjiArai 19:871eed87d8ea 428 draw_y5++;
kenjiArai 19:871eed87d8ea 429 draw_y6--;
kenjiArai 19:871eed87d8ea 430 draw_y7--;
kenjiArai 19:871eed87d8ea 431 if ((draw_x0 <= width()) && (draw_y0>=0)){
kenjiArai 19:871eed87d8ea 432 pixel(draw_x0, draw_y0, color);
kenjiArai 19:871eed87d8ea 433 }
kenjiArai 19:871eed87d8ea 434 if ((draw_x1 >= 0) && (draw_y1 >= 0)){
kenjiArai 19:871eed87d8ea 435 pixel(draw_x1, draw_y1, color);
kenjiArai 19:871eed87d8ea 436 }
kenjiArai 19:871eed87d8ea 437 if ((draw_x2 <= width()) && (draw_y2 <= height())){
kenjiArai 19:871eed87d8ea 438 pixel(draw_x2, draw_y2, color);
kenjiArai 19:871eed87d8ea 439 }
kenjiArai 19:871eed87d8ea 440 if ((draw_x3 >=0 ) && (draw_y3 <= height())){
kenjiArai 19:871eed87d8ea 441 pixel(draw_x3, draw_y3, color);
kenjiArai 19:871eed87d8ea 442 }
kenjiArai 19:871eed87d8ea 443 if ((draw_x4 <= width()) && (draw_y4 >= 0)){
kenjiArai 19:871eed87d8ea 444 pixel(draw_x4, draw_y4, color);
kenjiArai 19:871eed87d8ea 445 }
kenjiArai 19:871eed87d8ea 446 if ((draw_x5 >= 0) && (draw_y5 >= 0)){
kenjiArai 19:871eed87d8ea 447 pixel(draw_x5, draw_y5, color);
kenjiArai 19:871eed87d8ea 448 }
kenjiArai 19:871eed87d8ea 449 if ((draw_x6 <=width()) && (draw_y6 <= height())){
kenjiArai 19:871eed87d8ea 450 pixel(draw_x6, draw_y6, color);
kenjiArai 19:871eed87d8ea 451 }
kenjiArai 19:871eed87d8ea 452 if ((draw_x7 >= 0) && (draw_y7 <= height())){
kenjiArai 19:871eed87d8ea 453 pixel(draw_x7, draw_y7, color);
kenjiArai 19:871eed87d8ea 454 }
kenjiArai 19:871eed87d8ea 455 }
kenjiArai 19:871eed87d8ea 456 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 457 }
kenjiArai 19:871eed87d8ea 458
kenjiArai 19:871eed87d8ea 459 void ST7565::fillcircle(int x, int y, int r, int color){
kenjiArai 19:871eed87d8ea 460 int i,up;
kenjiArai 19:871eed87d8ea 461
kenjiArai 19:871eed87d8ea 462 up = auto_up;
kenjiArai 19:871eed87d8ea 463 auto_up = 0; // off
kenjiArai 19:871eed87d8ea 464 for (i = 0; i <= r; i++){
kenjiArai 19:871eed87d8ea 465 circle(x,y,i,color);
kenjiArai 19:871eed87d8ea 466 }
kenjiArai 19:871eed87d8ea 467 auto_up = up;
kenjiArai 19:871eed87d8ea 468 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 469 }
kenjiArai 19:871eed87d8ea 470
kenjiArai 19:871eed87d8ea 471 void ST7565::setmode(int mode){
kenjiArai 19:871eed87d8ea 472 draw_mode = mode;
kenjiArai 19:871eed87d8ea 473 }
kenjiArai 19:871eed87d8ea 474
kenjiArai 19:871eed87d8ea 475 void ST7565::locate(int x, int y){
kenjiArai 19:871eed87d8ea 476 char_x = x;
kenjiArai 19:871eed87d8ea 477 char_y = y;
kenjiArai 19:871eed87d8ea 478 }
kenjiArai 19:871eed87d8ea 479
kenjiArai 19:871eed87d8ea 480 int ST7565::columns(){
kenjiArai 19:871eed87d8ea 481 return width() / font[1];
kenjiArai 19:871eed87d8ea 482 }
kenjiArai 19:871eed87d8ea 483
kenjiArai 19:871eed87d8ea 484 int ST7565::rows(){
kenjiArai 19:871eed87d8ea 485 return height() / font[2];
kenjiArai 19:871eed87d8ea 486 }
kenjiArai 19:871eed87d8ea 487
kenjiArai 19:871eed87d8ea 488 void ST7565::line_clear(int y){
kenjiArai 19:871eed87d8ea 489 unsigned int vert,j,i,x;
kenjiArai 19:871eed87d8ea 490
kenjiArai 19:871eed87d8ea 491 // read font parameter from start of array
kenjiArai 19:871eed87d8ea 492 vert = font[2]; // get vert size of font
kenjiArai 19:871eed87d8ea 493 x = 0;
kenjiArai 19:871eed87d8ea 494 for (j=0; j<vert; j++) { // vert line
kenjiArai 19:871eed87d8ea 495 for (i=0; i<width(); i++) { // horz line
kenjiArai 19:871eed87d8ea 496 pixel(x+i,y+j,0);
kenjiArai 19:871eed87d8ea 497 }
kenjiArai 19:871eed87d8ea 498 }
kenjiArai 19:871eed87d8ea 499 }
kenjiArai 19:871eed87d8ea 500
kenjiArai 19:871eed87d8ea 501 int ST7565::_putc(int value){
kenjiArai 19:871eed87d8ea 502 if (value == 0x0d) { // new line
kenjiArai 19:871eed87d8ea 503 char_x = 0;
kenjiArai 19:871eed87d8ea 504 char_y = char_y + font[2];
kenjiArai 19:871eed87d8ea 505 if (char_y >= height() - font[2]){
kenjiArai 19:871eed87d8ea 506 char_y = 0;
kenjiArai 19:871eed87d8ea 507 }
kenjiArai 19:871eed87d8ea 508 line_clear(char_y);
kenjiArai 19:871eed87d8ea 509 } else {
kenjiArai 19:871eed87d8ea 510 character(char_x, char_y, value);
kenjiArai 19:871eed87d8ea 511 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 512 }
kenjiArai 19:871eed87d8ea 513 return value;
kenjiArai 19:871eed87d8ea 514 }
kenjiArai 19:871eed87d8ea 515
kenjiArai 19:871eed87d8ea 516 void ST7565::character(int x, int y, int c){
kenjiArai 19:871eed87d8ea 517 unsigned int hor,vert,offset,bpl,j,i,b;
kenjiArai 19:871eed87d8ea 518 unsigned char* zeichen;
kenjiArai 19:871eed87d8ea 519 unsigned char z,w;
kenjiArai 19:871eed87d8ea 520
kenjiArai 19:871eed87d8ea 521 if ((c < 31) || (c > 127)){ return;} // test char range
kenjiArai 19:871eed87d8ea 522 // read font parameter from start of array
kenjiArai 19:871eed87d8ea 523 offset = font[0]; // bytes / char
kenjiArai 19:871eed87d8ea 524 hor = font[1]; // get hor size of font
kenjiArai 19:871eed87d8ea 525 vert = font[2]; // get vert size of font
kenjiArai 19:871eed87d8ea 526 bpl = font[3]; // bytes per line
kenjiArai 19:871eed87d8ea 527 if (char_x + hor > width()){
kenjiArai 19:871eed87d8ea 528 char_x = 0;
kenjiArai 19:871eed87d8ea 529 char_y = char_y + vert;
kenjiArai 19:871eed87d8ea 530 if (char_y >= height() - font[2]){
kenjiArai 19:871eed87d8ea 531 char_y = 0;
kenjiArai 19:871eed87d8ea 532 }
kenjiArai 19:871eed87d8ea 533 }
kenjiArai 19:871eed87d8ea 534 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
kenjiArai 19:871eed87d8ea 535 w = zeichen[0]; // width of actual char
kenjiArai 19:871eed87d8ea 536 // construct the char into the buffer
kenjiArai 19:871eed87d8ea 537 for (j=0; j<vert; j++) { // vert line
kenjiArai 19:871eed87d8ea 538 for (i=0; i<hor; i++) { // horz line
kenjiArai 19:871eed87d8ea 539 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
kenjiArai 19:871eed87d8ea 540 b = 1 << (j & 0x07);
kenjiArai 19:871eed87d8ea 541 if (( z & b ) == 0x00) {
kenjiArai 19:871eed87d8ea 542 pixel(x+i,y+j,0);
kenjiArai 19:871eed87d8ea 543 } else {
kenjiArai 19:871eed87d8ea 544 pixel(x+i,y+j,1);
kenjiArai 19:871eed87d8ea 545 }
kenjiArai 19:871eed87d8ea 546 }
kenjiArai 19:871eed87d8ea 547 }
kenjiArai 19:871eed87d8ea 548 char_x += w;
kenjiArai 19:871eed87d8ea 549 if(char_x >= (width() - hor)) {
kenjiArai 19:871eed87d8ea 550 char_x = 0;
kenjiArai 19:871eed87d8ea 551 char_y = char_y + vert;
kenjiArai 19:871eed87d8ea 552 if (char_y >= height() - font[2]){
kenjiArai 19:871eed87d8ea 553 char_y = 0;
kenjiArai 19:871eed87d8ea 554 }
kenjiArai 19:871eed87d8ea 555 line_clear(char_y);
kenjiArai 19:871eed87d8ea 556 }
kenjiArai 19:871eed87d8ea 557 //PRINTF("C:%d %d %d %d %d %d\r\n",offset,hor,vert,bpl,char_x,char_y);
kenjiArai 19:871eed87d8ea 558 }
kenjiArai 19:871eed87d8ea 559
kenjiArai 19:871eed87d8ea 560 void ST7565::set_font(unsigned char* f){
kenjiArai 19:871eed87d8ea 561 font = f;
kenjiArai 19:871eed87d8ea 562 }
kenjiArai 19:871eed87d8ea 563
kenjiArai 19:871eed87d8ea 564 void ST7565::set_auto_up(unsigned int up){
kenjiArai 19:871eed87d8ea 565 if(up){
kenjiArai 19:871eed87d8ea 566 auto_up = 1;
kenjiArai 19:871eed87d8ea 567 } else {
kenjiArai 19:871eed87d8ea 568 auto_up = 0;
kenjiArai 19:871eed87d8ea 569 }
kenjiArai 19:871eed87d8ea 570 }
kenjiArai 19:871eed87d8ea 571
kenjiArai 19:871eed87d8ea 572 unsigned int ST7565::get_auto_up(void){
kenjiArai 19:871eed87d8ea 573 return (auto_up);
kenjiArai 19:871eed87d8ea 574 }
kenjiArai 19:871eed87d8ea 575
kenjiArai 19:871eed87d8ea 576 void ST7565::print_bm(Bitmap bm, int x, int y){
kenjiArai 19:871eed87d8ea 577 int h,v,b;
kenjiArai 19:871eed87d8ea 578 char d;
kenjiArai 19:871eed87d8ea 579
kenjiArai 19:871eed87d8ea 580 for(v=0; v < bm.ySize; v++) { // lines
kenjiArai 19:871eed87d8ea 581 for(h=0; h < bm.xSize; h++) { // pixel
kenjiArai 19:871eed87d8ea 582 if(h + x > 127){ break; }
kenjiArai 19:871eed87d8ea 583 if(v + y > 31){ break; }
kenjiArai 19:871eed87d8ea 584 d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
kenjiArai 19:871eed87d8ea 585 b = 0x80 >> (h & 0x07);
kenjiArai 19:871eed87d8ea 586 if((d & b) == 0) {
kenjiArai 19:871eed87d8ea 587 pixel(x+h,y+v,0);
kenjiArai 19:871eed87d8ea 588 } else {
kenjiArai 19:871eed87d8ea 589 pixel(x+h,y+v,1);
kenjiArai 19:871eed87d8ea 590 }
kenjiArai 19:871eed87d8ea 591 }
kenjiArai 19:871eed87d8ea 592 }
kenjiArai 19:871eed87d8ea 593 }