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:
Wed Aug 05 05:08:59 2020 +0000
Revision:
23:233a0d635d9d
Parent:
22:7d03976a0cb3
added #include "Stream.h" line for running on mbed-os6.2.0

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