Alan Ffrench / Mbed 2 deprecated Experiment_2_5

Dependencies:   mbed

Committer:
alanffrench
Date:
Wed Jul 29 18:51:38 2020 +0000
Revision:
0:52468b19aa21
Threads

Who changed what in which revision?

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