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