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:
Sat Dec 13 05:29:11 2014 +0000
Revision:
22:7d03976a0cb3
Parent:
20:5b329c2a1ffe
Child:
23:233a0d635d9d
change set_contrast ()

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 22:7d03976a0cb3 7 Revised: December 13th, 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 22:7d03976a0cb3 116 wr_cmd(0x23); // Vo voltage reg.
kenjiArai 19:871eed87d8ea 117 wr_cmd(0x81); // set volume
kenjiArai 19:871eed87d8ea 118 wr_cmd(o & 0x3F);
kenjiArai 19:871eed87d8ea 119 }
kenjiArai 19:871eed87d8ea 120
kenjiArai 19:871eed87d8ea 121 unsigned int ST7565::get_contrast(void){
kenjiArai 19:871eed87d8ea 122 return(contrast);
kenjiArai 19:871eed87d8ea 123 }
kenjiArai 19:871eed87d8ea 124
kenjiArai 19:871eed87d8ea 125 // write command to lcd controller
kenjiArai 19:871eed87d8ea 126 void ST7565::wr_cmd(unsigned char cmd){
kenjiArai 19:871eed87d8ea 127 _A0 = 0;
kenjiArai 19:871eed87d8ea 128 _CS = 0;
kenjiArai 19:871eed87d8ea 129 _spi.write(cmd);
kenjiArai 19:871eed87d8ea 130 _CS = 1;
kenjiArai 19:871eed87d8ea 131 }
kenjiArai 19:871eed87d8ea 132
kenjiArai 19:871eed87d8ea 133 // write data to lcd controller
kenjiArai 19:871eed87d8ea 134 void ST7565::wr_dat(unsigned char dat){
kenjiArai 19:871eed87d8ea 135 _A0 = 1;
kenjiArai 19:871eed87d8ea 136 _CS = 0;
kenjiArai 19:871eed87d8ea 137 _spi.write(dat);
kenjiArai 19:871eed87d8ea 138 _CS = 1;
kenjiArai 19:871eed87d8ea 139 }
kenjiArai 19:871eed87d8ea 140
kenjiArai 19:871eed87d8ea 141 // reset and init the lcd controller
kenjiArai 19:871eed87d8ea 142 void ST7565::lcd_reset(){
kenjiArai 19:871eed87d8ea 143 _spi.format(8,0);
kenjiArai 19:871eed87d8ea 144 _spi.frequency(10000000); // 10 MHz SPI clock
kenjiArai 19:871eed87d8ea 145 _A0 = 0;
kenjiArai 19:871eed87d8ea 146 _CS = 1;
kenjiArai 19:871eed87d8ea 147 _reset = 0; // display reset
kenjiArai 19:871eed87d8ea 148 wait_us(50);
kenjiArai 19:871eed87d8ea 149 _reset = 1; // end reset
kenjiArai 19:871eed87d8ea 150 wait_ms(5);
kenjiArai 19:871eed87d8ea 151 // initialize sequence
kenjiArai 19:871eed87d8ea 152 wr_cmd(0xaf); // display on
kenjiArai 19:871eed87d8ea 153 wr_cmd(0x2f); // power control set
kenjiArai 19:871eed87d8ea 154 wr_cmd(0x81); // set electronic volume mode
kenjiArai 19:871eed87d8ea 155 wr_cmd(0x00); // electronic volume data 00-3f
kenjiArai 19:871eed87d8ea 156 wr_cmd(0x27); // Volatge Regulator Internal Resister Ratio Set
kenjiArai 19:871eed87d8ea 157 wr_cmd(0xa2); // LCD Bias Set ... 1/9 bias
kenjiArai 19:871eed87d8ea 158 wr_cmd(0xc8); // Common Output Mode Select ... Reverse
kenjiArai 19:871eed87d8ea 159 wr_cmd(0xa0); // ADC Select ... Norma
kenjiArai 19:871eed87d8ea 160 wr_cmd(0xa4); // Display All Points ON/OFF ... normal
kenjiArai 19:871eed87d8ea 161 wr_cmd(0xa6); // Display Normal/Reverse ... normal
kenjiArai 19:871eed87d8ea 162 wr_cmd(0xac); // Static Indicator ... off
kenjiArai 19:871eed87d8ea 163 wr_cmd(0x00); // off
kenjiArai 19:871eed87d8ea 164 wr_cmd(0x40); // Display Strat Line Set ... 0
kenjiArai 19:871eed87d8ea 165 wr_cmd(0xe0); // Write Mode Set
kenjiArai 19:871eed87d8ea 166 // clear and update LCD
kenjiArai 19:871eed87d8ea 167 memset(buffer,0x00,1024); // clear display buffer
kenjiArai 19:871eed87d8ea 168 copy_to_lcd();
kenjiArai 19:871eed87d8ea 169 auto_up = 1; // switch on auto update
kenjiArai 19:871eed87d8ea 170 // dont do this by default. Make the user call
kenjiArai 19:871eed87d8ea 171 //claim(stdout); // redirect printf to lcd
kenjiArai 19:871eed87d8ea 172 locate(0,0);
kenjiArai 19:871eed87d8ea 173 set_font((unsigned char*)Small_7); // standart font
kenjiArai 19:871eed87d8ea 174 }
kenjiArai 19:871eed87d8ea 175
kenjiArai 19:871eed87d8ea 176 // set one pixel in buffer
kenjiArai 19:871eed87d8ea 177 void ST7565::pixel(int x, int y, int color){
kenjiArai 19:871eed87d8ea 178 // first check parameter
kenjiArai 19:871eed87d8ea 179 if(x > lcd_width || y > lcd_height || x < 0 || y < 0) return;
kenjiArai 19:871eed87d8ea 180 if(draw_mode == NORMAL) {
kenjiArai 19:871eed87d8ea 181 if(color == 0)
kenjiArai 19:871eed87d8ea 182 buffer[x + ((y/8) * 128)] &= ~(1 << (y%8)); // erase pixel
kenjiArai 19:871eed87d8ea 183 else
kenjiArai 19:871eed87d8ea 184 buffer[x + ((y/8) * 128)] |= (1 << (y%8)); // set pixel
kenjiArai 19:871eed87d8ea 185 } else { // XOR mode
kenjiArai 19:871eed87d8ea 186 if(color == 1)
kenjiArai 19:871eed87d8ea 187 buffer[x + ((y/8) * 128)] ^= (1 << (y%8)); // xor pixel
kenjiArai 19:871eed87d8ea 188 }
kenjiArai 19:871eed87d8ea 189 }
kenjiArai 19:871eed87d8ea 190
kenjiArai 19:871eed87d8ea 191 // update lcd
kenjiArai 19:871eed87d8ea 192 void ST7565::copy_to_lcd(void){
kenjiArai 19:871eed87d8ea 193 int i=0;
kenjiArai 19:871eed87d8ea 194
kenjiArai 19:871eed87d8ea 195 // page 0
kenjiArai 19:871eed87d8ea 196 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 197 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 198 wr_cmd(0xB0); // set page address 0
kenjiArai 19:871eed87d8ea 199 _A0 = 1;
kenjiArai 19:871eed87d8ea 200 for(i=0; i<128; i++) {
kenjiArai 19:871eed87d8ea 201 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 202 }
kenjiArai 19:871eed87d8ea 203 // page 1
kenjiArai 19:871eed87d8ea 204 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 205 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 206 wr_cmd(0xB1); // set page address 1
kenjiArai 19:871eed87d8ea 207 _A0 = 1;
kenjiArai 19:871eed87d8ea 208 for(i=128; i<256; i++) {
kenjiArai 19:871eed87d8ea 209 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 210 }
kenjiArai 19:871eed87d8ea 211 // page 2
kenjiArai 19:871eed87d8ea 212 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 213 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 214 wr_cmd(0xB2); // set page address 2
kenjiArai 19:871eed87d8ea 215 _A0 = 1;
kenjiArai 19:871eed87d8ea 216 for(i=256; i<384; i++) {
kenjiArai 19:871eed87d8ea 217 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 218 }
kenjiArai 19:871eed87d8ea 219 // page 3
kenjiArai 19:871eed87d8ea 220 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 221 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 222 wr_cmd(0xB3); // set page address 3
kenjiArai 19:871eed87d8ea 223 _A0 = 1;
kenjiArai 19:871eed87d8ea 224 for(i=384; i<512; i++) {
kenjiArai 19:871eed87d8ea 225 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 226 }
kenjiArai 19:871eed87d8ea 227 if ((lcd_height == 48) || (lcd_height == 64)){
kenjiArai 19:871eed87d8ea 228 // page 4
kenjiArai 19:871eed87d8ea 229 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 230 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 231 wr_cmd(0xB4); // set page address 4
kenjiArai 19:871eed87d8ea 232 _A0 = 1;
kenjiArai 19:871eed87d8ea 233 for(i=512; i<640; i++) {
kenjiArai 19:871eed87d8ea 234 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 235 }
kenjiArai 19:871eed87d8ea 236 // page 5
kenjiArai 19:871eed87d8ea 237 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 238 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 239 wr_cmd(0xB5); // set page address 5
kenjiArai 19:871eed87d8ea 240 _A0 = 1;
kenjiArai 19:871eed87d8ea 241 for(i=640; i<768; i++) {
kenjiArai 19:871eed87d8ea 242 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 243 }
kenjiArai 19:871eed87d8ea 244 }
kenjiArai 19:871eed87d8ea 245 if (lcd_height == 64){
kenjiArai 19:871eed87d8ea 246 // page 6
kenjiArai 19:871eed87d8ea 247 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 248 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 249 wr_cmd(0xB6); // set page address 6
kenjiArai 19:871eed87d8ea 250 _A0 = 1;
kenjiArai 19:871eed87d8ea 251 for(i=768; i<896; i++) {
kenjiArai 19:871eed87d8ea 252 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 253 }
kenjiArai 19:871eed87d8ea 254 // page 7
kenjiArai 19:871eed87d8ea 255 wr_cmd(0x00); // set column low nibble 0
kenjiArai 19:871eed87d8ea 256 wr_cmd(0x10); // set column hi nibble 0
kenjiArai 19:871eed87d8ea 257 wr_cmd(0xB7); // set page address 7
kenjiArai 19:871eed87d8ea 258 _A0 = 1;
kenjiArai 19:871eed87d8ea 259 for(i=896; i<1024; i++) {
kenjiArai 19:871eed87d8ea 260 wr_dat(buffer[i]);
kenjiArai 19:871eed87d8ea 261 }
kenjiArai 19:871eed87d8ea 262 }
kenjiArai 19:871eed87d8ea 263 _CS = 0;
kenjiArai 19:871eed87d8ea 264 }
kenjiArai 19:871eed87d8ea 265
kenjiArai 19:871eed87d8ea 266 void ST7565::cls(void){
kenjiArai 19:871eed87d8ea 267 memset(buffer,0x00,1024); // clear display buffer
kenjiArai 19:871eed87d8ea 268 copy_to_lcd();
kenjiArai 19:871eed87d8ea 269 }
kenjiArai 19:871eed87d8ea 270
kenjiArai 19:871eed87d8ea 271 void ST7565::line(int x0, int y0, int x1, int y1, int color){
kenjiArai 19:871eed87d8ea 272 int dx = 0, dy = 0;
kenjiArai 19:871eed87d8ea 273 int dx_sym = 0, dy_sym = 0;
kenjiArai 19:871eed87d8ea 274 int dx_x2 = 0, dy_x2 = 0;
kenjiArai 19:871eed87d8ea 275 int di = 0;
kenjiArai 19:871eed87d8ea 276
kenjiArai 19:871eed87d8ea 277 dx = x1-x0;
kenjiArai 19:871eed87d8ea 278 dy = y1-y0;
kenjiArai 19:871eed87d8ea 279 // if (dx == 0) { /* vertical line */
kenjiArai 19:871eed87d8ea 280 // if (y1 > y0) vline(x0,y0,y1,color);
kenjiArai 19:871eed87d8ea 281 // else vline(x0,y1,y0,color);
kenjiArai 19:871eed87d8ea 282 // return;
kenjiArai 19:871eed87d8ea 283 // }
kenjiArai 19:871eed87d8ea 284 if (dx > 0) {
kenjiArai 19:871eed87d8ea 285 dx_sym = 1;
kenjiArai 19:871eed87d8ea 286 } else {
kenjiArai 19:871eed87d8ea 287 dx_sym = -1;
kenjiArai 19:871eed87d8ea 288 }
kenjiArai 19:871eed87d8ea 289 // if (dy == 0) { /* horizontal line */
kenjiArai 19:871eed87d8ea 290 // if (x1 > x0) hline(x0,x1,y0,color);
kenjiArai 19:871eed87d8ea 291 // else hline(x1,x0,y0,color);
kenjiArai 19:871eed87d8ea 292 // return;
kenjiArai 19:871eed87d8ea 293 // }
kenjiArai 19:871eed87d8ea 294 if (dy > 0) {
kenjiArai 19:871eed87d8ea 295 dy_sym = 1;
kenjiArai 19:871eed87d8ea 296 } else {
kenjiArai 19:871eed87d8ea 297 dy_sym = -1;
kenjiArai 19:871eed87d8ea 298 }
kenjiArai 19:871eed87d8ea 299 dx = dx_sym*dx;
kenjiArai 19:871eed87d8ea 300 dy = dy_sym*dy;
kenjiArai 19:871eed87d8ea 301 dx_x2 = dx*2;
kenjiArai 19:871eed87d8ea 302 dy_x2 = dy*2;
kenjiArai 19:871eed87d8ea 303 if (dx >= dy) {
kenjiArai 19:871eed87d8ea 304 di = dy_x2 - dx;
kenjiArai 19:871eed87d8ea 305 while (x0 != x1) {
kenjiArai 19:871eed87d8ea 306 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 307 x0 += dx_sym;
kenjiArai 19:871eed87d8ea 308 if (di<0) {
kenjiArai 19:871eed87d8ea 309 di += dy_x2;
kenjiArai 19:871eed87d8ea 310 } else {
kenjiArai 19:871eed87d8ea 311 di += dy_x2 - dx_x2;
kenjiArai 19:871eed87d8ea 312 y0 += dy_sym;
kenjiArai 19:871eed87d8ea 313 }
kenjiArai 19:871eed87d8ea 314 }
kenjiArai 19:871eed87d8ea 315 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 316 } else {
kenjiArai 19:871eed87d8ea 317 di = dx_x2 - dy;
kenjiArai 19:871eed87d8ea 318 while (y0 != y1) {
kenjiArai 19:871eed87d8ea 319 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 320 y0 += dy_sym;
kenjiArai 19:871eed87d8ea 321 if (di < 0) {
kenjiArai 19:871eed87d8ea 322 di += dx_x2;
kenjiArai 19:871eed87d8ea 323 } else {
kenjiArai 19:871eed87d8ea 324 di += dx_x2 - dy_x2;
kenjiArai 19:871eed87d8ea 325 x0 += dx_sym;
kenjiArai 19:871eed87d8ea 326 }
kenjiArai 19:871eed87d8ea 327 }
kenjiArai 19:871eed87d8ea 328 pixel(x0, y0, color);
kenjiArai 19:871eed87d8ea 329 }
kenjiArai 19:871eed87d8ea 330 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 331 }
kenjiArai 19:871eed87d8ea 332
kenjiArai 19:871eed87d8ea 333 void ST7565::rect(int x0, int y0, int x1, int y1, int color){
kenjiArai 19:871eed87d8ea 334 if (x1 > x0){ line(x0,y0,x1,y0,color);
kenjiArai 19:871eed87d8ea 335 } else { line(x1,y0,x0,y0,color);}
kenjiArai 19:871eed87d8ea 336 if (y1 > y0){ line(x0,y0,x0,y1,color);
kenjiArai 19:871eed87d8ea 337 } else { line(x0,y1,x0,y0,color);}
kenjiArai 19:871eed87d8ea 338 if (x1 > x0){ line(x0,y1,x1,y1,color);
kenjiArai 19:871eed87d8ea 339 } else { line(x1,y1,x0,y1,color);}
kenjiArai 19:871eed87d8ea 340 if (y1 > y0){ line(x1,y0,x1,y1,color);
kenjiArai 19:871eed87d8ea 341 } else { line(x1,y1,x1,y0,color);}
kenjiArai 19:871eed87d8ea 342 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 343 }
kenjiArai 19:871eed87d8ea 344
kenjiArai 19:871eed87d8ea 345 void ST7565::fillrect(int x0, int y0, int x1, int y1, int color){
kenjiArai 19:871eed87d8ea 346 int l,c,i;
kenjiArai 19:871eed87d8ea 347
kenjiArai 19:871eed87d8ea 348 if(x0 > x1) {
kenjiArai 19:871eed87d8ea 349 i = x0;
kenjiArai 19:871eed87d8ea 350 x0 = x1;
kenjiArai 19:871eed87d8ea 351 x1 = i;
kenjiArai 19:871eed87d8ea 352 }
kenjiArai 19:871eed87d8ea 353 if(y0 > y1) {
kenjiArai 19:871eed87d8ea 354 i = y0;
kenjiArai 19:871eed87d8ea 355 y0 = y1;
kenjiArai 19:871eed87d8ea 356 y1 = i;
kenjiArai 19:871eed87d8ea 357 }
kenjiArai 19:871eed87d8ea 358 for(l = x0; l<= x1; l ++) {
kenjiArai 19:871eed87d8ea 359 for(c = y0; c<= y1; c++) {
kenjiArai 19:871eed87d8ea 360 pixel(l,c,color);
kenjiArai 19:871eed87d8ea 361 }
kenjiArai 19:871eed87d8ea 362 }
kenjiArai 19:871eed87d8ea 363 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 364 }
kenjiArai 19:871eed87d8ea 365
kenjiArai 19:871eed87d8ea 366 void ST7565::circle(int x0, int y0, int r, int color){
kenjiArai 19:871eed87d8ea 367 int draw_x0, draw_y0;
kenjiArai 19:871eed87d8ea 368 int draw_x1, draw_y1;
kenjiArai 19:871eed87d8ea 369 int draw_x2, draw_y2;
kenjiArai 19:871eed87d8ea 370 int draw_x3, draw_y3;
kenjiArai 19:871eed87d8ea 371 int draw_x4, draw_y4;
kenjiArai 19:871eed87d8ea 372 int draw_x5, draw_y5;
kenjiArai 19:871eed87d8ea 373 int draw_x6, draw_y6;
kenjiArai 19:871eed87d8ea 374 int draw_x7, draw_y7;
kenjiArai 19:871eed87d8ea 375 int xx, yy;
kenjiArai 19:871eed87d8ea 376 int di;
kenjiArai 19:871eed87d8ea 377
kenjiArai 19:871eed87d8ea 378 //WindowMax();
kenjiArai 19:871eed87d8ea 379 if (r == 0) { /* no radius */
kenjiArai 19:871eed87d8ea 380 return;
kenjiArai 19:871eed87d8ea 381 }
kenjiArai 19:871eed87d8ea 382 draw_x0 = draw_x1 = x0;
kenjiArai 19:871eed87d8ea 383 draw_y0 = draw_y1 = y0 + r;
kenjiArai 19:871eed87d8ea 384 if (draw_y0 < height()) {
kenjiArai 19:871eed87d8ea 385 pixel(draw_x0, draw_y0, color); /* 90 degree */
kenjiArai 19:871eed87d8ea 386 }
kenjiArai 19:871eed87d8ea 387 draw_x2 = draw_x3 = x0;
kenjiArai 19:871eed87d8ea 388 draw_y2 = draw_y3 = y0 - r;
kenjiArai 19:871eed87d8ea 389 if (draw_y2 >= 0) {
kenjiArai 19:871eed87d8ea 390 pixel(draw_x2, draw_y2, color); /* 270 degree */
kenjiArai 19:871eed87d8ea 391 }
kenjiArai 19:871eed87d8ea 392 draw_x4 = draw_x6 = x0 + r;
kenjiArai 19:871eed87d8ea 393 draw_y4 = draw_y6 = y0;
kenjiArai 19:871eed87d8ea 394 if (draw_x4 < width()) {
kenjiArai 19:871eed87d8ea 395 pixel(draw_x4, draw_y4, color); /* 0 degree */
kenjiArai 19:871eed87d8ea 396 }
kenjiArai 19:871eed87d8ea 397 draw_x5 = draw_x7 = x0 - r;
kenjiArai 19:871eed87d8ea 398 draw_y5 = draw_y7 = y0;
kenjiArai 19:871eed87d8ea 399 if (draw_x5>=0) {
kenjiArai 19:871eed87d8ea 400 pixel(draw_x5, draw_y5, color); /* 180 degree */
kenjiArai 19:871eed87d8ea 401 }
kenjiArai 19:871eed87d8ea 402 if (r == 1) {
kenjiArai 19:871eed87d8ea 403 return;
kenjiArai 19:871eed87d8ea 404 }
kenjiArai 19:871eed87d8ea 405 di = 3 - 2*r;
kenjiArai 19:871eed87d8ea 406 xx = 0;
kenjiArai 19:871eed87d8ea 407 yy = r;
kenjiArai 19:871eed87d8ea 408 while (xx < yy) {
kenjiArai 19:871eed87d8ea 409 if (di < 0) {
kenjiArai 19:871eed87d8ea 410 di += 4*xx + 6;
kenjiArai 19:871eed87d8ea 411 } else {
kenjiArai 19:871eed87d8ea 412 di += 4*(xx - yy) + 10;
kenjiArai 19:871eed87d8ea 413 yy--;
kenjiArai 19:871eed87d8ea 414 draw_y0--;
kenjiArai 19:871eed87d8ea 415 draw_y1--;
kenjiArai 19:871eed87d8ea 416 draw_y2++;
kenjiArai 19:871eed87d8ea 417 draw_y3++;
kenjiArai 19:871eed87d8ea 418 draw_x4--;
kenjiArai 19:871eed87d8ea 419 draw_x5++;
kenjiArai 19:871eed87d8ea 420 draw_x6--;
kenjiArai 19:871eed87d8ea 421 draw_x7++;
kenjiArai 19:871eed87d8ea 422 }
kenjiArai 19:871eed87d8ea 423 xx++;
kenjiArai 19:871eed87d8ea 424 draw_x0++;
kenjiArai 19:871eed87d8ea 425 draw_x1--;
kenjiArai 19:871eed87d8ea 426 draw_x2++;
kenjiArai 19:871eed87d8ea 427 draw_x3--;
kenjiArai 19:871eed87d8ea 428 draw_y4++;
kenjiArai 19:871eed87d8ea 429 draw_y5++;
kenjiArai 19:871eed87d8ea 430 draw_y6--;
kenjiArai 19:871eed87d8ea 431 draw_y7--;
kenjiArai 19:871eed87d8ea 432 if ((draw_x0 <= width()) && (draw_y0>=0)){
kenjiArai 19:871eed87d8ea 433 pixel(draw_x0, draw_y0, color);
kenjiArai 19:871eed87d8ea 434 }
kenjiArai 19:871eed87d8ea 435 if ((draw_x1 >= 0) && (draw_y1 >= 0)){
kenjiArai 19:871eed87d8ea 436 pixel(draw_x1, draw_y1, color);
kenjiArai 19:871eed87d8ea 437 }
kenjiArai 19:871eed87d8ea 438 if ((draw_x2 <= width()) && (draw_y2 <= height())){
kenjiArai 19:871eed87d8ea 439 pixel(draw_x2, draw_y2, color);
kenjiArai 19:871eed87d8ea 440 }
kenjiArai 19:871eed87d8ea 441 if ((draw_x3 >=0 ) && (draw_y3 <= height())){
kenjiArai 19:871eed87d8ea 442 pixel(draw_x3, draw_y3, color);
kenjiArai 19:871eed87d8ea 443 }
kenjiArai 19:871eed87d8ea 444 if ((draw_x4 <= width()) && (draw_y4 >= 0)){
kenjiArai 19:871eed87d8ea 445 pixel(draw_x4, draw_y4, color);
kenjiArai 19:871eed87d8ea 446 }
kenjiArai 19:871eed87d8ea 447 if ((draw_x5 >= 0) && (draw_y5 >= 0)){
kenjiArai 19:871eed87d8ea 448 pixel(draw_x5, draw_y5, color);
kenjiArai 19:871eed87d8ea 449 }
kenjiArai 19:871eed87d8ea 450 if ((draw_x6 <=width()) && (draw_y6 <= height())){
kenjiArai 19:871eed87d8ea 451 pixel(draw_x6, draw_y6, color);
kenjiArai 19:871eed87d8ea 452 }
kenjiArai 19:871eed87d8ea 453 if ((draw_x7 >= 0) && (draw_y7 <= height())){
kenjiArai 19:871eed87d8ea 454 pixel(draw_x7, draw_y7, color);
kenjiArai 19:871eed87d8ea 455 }
kenjiArai 19:871eed87d8ea 456 }
kenjiArai 19:871eed87d8ea 457 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 458 }
kenjiArai 19:871eed87d8ea 459
kenjiArai 19:871eed87d8ea 460 void ST7565::fillcircle(int x, int y, int r, int color){
kenjiArai 19:871eed87d8ea 461 int i,up;
kenjiArai 19:871eed87d8ea 462
kenjiArai 19:871eed87d8ea 463 up = auto_up;
kenjiArai 19:871eed87d8ea 464 auto_up = 0; // off
kenjiArai 19:871eed87d8ea 465 for (i = 0; i <= r; i++){
kenjiArai 19:871eed87d8ea 466 circle(x,y,i,color);
kenjiArai 19:871eed87d8ea 467 }
kenjiArai 19:871eed87d8ea 468 auto_up = up;
kenjiArai 19:871eed87d8ea 469 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 470 }
kenjiArai 19:871eed87d8ea 471
kenjiArai 19:871eed87d8ea 472 void ST7565::setmode(int mode){
kenjiArai 19:871eed87d8ea 473 draw_mode = mode;
kenjiArai 19:871eed87d8ea 474 }
kenjiArai 19:871eed87d8ea 475
kenjiArai 19:871eed87d8ea 476 void ST7565::locate(int x, int y){
kenjiArai 19:871eed87d8ea 477 char_x = x;
kenjiArai 19:871eed87d8ea 478 char_y = y;
kenjiArai 19:871eed87d8ea 479 }
kenjiArai 19:871eed87d8ea 480
kenjiArai 19:871eed87d8ea 481 int ST7565::columns(){
kenjiArai 19:871eed87d8ea 482 return width() / font[1];
kenjiArai 19:871eed87d8ea 483 }
kenjiArai 19:871eed87d8ea 484
kenjiArai 19:871eed87d8ea 485 int ST7565::rows(){
kenjiArai 19:871eed87d8ea 486 return height() / font[2];
kenjiArai 19:871eed87d8ea 487 }
kenjiArai 19:871eed87d8ea 488
kenjiArai 19:871eed87d8ea 489 void ST7565::line_clear(int y){
kenjiArai 19:871eed87d8ea 490 unsigned int vert,j,i,x;
kenjiArai 19:871eed87d8ea 491
kenjiArai 19:871eed87d8ea 492 // read font parameter from start of array
kenjiArai 19:871eed87d8ea 493 vert = font[2]; // get vert size of font
kenjiArai 19:871eed87d8ea 494 x = 0;
kenjiArai 19:871eed87d8ea 495 for (j=0; j<vert; j++) { // vert line
kenjiArai 19:871eed87d8ea 496 for (i=0; i<width(); i++) { // horz line
kenjiArai 19:871eed87d8ea 497 pixel(x+i,y+j,0);
kenjiArai 19:871eed87d8ea 498 }
kenjiArai 19:871eed87d8ea 499 }
kenjiArai 19:871eed87d8ea 500 }
kenjiArai 19:871eed87d8ea 501
kenjiArai 19:871eed87d8ea 502 int ST7565::_putc(int value){
kenjiArai 19:871eed87d8ea 503 if (value == 0x0d) { // new line
kenjiArai 19:871eed87d8ea 504 char_x = 0;
kenjiArai 19:871eed87d8ea 505 char_y = char_y + font[2];
kenjiArai 19:871eed87d8ea 506 if (char_y >= height() - font[2]){
kenjiArai 19:871eed87d8ea 507 char_y = 0;
kenjiArai 19:871eed87d8ea 508 }
kenjiArai 19:871eed87d8ea 509 line_clear(char_y);
kenjiArai 19:871eed87d8ea 510 } else {
kenjiArai 19:871eed87d8ea 511 character(char_x, char_y, value);
kenjiArai 19:871eed87d8ea 512 if(auto_up){ copy_to_lcd();}
kenjiArai 19:871eed87d8ea 513 }
kenjiArai 19:871eed87d8ea 514 return value;
kenjiArai 19:871eed87d8ea 515 }
kenjiArai 19:871eed87d8ea 516
kenjiArai 19:871eed87d8ea 517 void ST7565::character(int x, int y, int c){
kenjiArai 19:871eed87d8ea 518 unsigned int hor,vert,offset,bpl,j,i,b;
kenjiArai 19:871eed87d8ea 519 unsigned char* zeichen;
kenjiArai 19:871eed87d8ea 520 unsigned char z,w;
kenjiArai 19:871eed87d8ea 521
kenjiArai 19:871eed87d8ea 522 if ((c < 31) || (c > 127)){ return;} // test char range
kenjiArai 19:871eed87d8ea 523 // read font parameter from start of array
kenjiArai 19:871eed87d8ea 524 offset = font[0]; // bytes / char
kenjiArai 19:871eed87d8ea 525 hor = font[1]; // get hor size of font
kenjiArai 19:871eed87d8ea 526 vert = font[2]; // get vert size of font
kenjiArai 19:871eed87d8ea 527 bpl = font[3]; // bytes per line
kenjiArai 19:871eed87d8ea 528 if (char_x + hor > width()){
kenjiArai 19:871eed87d8ea 529 char_x = 0;
kenjiArai 19:871eed87d8ea 530 char_y = char_y + vert;
kenjiArai 19:871eed87d8ea 531 if (char_y >= height() - font[2]){
kenjiArai 19:871eed87d8ea 532 char_y = 0;
kenjiArai 19:871eed87d8ea 533 }
kenjiArai 19:871eed87d8ea 534 }
kenjiArai 19:871eed87d8ea 535 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
kenjiArai 19:871eed87d8ea 536 w = zeichen[0]; // width of actual char
kenjiArai 19:871eed87d8ea 537 // construct the char into the buffer
kenjiArai 19:871eed87d8ea 538 for (j=0; j<vert; j++) { // vert line
kenjiArai 19:871eed87d8ea 539 for (i=0; i<hor; i++) { // horz line
kenjiArai 19:871eed87d8ea 540 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
kenjiArai 19:871eed87d8ea 541 b = 1 << (j & 0x07);
kenjiArai 19:871eed87d8ea 542 if (( z & b ) == 0x00) {
kenjiArai 19:871eed87d8ea 543 pixel(x+i,y+j,0);
kenjiArai 19:871eed87d8ea 544 } else {
kenjiArai 19:871eed87d8ea 545 pixel(x+i,y+j,1);
kenjiArai 19:871eed87d8ea 546 }
kenjiArai 19:871eed87d8ea 547 }
kenjiArai 19:871eed87d8ea 548 }
kenjiArai 19:871eed87d8ea 549 char_x += w;
kenjiArai 19:871eed87d8ea 550 if(char_x >= (width() - hor)) {
kenjiArai 19:871eed87d8ea 551 char_x = 0;
kenjiArai 19:871eed87d8ea 552 char_y = char_y + vert;
kenjiArai 19:871eed87d8ea 553 if (char_y >= height() - font[2]){
kenjiArai 19:871eed87d8ea 554 char_y = 0;
kenjiArai 19:871eed87d8ea 555 }
kenjiArai 19:871eed87d8ea 556 line_clear(char_y);
kenjiArai 19:871eed87d8ea 557 }
kenjiArai 19:871eed87d8ea 558 //PRINTF("C:%d %d %d %d %d %d\r\n",offset,hor,vert,bpl,char_x,char_y);
kenjiArai 19:871eed87d8ea 559 }
kenjiArai 19:871eed87d8ea 560
kenjiArai 19:871eed87d8ea 561 void ST7565::set_font(unsigned char* f){
kenjiArai 19:871eed87d8ea 562 font = f;
kenjiArai 19:871eed87d8ea 563 }
kenjiArai 19:871eed87d8ea 564
kenjiArai 19:871eed87d8ea 565 void ST7565::set_auto_up(unsigned int up){
kenjiArai 19:871eed87d8ea 566 if(up){
kenjiArai 19:871eed87d8ea 567 auto_up = 1;
kenjiArai 19:871eed87d8ea 568 } else {
kenjiArai 19:871eed87d8ea 569 auto_up = 0;
kenjiArai 19:871eed87d8ea 570 }
kenjiArai 19:871eed87d8ea 571 }
kenjiArai 19:871eed87d8ea 572
kenjiArai 19:871eed87d8ea 573 unsigned int ST7565::get_auto_up(void){
kenjiArai 19:871eed87d8ea 574 return (auto_up);
kenjiArai 19:871eed87d8ea 575 }
kenjiArai 19:871eed87d8ea 576
kenjiArai 19:871eed87d8ea 577 void ST7565::print_bm(Bitmap bm, int x, int y){
kenjiArai 19:871eed87d8ea 578 int h,v,b;
kenjiArai 19:871eed87d8ea 579 char d;
kenjiArai 19:871eed87d8ea 580
kenjiArai 19:871eed87d8ea 581 for(v=0; v < bm.ySize; v++) { // lines
kenjiArai 19:871eed87d8ea 582 for(h=0; h < bm.xSize; h++) { // pixel
kenjiArai 19:871eed87d8ea 583 if(h + x > 127){ break; }
kenjiArai 19:871eed87d8ea 584 if(v + y > 31){ break; }
kenjiArai 19:871eed87d8ea 585 d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
kenjiArai 19:871eed87d8ea 586 b = 0x80 >> (h & 0x07);
kenjiArai 19:871eed87d8ea 587 if((d & b) == 0) {
kenjiArai 19:871eed87d8ea 588 pixel(x+h,y+v,0);
kenjiArai 19:871eed87d8ea 589 } else {
kenjiArai 19:871eed87d8ea 590 pixel(x+h,y+v,1);
kenjiArai 19:871eed87d8ea 591 }
kenjiArai 19:871eed87d8ea 592 }
kenjiArai 19:871eed87d8ea 593 }
kenjiArai 19:871eed87d8ea 594 }