SToppuhr

Committer:
Lippi
Date:
Thu Dec 17 20:11:56 2015 +0000
Revision:
0:862a4d510e20
Tinf Stoppuhr

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Lippi 0:862a4d510e20 1 /* mbed library for the mbed Lab Board 128*32 pixel LCD
Lippi 0:862a4d510e20 2 * use C12832 controller
Lippi 0:862a4d510e20 3 * Copyright (c) 2012 Peter Drescher - DC2PD
Lippi 0:862a4d510e20 4 * Released under the MIT License: http://mbed.org/license/mit
Lippi 0:862a4d510e20 5 *
Lippi 0:862a4d510e20 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Lippi 0:862a4d510e20 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Lippi 0:862a4d510e20 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Lippi 0:862a4d510e20 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Lippi 0:862a4d510e20 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Lippi 0:862a4d510e20 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Lippi 0:862a4d510e20 12 * THE SOFTWARE.
Lippi 0:862a4d510e20 13 */
Lippi 0:862a4d510e20 14
Lippi 0:862a4d510e20 15 // 13.10.12 initial design
Lippi 0:862a4d510e20 16 // 25.10.12 add autorefresh of screen
Lippi 0:862a4d510e20 17 // 25.10.12 add standart font
Lippi 0:862a4d510e20 18
Lippi 0:862a4d510e20 19 // optional defines :
Lippi 0:862a4d510e20 20 // #define debug_lcd 1
Lippi 0:862a4d510e20 21
Lippi 0:862a4d510e20 22 #include "C12832_lcd.h"
Lippi 0:862a4d510e20 23 #include "mbed.h"
Lippi 0:862a4d510e20 24 #include "stdio.h"
Lippi 0:862a4d510e20 25 #include "Small_7.h"
Lippi 0:862a4d510e20 26
Lippi 0:862a4d510e20 27 #define BPP 1 // Bits per pixel
Lippi 0:862a4d510e20 28
Lippi 0:862a4d510e20 29 C12832_LCD::C12832_LCD(const char* name)
Lippi 0:862a4d510e20 30 : _spi(p5,NC,p7),_reset(p6),_A0(p8),_CS(p11),GraphicsDisplay(name)
Lippi 0:862a4d510e20 31 {
Lippi 0:862a4d510e20 32 orientation = 1;
Lippi 0:862a4d510e20 33 draw_mode = NORMAL;
Lippi 0:862a4d510e20 34 char_x = 0;
Lippi 0:862a4d510e20 35 lcd_reset();
Lippi 0:862a4d510e20 36 }
Lippi 0:862a4d510e20 37
Lippi 0:862a4d510e20 38 int C12832_LCD::width()
Lippi 0:862a4d510e20 39 {
Lippi 0:862a4d510e20 40 if (orientation == 0 || orientation == 2) return 32;
Lippi 0:862a4d510e20 41 else return 128;
Lippi 0:862a4d510e20 42 }
Lippi 0:862a4d510e20 43
Lippi 0:862a4d510e20 44 int C12832_LCD::height()
Lippi 0:862a4d510e20 45 {
Lippi 0:862a4d510e20 46 if (orientation == 0 || orientation == 2) return 128;
Lippi 0:862a4d510e20 47 else return 32;
Lippi 0:862a4d510e20 48 }
Lippi 0:862a4d510e20 49
Lippi 0:862a4d510e20 50
Lippi 0:862a4d510e20 51 /*void C12832_LCD::set_orientation(unsigned int o)
Lippi 0:862a4d510e20 52 {
Lippi 0:862a4d510e20 53 orientation = o;
Lippi 0:862a4d510e20 54 switch (o) {
Lippi 0:862a4d510e20 55 case (0):
Lippi 0:862a4d510e20 56 wr_cmd(0xA0);
Lippi 0:862a4d510e20 57 wr_cmd(0xC0);
Lippi 0:862a4d510e20 58 break;
Lippi 0:862a4d510e20 59 case (1):
Lippi 0:862a4d510e20 60 wr_cmd(0xA0);
Lippi 0:862a4d510e20 61 wr_cmd(0xC8);
Lippi 0:862a4d510e20 62 break;
Lippi 0:862a4d510e20 63 case (2):
Lippi 0:862a4d510e20 64 wr_cmd(0xA1);
Lippi 0:862a4d510e20 65 wr_cmd(0xC8);
Lippi 0:862a4d510e20 66 break;
Lippi 0:862a4d510e20 67 case (3):
Lippi 0:862a4d510e20 68 wr_cmd(0xA1);
Lippi 0:862a4d510e20 69 wr_cmd(0xC0);
Lippi 0:862a4d510e20 70 break;
Lippi 0:862a4d510e20 71 }
Lippi 0:862a4d510e20 72 }
Lippi 0:862a4d510e20 73
Lippi 0:862a4d510e20 74 */
Lippi 0:862a4d510e20 75
Lippi 0:862a4d510e20 76 void C12832_LCD::invert(unsigned int o)
Lippi 0:862a4d510e20 77 {
Lippi 0:862a4d510e20 78 if(o == 0) wr_cmd(0xA6);
Lippi 0:862a4d510e20 79 else wr_cmd(0xA7);
Lippi 0:862a4d510e20 80 }
Lippi 0:862a4d510e20 81
Lippi 0:862a4d510e20 82
Lippi 0:862a4d510e20 83 void C12832_LCD::set_contrast(unsigned int o)
Lippi 0:862a4d510e20 84 {
Lippi 0:862a4d510e20 85 contrast = o;
Lippi 0:862a4d510e20 86 wr_cmd(0x81); // set volume
Lippi 0:862a4d510e20 87 wr_cmd(o & 0x3F);
Lippi 0:862a4d510e20 88 }
Lippi 0:862a4d510e20 89
Lippi 0:862a4d510e20 90 unsigned int C12832_LCD::get_contrast(void)
Lippi 0:862a4d510e20 91 {
Lippi 0:862a4d510e20 92 return(contrast);
Lippi 0:862a4d510e20 93 }
Lippi 0:862a4d510e20 94
Lippi 0:862a4d510e20 95
Lippi 0:862a4d510e20 96 // write command to lcd controller
Lippi 0:862a4d510e20 97
Lippi 0:862a4d510e20 98 void C12832_LCD::wr_cmd(unsigned char cmd)
Lippi 0:862a4d510e20 99 {
Lippi 0:862a4d510e20 100 _A0 = 0;
Lippi 0:862a4d510e20 101 _CS = 0;
Lippi 0:862a4d510e20 102 #if defined TARGET_LPC1768 // fast without mbed lib
Lippi 0:862a4d510e20 103 LPC_SSP1->DR = cmd;
Lippi 0:862a4d510e20 104 do {
Lippi 0:862a4d510e20 105 } while ((LPC_SSP1->SR & 0x10) == 0x10); // wait for SPI1 idle
Lippi 0:862a4d510e20 106 #else
Lippi 0:862a4d510e20 107 _spi.write(cmd);
Lippi 0:862a4d510e20 108 #endif
Lippi 0:862a4d510e20 109 _CS = 1;
Lippi 0:862a4d510e20 110 }
Lippi 0:862a4d510e20 111
Lippi 0:862a4d510e20 112 // write data to lcd controller
Lippi 0:862a4d510e20 113
Lippi 0:862a4d510e20 114 void C12832_LCD::wr_dat(unsigned char dat)
Lippi 0:862a4d510e20 115 {
Lippi 0:862a4d510e20 116 _A0 = 1;
Lippi 0:862a4d510e20 117 _CS = 0;
Lippi 0:862a4d510e20 118 #if defined TARGET_LPC1768 // fast without mbed lib
Lippi 0:862a4d510e20 119 LPC_SSP1->DR = dat;
Lippi 0:862a4d510e20 120 do {
Lippi 0:862a4d510e20 121 } while ((LPC_SSP1->SR & 0x10) == 0x10); // wait for SPI1 idle
Lippi 0:862a4d510e20 122 #else
Lippi 0:862a4d510e20 123 _spi.write(dat);
Lippi 0:862a4d510e20 124 #endif
Lippi 0:862a4d510e20 125 _CS = 1;
Lippi 0:862a4d510e20 126 }
Lippi 0:862a4d510e20 127
Lippi 0:862a4d510e20 128 // reset and init the lcd controller
Lippi 0:862a4d510e20 129
Lippi 0:862a4d510e20 130 void C12832_LCD::lcd_reset()
Lippi 0:862a4d510e20 131 {
Lippi 0:862a4d510e20 132
Lippi 0:862a4d510e20 133 _spi.format(8,3); // 8 bit spi mode 3
Lippi 0:862a4d510e20 134 _spi.frequency(20000000); // 19,2 Mhz SPI clock
Lippi 0:862a4d510e20 135 DigitalOut _reset(p6);
Lippi 0:862a4d510e20 136 _A0 = 0;
Lippi 0:862a4d510e20 137 _CS = 1;
Lippi 0:862a4d510e20 138 _reset = 0; // display reset
Lippi 0:862a4d510e20 139 wait_us(50);
Lippi 0:862a4d510e20 140 _reset = 1; // end reset
Lippi 0:862a4d510e20 141 wait_ms(5);
Lippi 0:862a4d510e20 142
Lippi 0:862a4d510e20 143 /* Start Initial Sequence ----------------------------------------------------*/
Lippi 0:862a4d510e20 144
Lippi 0:862a4d510e20 145 wr_cmd(0xAE); // display off
Lippi 0:862a4d510e20 146 wr_cmd(0xA2); // bias voltage
Lippi 0:862a4d510e20 147
Lippi 0:862a4d510e20 148 wr_cmd(0xA0);
Lippi 0:862a4d510e20 149 wr_cmd(0xC8); // colum normal
Lippi 0:862a4d510e20 150
Lippi 0:862a4d510e20 151 wr_cmd(0x22); // voltage resistor ratio
Lippi 0:862a4d510e20 152 wr_cmd(0x2F); // power on
Lippi 0:862a4d510e20 153 //wr_cmd(0xA4); // LCD display ram
Lippi 0:862a4d510e20 154 wr_cmd(0x40); // start line = 0
Lippi 0:862a4d510e20 155 wr_cmd(0xAF); // display ON
Lippi 0:862a4d510e20 156
Lippi 0:862a4d510e20 157 wr_cmd(0x81); // set contrast
Lippi 0:862a4d510e20 158 wr_cmd(0x17); // set contrast
Lippi 0:862a4d510e20 159
Lippi 0:862a4d510e20 160 wr_cmd(0xA6); // display normal
Lippi 0:862a4d510e20 161
Lippi 0:862a4d510e20 162
Lippi 0:862a4d510e20 163 #if defined TARGET_LPC1768 //setup DMA channel 0
Lippi 0:862a4d510e20 164 LPC_SC->PCONP |= (1UL << 29); // Power up the GPDMA
Lippi 0:862a4d510e20 165 LPC_GPDMA->DMACConfig = 1; // enable DMA controller
Lippi 0:862a4d510e20 166 LPC_GPDMA->DMACIntTCClear = 0x1;
Lippi 0:862a4d510e20 167 LPC_GPDMA->DMACIntErrClr = 0x1;
Lippi 0:862a4d510e20 168 LPC_GPDMACH0->DMACCLLI = 0;
Lippi 0:862a4d510e20 169 #endif
Lippi 0:862a4d510e20 170 // clear and update LCD
Lippi 0:862a4d510e20 171 memset(buffer,0x00,512); // clear display buffer
Lippi 0:862a4d510e20 172 copy_to_lcd();
Lippi 0:862a4d510e20 173 auto_up = 1; // switch on auto update
Lippi 0:862a4d510e20 174 claim(stdout); // redirekt printf to lcd
Lippi 0:862a4d510e20 175 locate(0,0);
Lippi 0:862a4d510e20 176 set_font((unsigned char*)Small_7); // standart font
Lippi 0:862a4d510e20 177 }
Lippi 0:862a4d510e20 178
Lippi 0:862a4d510e20 179 // set one pixel in buffer
Lippi 0:862a4d510e20 180
Lippi 0:862a4d510e20 181 void C12832_LCD::pixel(int x, int y, int color)
Lippi 0:862a4d510e20 182 {
Lippi 0:862a4d510e20 183 // first check parameter
Lippi 0:862a4d510e20 184 if(x > 128 || y > 32 || x < 0 || y < 0) return;
Lippi 0:862a4d510e20 185
Lippi 0:862a4d510e20 186 if(draw_mode == NORMAL) {
Lippi 0:862a4d510e20 187 if(color == 0)
Lippi 0:862a4d510e20 188 buffer[x + ((y/8) * 128)] &= ~(1 << (y%8)); // erase pixel
Lippi 0:862a4d510e20 189 else
Lippi 0:862a4d510e20 190 buffer[x + ((y/8) * 128)] |= (1 << (y%8)); // set pixel
Lippi 0:862a4d510e20 191 } else { // XOR mode
Lippi 0:862a4d510e20 192 if(color == 1)
Lippi 0:862a4d510e20 193 buffer[x + ((y/8) * 128)] ^= (1 << (y%8)); // xor pixel
Lippi 0:862a4d510e20 194 }
Lippi 0:862a4d510e20 195 }
Lippi 0:862a4d510e20 196
Lippi 0:862a4d510e20 197 // update lcd
Lippi 0:862a4d510e20 198
Lippi 0:862a4d510e20 199 void C12832_LCD::copy_to_lcd(void)
Lippi 0:862a4d510e20 200 {
Lippi 0:862a4d510e20 201 #ifndef TARGET_LPC1768
Lippi 0:862a4d510e20 202 int i;
Lippi 0:862a4d510e20 203 #endif
Lippi 0:862a4d510e20 204 //page 0
Lippi 0:862a4d510e20 205 wr_cmd(0x00); // set column low nibble 0
Lippi 0:862a4d510e20 206 wr_cmd(0x10); // set column hi nibble 0
Lippi 0:862a4d510e20 207 wr_cmd(0xB0); // set page address 0
Lippi 0:862a4d510e20 208 _A0 = 1;
Lippi 0:862a4d510e20 209 #if defined TARGET_LPC1768
Lippi 0:862a4d510e20 210 _CS = 0;
Lippi 0:862a4d510e20 211 // start 128 byte DMA transfer to SPI1
Lippi 0:862a4d510e20 212 LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&LPC_SSP1->DR; // we send to SSP1
Lippi 0:862a4d510e20 213 LPC_SSP1->DMACR = 0x2; // Enable SSP1 for DMA.
Lippi 0:862a4d510e20 214 LPC_GPDMA->DMACIntTCClear = 0x1;
Lippi 0:862a4d510e20 215 LPC_GPDMA->DMACIntErrClr = 0x1;
Lippi 0:862a4d510e20 216 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t) (buffer);
Lippi 0:862a4d510e20 217 LPC_GPDMACH0->DMACCControl = 128 | (1UL << 31) | DMA_CHANNEL_SRC_INC ; // 8 bit transfer , address increment, interrupt
Lippi 0:862a4d510e20 218 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE | DMA_TRANSFER_TYPE_M2P | DMA_DEST_SSP1_TX;
Lippi 0:862a4d510e20 219 LPC_GPDMA->DMACSoftSReq = 0x1;
Lippi 0:862a4d510e20 220 do {
Lippi 0:862a4d510e20 221 } while ((LPC_GPDMA->DMACRawIntTCStat & 0x01) == 0); // DMA is running
Lippi 0:862a4d510e20 222 do {
Lippi 0:862a4d510e20 223 } while ((LPC_SSP1->SR & 0x10) == 0x10); // SPI1 not idle
Lippi 0:862a4d510e20 224 _CS = 1;
Lippi 0:862a4d510e20 225 #else // no DMA
Lippi 0:862a4d510e20 226 for(i=0;i<128;i++){
Lippi 0:862a4d510e20 227 wr_dat(buffer[i]);
Lippi 0:862a4d510e20 228 }
Lippi 0:862a4d510e20 229 #endif
Lippi 0:862a4d510e20 230
Lippi 0:862a4d510e20 231 // page 1
Lippi 0:862a4d510e20 232 wr_cmd(0x00); // set column low nibble 0
Lippi 0:862a4d510e20 233 wr_cmd(0x10); // set column hi nibble 0
Lippi 0:862a4d510e20 234 wr_cmd(0xB1); // set page address 1
Lippi 0:862a4d510e20 235 _A0 = 1;
Lippi 0:862a4d510e20 236 #if defined TARGET_LPC1768
Lippi 0:862a4d510e20 237 _CS = 0;
Lippi 0:862a4d510e20 238 // start 128 byte DMA transfer to SPI1
Lippi 0:862a4d510e20 239 LPC_GPDMA->DMACIntTCClear = 0x1;
Lippi 0:862a4d510e20 240 LPC_GPDMA->DMACIntErrClr = 0x1;
Lippi 0:862a4d510e20 241 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t) (buffer + 128);
Lippi 0:862a4d510e20 242 LPC_GPDMACH0->DMACCControl = 128 | (1UL << 31) | DMA_CHANNEL_SRC_INC ; // 8 bit transfer , address increment, interrupt
Lippi 0:862a4d510e20 243 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE | DMA_TRANSFER_TYPE_M2P | DMA_DEST_SSP1_TX;
Lippi 0:862a4d510e20 244 LPC_GPDMA->DMACSoftSReq = 0x1;
Lippi 0:862a4d510e20 245 do {
Lippi 0:862a4d510e20 246 } while ((LPC_GPDMA->DMACRawIntTCStat & 0x01) == 0); // DMA is running
Lippi 0:862a4d510e20 247 do {
Lippi 0:862a4d510e20 248 } while ((LPC_SSP1->SR & 0x10) == 0x10); // SPI1 not idle
Lippi 0:862a4d510e20 249 _CS = 1;
Lippi 0:862a4d510e20 250 #else // no DMA
Lippi 0:862a4d510e20 251 for(i=128;i<256;i++){
Lippi 0:862a4d510e20 252 wr_dat(buffer[i]);
Lippi 0:862a4d510e20 253 }
Lippi 0:862a4d510e20 254 #endif
Lippi 0:862a4d510e20 255
Lippi 0:862a4d510e20 256 //page 2
Lippi 0:862a4d510e20 257 wr_cmd(0x00); // set column low nibble 0
Lippi 0:862a4d510e20 258 wr_cmd(0x10); // set column hi nibble 0
Lippi 0:862a4d510e20 259 wr_cmd(0xB2); // set page address 2
Lippi 0:862a4d510e20 260 _A0 = 1;
Lippi 0:862a4d510e20 261 #if defined TARGET_LPC1768
Lippi 0:862a4d510e20 262 _CS = 0;
Lippi 0:862a4d510e20 263 // start 128 byte DMA transfer to SPI1
Lippi 0:862a4d510e20 264 LPC_GPDMA->DMACIntTCClear = 0x1;
Lippi 0:862a4d510e20 265 LPC_GPDMA->DMACIntErrClr = 0x1;
Lippi 0:862a4d510e20 266 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t) (buffer + 256);
Lippi 0:862a4d510e20 267 LPC_GPDMACH0->DMACCControl = 128 | (1UL << 31) | DMA_CHANNEL_SRC_INC ; // 8 bit transfer , address increment, interrupt
Lippi 0:862a4d510e20 268 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE | DMA_TRANSFER_TYPE_M2P | DMA_DEST_SSP1_TX ;
Lippi 0:862a4d510e20 269 LPC_GPDMA->DMACSoftSReq = 0x1;
Lippi 0:862a4d510e20 270 do {
Lippi 0:862a4d510e20 271 } while ((LPC_GPDMA->DMACRawIntTCStat & 0x01) == 0); // DMA is running
Lippi 0:862a4d510e20 272 do {
Lippi 0:862a4d510e20 273 } while ((LPC_SSP1->SR & 0x10) == 0x10); // SPI1 not idle
Lippi 0:862a4d510e20 274 _CS = 1;
Lippi 0:862a4d510e20 275 #else // no DMA
Lippi 0:862a4d510e20 276 for(i=256;i<384;i++){
Lippi 0:862a4d510e20 277 wr_dat(buffer[i]);
Lippi 0:862a4d510e20 278 }
Lippi 0:862a4d510e20 279 #endif
Lippi 0:862a4d510e20 280
Lippi 0:862a4d510e20 281 //page 3
Lippi 0:862a4d510e20 282 wr_cmd(0x00); // set column low nibble 0
Lippi 0:862a4d510e20 283 wr_cmd(0x10); // set column hi nibble 0
Lippi 0:862a4d510e20 284 wr_cmd(0xB3); // set page address 3
Lippi 0:862a4d510e20 285 _A0 = 1;
Lippi 0:862a4d510e20 286
Lippi 0:862a4d510e20 287 _CS = 0;
Lippi 0:862a4d510e20 288 #if defined TARGET_LPC1768
Lippi 0:862a4d510e20 289 // start 128 byte DMA transfer to SPI1
Lippi 0:862a4d510e20 290 LPC_GPDMA->DMACIntTCClear = 0x1;
Lippi 0:862a4d510e20 291 LPC_GPDMA->DMACIntErrClr = 0x1;
Lippi 0:862a4d510e20 292 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t) (buffer + 384);
Lippi 0:862a4d510e20 293 LPC_GPDMACH0->DMACCControl = 128 | (1UL << 31) | DMA_CHANNEL_SRC_INC ; // 8 bit transfer , address increment, interrupt
Lippi 0:862a4d510e20 294 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE | DMA_TRANSFER_TYPE_M2P | DMA_DEST_SSP1_TX;
Lippi 0:862a4d510e20 295 LPC_GPDMA->DMACSoftSReq = 0x1;
Lippi 0:862a4d510e20 296 do {
Lippi 0:862a4d510e20 297 } while ((LPC_GPDMA->DMACRawIntTCStat & 0x01) == 0); // DMA is running
Lippi 0:862a4d510e20 298 do {
Lippi 0:862a4d510e20 299 } while ((LPC_SSP1->SR & 0x10) == 0x10); // SPI1 not idle
Lippi 0:862a4d510e20 300 _CS = 1;
Lippi 0:862a4d510e20 301 #else // no DMA
Lippi 0:862a4d510e20 302 for(i=384;i<512;i++){
Lippi 0:862a4d510e20 303 wr_dat(buffer[i]);
Lippi 0:862a4d510e20 304 }
Lippi 0:862a4d510e20 305 #endif
Lippi 0:862a4d510e20 306 }
Lippi 0:862a4d510e20 307
Lippi 0:862a4d510e20 308 void C12832_LCD::cls(void)
Lippi 0:862a4d510e20 309 {
Lippi 0:862a4d510e20 310 memset(buffer,0x00,512); // clear display buffer
Lippi 0:862a4d510e20 311 copy_to_lcd();
Lippi 0:862a4d510e20 312 }
Lippi 0:862a4d510e20 313
Lippi 0:862a4d510e20 314
Lippi 0:862a4d510e20 315 void C12832_LCD::line(int x0, int y0, int x1, int y1, int color)
Lippi 0:862a4d510e20 316 {
Lippi 0:862a4d510e20 317 int dx = 0, dy = 0;
Lippi 0:862a4d510e20 318 int dx_sym = 0, dy_sym = 0;
Lippi 0:862a4d510e20 319 int dx_x2 = 0, dy_x2 = 0;
Lippi 0:862a4d510e20 320 int di = 0;
Lippi 0:862a4d510e20 321
Lippi 0:862a4d510e20 322 dx = x1-x0;
Lippi 0:862a4d510e20 323 dy = y1-y0;
Lippi 0:862a4d510e20 324
Lippi 0:862a4d510e20 325 // if (dx == 0) { /* vertical line */
Lippi 0:862a4d510e20 326 // if (y1 > y0) vline(x0,y0,y1,color);
Lippi 0:862a4d510e20 327 // else vline(x0,y1,y0,color);
Lippi 0:862a4d510e20 328 // return;
Lippi 0:862a4d510e20 329 // }
Lippi 0:862a4d510e20 330
Lippi 0:862a4d510e20 331 if (dx > 0) {
Lippi 0:862a4d510e20 332 dx_sym = 1;
Lippi 0:862a4d510e20 333 } else {
Lippi 0:862a4d510e20 334 dx_sym = -1;
Lippi 0:862a4d510e20 335 }
Lippi 0:862a4d510e20 336 // if (dy == 0) { /* horizontal line */
Lippi 0:862a4d510e20 337 // if (x1 > x0) hline(x0,x1,y0,color);
Lippi 0:862a4d510e20 338 // else hline(x1,x0,y0,color);
Lippi 0:862a4d510e20 339 // return;
Lippi 0:862a4d510e20 340 // }
Lippi 0:862a4d510e20 341
Lippi 0:862a4d510e20 342 if (dy > 0) {
Lippi 0:862a4d510e20 343 dy_sym = 1;
Lippi 0:862a4d510e20 344 } else {
Lippi 0:862a4d510e20 345 dy_sym = -1;
Lippi 0:862a4d510e20 346 }
Lippi 0:862a4d510e20 347
Lippi 0:862a4d510e20 348 dx = dx_sym*dx;
Lippi 0:862a4d510e20 349 dy = dy_sym*dy;
Lippi 0:862a4d510e20 350
Lippi 0:862a4d510e20 351 dx_x2 = dx*2;
Lippi 0:862a4d510e20 352 dy_x2 = dy*2;
Lippi 0:862a4d510e20 353
Lippi 0:862a4d510e20 354 if (dx >= dy) {
Lippi 0:862a4d510e20 355 di = dy_x2 - dx;
Lippi 0:862a4d510e20 356 while (x0 != x1) {
Lippi 0:862a4d510e20 357
Lippi 0:862a4d510e20 358 pixel(x0, y0, color);
Lippi 0:862a4d510e20 359 x0 += dx_sym;
Lippi 0:862a4d510e20 360 if (di<0) {
Lippi 0:862a4d510e20 361 di += dy_x2;
Lippi 0:862a4d510e20 362 } else {
Lippi 0:862a4d510e20 363 di += dy_x2 - dx_x2;
Lippi 0:862a4d510e20 364 y0 += dy_sym;
Lippi 0:862a4d510e20 365 }
Lippi 0:862a4d510e20 366 }
Lippi 0:862a4d510e20 367 pixel(x0, y0, color);
Lippi 0:862a4d510e20 368 } else {
Lippi 0:862a4d510e20 369 di = dx_x2 - dy;
Lippi 0:862a4d510e20 370 while (y0 != y1) {
Lippi 0:862a4d510e20 371 pixel(x0, y0, color);
Lippi 0:862a4d510e20 372 y0 += dy_sym;
Lippi 0:862a4d510e20 373 if (di < 0) {
Lippi 0:862a4d510e20 374 di += dx_x2;
Lippi 0:862a4d510e20 375 } else {
Lippi 0:862a4d510e20 376 di += dx_x2 - dy_x2;
Lippi 0:862a4d510e20 377 x0 += dx_sym;
Lippi 0:862a4d510e20 378 }
Lippi 0:862a4d510e20 379 }
Lippi 0:862a4d510e20 380 pixel(x0, y0, color);
Lippi 0:862a4d510e20 381 }
Lippi 0:862a4d510e20 382 if(auto_up) copy_to_lcd();
Lippi 0:862a4d510e20 383 }
Lippi 0:862a4d510e20 384
Lippi 0:862a4d510e20 385 void C12832_LCD::rect(int x0, int y0, int x1, int y1, int color)
Lippi 0:862a4d510e20 386 {
Lippi 0:862a4d510e20 387
Lippi 0:862a4d510e20 388 if (x1 > x0) line(x0,y0,x1,y0,color);
Lippi 0:862a4d510e20 389 else line(x1,y0,x0,y0,color);
Lippi 0:862a4d510e20 390
Lippi 0:862a4d510e20 391 if (y1 > y0) line(x0,y0,x0,y1,color);
Lippi 0:862a4d510e20 392 else line(x0,y1,x0,y0,color);
Lippi 0:862a4d510e20 393
Lippi 0:862a4d510e20 394 if (x1 > x0) line(x0,y1,x1,y1,color);
Lippi 0:862a4d510e20 395 else line(x1,y1,x0,y1,color);
Lippi 0:862a4d510e20 396
Lippi 0:862a4d510e20 397 if (y1 > y0) line(x1,y0,x1,y1,color);
Lippi 0:862a4d510e20 398 else line(x1,y1,x1,y0,color);
Lippi 0:862a4d510e20 399
Lippi 0:862a4d510e20 400 if(auto_up) copy_to_lcd();
Lippi 0:862a4d510e20 401 }
Lippi 0:862a4d510e20 402
Lippi 0:862a4d510e20 403 void C12832_LCD::fillrect(int x0, int y0, int x1, int y1, int color)
Lippi 0:862a4d510e20 404 {
Lippi 0:862a4d510e20 405 int l,c,i;
Lippi 0:862a4d510e20 406 if(x0 > x1) {
Lippi 0:862a4d510e20 407 i = x0;
Lippi 0:862a4d510e20 408 x0 = x1;
Lippi 0:862a4d510e20 409 x1 = i;
Lippi 0:862a4d510e20 410 }
Lippi 0:862a4d510e20 411
Lippi 0:862a4d510e20 412 if(y0 > y1) {
Lippi 0:862a4d510e20 413 i = y0;
Lippi 0:862a4d510e20 414 y0 = y1;
Lippi 0:862a4d510e20 415 y1 = i;
Lippi 0:862a4d510e20 416 }
Lippi 0:862a4d510e20 417
Lippi 0:862a4d510e20 418 for(l = x0; l<= x1; l ++) {
Lippi 0:862a4d510e20 419 for(c = y0; c<= y1; c++) {
Lippi 0:862a4d510e20 420 pixel(l,c,color);
Lippi 0:862a4d510e20 421 }
Lippi 0:862a4d510e20 422 }
Lippi 0:862a4d510e20 423 if(auto_up) copy_to_lcd();
Lippi 0:862a4d510e20 424 }
Lippi 0:862a4d510e20 425
Lippi 0:862a4d510e20 426
Lippi 0:862a4d510e20 427
Lippi 0:862a4d510e20 428 void C12832_LCD::circle(int x0, int y0, int r, int color)
Lippi 0:862a4d510e20 429 {
Lippi 0:862a4d510e20 430
Lippi 0:862a4d510e20 431 int draw_x0, draw_y0;
Lippi 0:862a4d510e20 432 int draw_x1, draw_y1;
Lippi 0:862a4d510e20 433 int draw_x2, draw_y2;
Lippi 0:862a4d510e20 434 int draw_x3, draw_y3;
Lippi 0:862a4d510e20 435 int draw_x4, draw_y4;
Lippi 0:862a4d510e20 436 int draw_x5, draw_y5;
Lippi 0:862a4d510e20 437 int draw_x6, draw_y6;
Lippi 0:862a4d510e20 438 int draw_x7, draw_y7;
Lippi 0:862a4d510e20 439 int xx, yy;
Lippi 0:862a4d510e20 440 int di;
Lippi 0:862a4d510e20 441 //WindowMax();
Lippi 0:862a4d510e20 442 if (r == 0) { /* no radius */
Lippi 0:862a4d510e20 443 return;
Lippi 0:862a4d510e20 444 }
Lippi 0:862a4d510e20 445
Lippi 0:862a4d510e20 446 draw_x0 = draw_x1 = x0;
Lippi 0:862a4d510e20 447 draw_y0 = draw_y1 = y0 + r;
Lippi 0:862a4d510e20 448 if (draw_y0 < height()) {
Lippi 0:862a4d510e20 449 pixel(draw_x0, draw_y0, color); /* 90 degree */
Lippi 0:862a4d510e20 450 }
Lippi 0:862a4d510e20 451
Lippi 0:862a4d510e20 452 draw_x2 = draw_x3 = x0;
Lippi 0:862a4d510e20 453 draw_y2 = draw_y3 = y0 - r;
Lippi 0:862a4d510e20 454 if (draw_y2 >= 0) {
Lippi 0:862a4d510e20 455 pixel(draw_x2, draw_y2, color); /* 270 degree */
Lippi 0:862a4d510e20 456 }
Lippi 0:862a4d510e20 457
Lippi 0:862a4d510e20 458 draw_x4 = draw_x6 = x0 + r;
Lippi 0:862a4d510e20 459 draw_y4 = draw_y6 = y0;
Lippi 0:862a4d510e20 460 if (draw_x4 < width()) {
Lippi 0:862a4d510e20 461 pixel(draw_x4, draw_y4, color); /* 0 degree */
Lippi 0:862a4d510e20 462 }
Lippi 0:862a4d510e20 463
Lippi 0:862a4d510e20 464 draw_x5 = draw_x7 = x0 - r;
Lippi 0:862a4d510e20 465 draw_y5 = draw_y7 = y0;
Lippi 0:862a4d510e20 466 if (draw_x5>=0) {
Lippi 0:862a4d510e20 467 pixel(draw_x5, draw_y5, color); /* 180 degree */
Lippi 0:862a4d510e20 468 }
Lippi 0:862a4d510e20 469
Lippi 0:862a4d510e20 470 if (r == 1) {
Lippi 0:862a4d510e20 471 return;
Lippi 0:862a4d510e20 472 }
Lippi 0:862a4d510e20 473
Lippi 0:862a4d510e20 474 di = 3 - 2*r;
Lippi 0:862a4d510e20 475 xx = 0;
Lippi 0:862a4d510e20 476 yy = r;
Lippi 0:862a4d510e20 477 while (xx < yy) {
Lippi 0:862a4d510e20 478
Lippi 0:862a4d510e20 479 if (di < 0) {
Lippi 0:862a4d510e20 480 di += 4*xx + 6;
Lippi 0:862a4d510e20 481 } else {
Lippi 0:862a4d510e20 482 di += 4*(xx - yy) + 10;
Lippi 0:862a4d510e20 483 yy--;
Lippi 0:862a4d510e20 484 draw_y0--;
Lippi 0:862a4d510e20 485 draw_y1--;
Lippi 0:862a4d510e20 486 draw_y2++;
Lippi 0:862a4d510e20 487 draw_y3++;
Lippi 0:862a4d510e20 488 draw_x4--;
Lippi 0:862a4d510e20 489 draw_x5++;
Lippi 0:862a4d510e20 490 draw_x6--;
Lippi 0:862a4d510e20 491 draw_x7++;
Lippi 0:862a4d510e20 492 }
Lippi 0:862a4d510e20 493 xx++;
Lippi 0:862a4d510e20 494 draw_x0++;
Lippi 0:862a4d510e20 495 draw_x1--;
Lippi 0:862a4d510e20 496 draw_x2++;
Lippi 0:862a4d510e20 497 draw_x3--;
Lippi 0:862a4d510e20 498 draw_y4++;
Lippi 0:862a4d510e20 499 draw_y5++;
Lippi 0:862a4d510e20 500 draw_y6--;
Lippi 0:862a4d510e20 501 draw_y7--;
Lippi 0:862a4d510e20 502
Lippi 0:862a4d510e20 503 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
Lippi 0:862a4d510e20 504 pixel(draw_x0, draw_y0, color);
Lippi 0:862a4d510e20 505 }
Lippi 0:862a4d510e20 506
Lippi 0:862a4d510e20 507 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
Lippi 0:862a4d510e20 508 pixel(draw_x1, draw_y1, color);
Lippi 0:862a4d510e20 509 }
Lippi 0:862a4d510e20 510
Lippi 0:862a4d510e20 511 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
Lippi 0:862a4d510e20 512 pixel(draw_x2, draw_y2, color);
Lippi 0:862a4d510e20 513 }
Lippi 0:862a4d510e20 514
Lippi 0:862a4d510e20 515 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
Lippi 0:862a4d510e20 516 pixel(draw_x3, draw_y3, color);
Lippi 0:862a4d510e20 517 }
Lippi 0:862a4d510e20 518
Lippi 0:862a4d510e20 519 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
Lippi 0:862a4d510e20 520 pixel(draw_x4, draw_y4, color);
Lippi 0:862a4d510e20 521 }
Lippi 0:862a4d510e20 522
Lippi 0:862a4d510e20 523 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
Lippi 0:862a4d510e20 524 pixel(draw_x5, draw_y5, color);
Lippi 0:862a4d510e20 525 }
Lippi 0:862a4d510e20 526 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
Lippi 0:862a4d510e20 527 pixel(draw_x6, draw_y6, color);
Lippi 0:862a4d510e20 528 }
Lippi 0:862a4d510e20 529 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
Lippi 0:862a4d510e20 530 pixel(draw_x7, draw_y7, color);
Lippi 0:862a4d510e20 531 }
Lippi 0:862a4d510e20 532 }
Lippi 0:862a4d510e20 533 if(auto_up) copy_to_lcd();
Lippi 0:862a4d510e20 534 }
Lippi 0:862a4d510e20 535
Lippi 0:862a4d510e20 536 void C12832_LCD::fillcircle(int x, int y, int r, int color)
Lippi 0:862a4d510e20 537 {
Lippi 0:862a4d510e20 538 int i,up;
Lippi 0:862a4d510e20 539 up = auto_up;
Lippi 0:862a4d510e20 540 auto_up = 0; // off
Lippi 0:862a4d510e20 541 for (i = 0; i <= r; i++)
Lippi 0:862a4d510e20 542 circle(x,y,i,color);
Lippi 0:862a4d510e20 543 auto_up = up;
Lippi 0:862a4d510e20 544 if(auto_up) copy_to_lcd();
Lippi 0:862a4d510e20 545 }
Lippi 0:862a4d510e20 546
Lippi 0:862a4d510e20 547 void C12832_LCD::setmode(int mode)
Lippi 0:862a4d510e20 548 {
Lippi 0:862a4d510e20 549 draw_mode = mode;
Lippi 0:862a4d510e20 550 }
Lippi 0:862a4d510e20 551
Lippi 0:862a4d510e20 552 void C12832_LCD::locate(int x, int y)
Lippi 0:862a4d510e20 553 {
Lippi 0:862a4d510e20 554 char_x = x;
Lippi 0:862a4d510e20 555 char_y = y;
Lippi 0:862a4d510e20 556 }
Lippi 0:862a4d510e20 557
Lippi 0:862a4d510e20 558
Lippi 0:862a4d510e20 559
Lippi 0:862a4d510e20 560 int C12832_LCD::columns()
Lippi 0:862a4d510e20 561 {
Lippi 0:862a4d510e20 562 return width() / font[1];
Lippi 0:862a4d510e20 563 }
Lippi 0:862a4d510e20 564
Lippi 0:862a4d510e20 565
Lippi 0:862a4d510e20 566
Lippi 0:862a4d510e20 567 int C12832_LCD::rows()
Lippi 0:862a4d510e20 568 {
Lippi 0:862a4d510e20 569 return height() / font[2];
Lippi 0:862a4d510e20 570 }
Lippi 0:862a4d510e20 571
Lippi 0:862a4d510e20 572
Lippi 0:862a4d510e20 573
Lippi 0:862a4d510e20 574 int C12832_LCD::_putc(int value)
Lippi 0:862a4d510e20 575 {
Lippi 0:862a4d510e20 576 if (value == '\n') { // new line
Lippi 0:862a4d510e20 577 char_x = 0;
Lippi 0:862a4d510e20 578 char_y = char_y + font[2];
Lippi 0:862a4d510e20 579 if (char_y >= height() - font[2]) {
Lippi 0:862a4d510e20 580 char_y = 0;
Lippi 0:862a4d510e20 581 }
Lippi 0:862a4d510e20 582 } else {
Lippi 0:862a4d510e20 583 character(char_x, char_y, value);
Lippi 0:862a4d510e20 584 if(auto_up) copy_to_lcd();
Lippi 0:862a4d510e20 585 }
Lippi 0:862a4d510e20 586 return value;
Lippi 0:862a4d510e20 587 }
Lippi 0:862a4d510e20 588
Lippi 0:862a4d510e20 589 void C12832_LCD::character(int x, int y, int c)
Lippi 0:862a4d510e20 590 {
Lippi 0:862a4d510e20 591 unsigned int hor,vert,offset,bpl,j,i,b;
Lippi 0:862a4d510e20 592 unsigned char* zeichen;
Lippi 0:862a4d510e20 593 unsigned char z,w;
Lippi 0:862a4d510e20 594
Lippi 0:862a4d510e20 595 if ((c < 31) || (c > 127)) return; // test char range
Lippi 0:862a4d510e20 596
Lippi 0:862a4d510e20 597 // read font parameter from start of array
Lippi 0:862a4d510e20 598 offset = font[0]; // bytes / char
Lippi 0:862a4d510e20 599 hor = font[1]; // get hor size of font
Lippi 0:862a4d510e20 600 vert = font[2]; // get vert size of font
Lippi 0:862a4d510e20 601 bpl = font[3]; // bytes per line
Lippi 0:862a4d510e20 602
Lippi 0:862a4d510e20 603 if (char_x + hor > width()) {
Lippi 0:862a4d510e20 604 char_x = 0;
Lippi 0:862a4d510e20 605 char_y = char_y + vert;
Lippi 0:862a4d510e20 606 if (char_y >= height() - font[2]) {
Lippi 0:862a4d510e20 607 char_y = 0;
Lippi 0:862a4d510e20 608 }
Lippi 0:862a4d510e20 609 }
Lippi 0:862a4d510e20 610
Lippi 0:862a4d510e20 611 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
Lippi 0:862a4d510e20 612 w = zeichen[0]; // width of actual char
Lippi 0:862a4d510e20 613 // construct the char into the buffer
Lippi 0:862a4d510e20 614 for (j=0; j<vert; j++) { // vert line
Lippi 0:862a4d510e20 615 for (i=0; i<hor; i++) { // horz line
Lippi 0:862a4d510e20 616 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
Lippi 0:862a4d510e20 617 b = 1 << (j & 0x07);
Lippi 0:862a4d510e20 618 if (( z & b ) == 0x00) {
Lippi 0:862a4d510e20 619 pixel(x+i,y+j,0);
Lippi 0:862a4d510e20 620 } else {
Lippi 0:862a4d510e20 621 pixel(x+i,y+j,1);
Lippi 0:862a4d510e20 622 }
Lippi 0:862a4d510e20 623
Lippi 0:862a4d510e20 624 }
Lippi 0:862a4d510e20 625 }
Lippi 0:862a4d510e20 626
Lippi 0:862a4d510e20 627 char_x += w;
Lippi 0:862a4d510e20 628 }
Lippi 0:862a4d510e20 629
Lippi 0:862a4d510e20 630
Lippi 0:862a4d510e20 631 void C12832_LCD::set_font(unsigned char* f)
Lippi 0:862a4d510e20 632 {
Lippi 0:862a4d510e20 633 font = f;
Lippi 0:862a4d510e20 634 }
Lippi 0:862a4d510e20 635
Lippi 0:862a4d510e20 636 void C12832_LCD::set_auto_up(unsigned int up)
Lippi 0:862a4d510e20 637 {
Lippi 0:862a4d510e20 638 if(up ) auto_up = 1;
Lippi 0:862a4d510e20 639 }
Lippi 0:862a4d510e20 640
Lippi 0:862a4d510e20 641 unsigned int C12832_LCD::get_auto_up(void){
Lippi 0:862a4d510e20 642 return (auto_up);
Lippi 0:862a4d510e20 643 }
Lippi 0:862a4d510e20 644
Lippi 0:862a4d510e20 645