Lib for the LCD display on mbed lab Board

Dependents:   SprintUSBModemWebsocketTest-LCD-RO iOSAppChat Christmas-LCD led_dimm ... more

Basic information

The LCD on the mbed lab board has 128 x 32 pixels and is connected via spi. It use a ST7565R controller. The spi connection is fast, but it has one drawback - you can't read the display buffer. This is a problem, because each bit reflect a pixel. If you want to set only one bit / pixel, you have to know the status of the other seven bits / pixel. Because of this we have to use a framebuffer (128 * 32 / 8 = 512 Byte). All drawing functions are working on this framebuffer. If you use the LPC1768 based mbed, the dma channel 0 is used to speed up the transfer to the lcd. This information is only relevant if you also want to use the dma controller. You have to switch to a other channel.

There are two update mode. After startup the automode is turned on. This means that the display is automaticly updated after the drawing. For example - if you call the function

lcd.line(x0, y0, x1, y1, 1);

a line from x0,y0 to x1,y1 is drawn inside the framebuffer and after that the framebuffer is copied to the lcd. If you draw more lines, it will be faster to draw all graphics inside the framebuffer and update the lcd only once. To do so, you can use the function :

lcd.set_auto_up(0);

This switch off the autoupdate. If you want to see it, you have to refresh the lcd by calling the function :

lcd.copy_to_lcd();

lcd.set_auto_up(1);

will switch back to auto update mode.

Basic functions

To use the lcd we have to create a lcd object :

C12832_LCD lcd;

There are two drawing modes : NORMAL and XOR. At startup the mode is NORMAL. If you use

lcd.setmode(XOR);

you switch to XOR mode. In this mode a pixel in the frambuffer is inverted if you set it to 1.

lcd.setmode(NORMAL);

switch back to normal mode.

The function :

lcd.invert(1);

will invert the lcd. This is done by the lcd controller. The framebuffer is not changed.

lcd.invert(0);

will switch back.

The function :

lcd.cls();

clear the screen.

The function :

lcd.set_contrast(25);

will set the contrast. The lib start with 23. A value between 10 and 35 will be visible.

Text

To print text you simply have to use the printf function. The output of the stdout is redirected to the lcd.

lcd.printf("temperature : %3.2f F",heat);

The position can be set up with the function :

lcd.locate(x,y);

At startup a 7 pixel font is used. If you want to use a different font you can include the lib http://mbed.org/users/dreschpe/code/LCD_fonts. This lib include four additional fonts. From 6 pixel to 23 pixel. To switch the font use :

lcd.set_font((unsigned char*) Arial_9);

The names of the fonts are : Small_6, Small_7, Arial_9, Arial12x12 and Arial24x23.

The function :

lcd._putc(c);

print the char c on the actual cursor position.

The function :

lcd.character(x, y, c);

print the char c at position x,y.

Graphic

The function :

lcd.line(x0, y0, x1, y1, color);

draw a single pixel line from x0,y0 to x1,y1. If color is 1 : black, 0 : white.

The function :

lcd.rect(x0, y0, x1, y1, color);

draw a single pixel rectangle from x0, y0 to x1, y1. If color is 1 : black, 0 : white.

The function :

lcd.fillrect(x0, y0, x1, y1, color);

draw a filled rectangle from x0, y0 to x1, y1. If color is 1 : black, 0 : white.

The function :

lcd.circle(x, y, r, color);

draw a circle with x,y center and radius r. If color is 1 : black, 0 : white.

The function :

lcd.fillcircle(x, y, r, color);

draw a filled circle with x,y center and radius r. If color is 1 : black, 0 : white.

The function :

lcd.pixel(x, y, color);

set a single pixel at x,y. If color is 1 : black, 0 : white. This function is not updating the lcd ! Even if the autoupdate is on. You have to call lcd.copy_to_lcd() after using this function - or to use a other function with autoupdate afterwards.

mbed rtos

To use the mbed rtos with the lib we have to make the lib thread save. What is the problem ? If different threads are writing to the lcd it can end in troubble. Thread1 is using the pintf("hello mbed") function to print this string to the actual position. After the chars "hel" are printed ,the scheduler is switching to thread2. This thread is writing at a different position on the screen. After that the scheduler is switch back to thread1 and the print function continue. Thread1 did not know that the internal cursor position has changed ....

To protect the access to the lcd we use a Mutex. If a thread has the mutex and a other thread also want it, the second thread has to wait.

Mutex lcd_mutex;  // define the mutex
    //...
lcd_mutex.lock(); // get the mutex or wait

//acccess to the lcd
 
lcd_mutex.unlock(); // free the mutex 

We use this framing to access the lcd.

Test program to show : http://mbed.org/users/dreschpe/code/lab1/

Committer:
dreschpe
Date:
Thu Oct 25 17:34:34 2012 +0000
Revision:
3:468cdccff7af
Parent:
2:bdc53502af17
Child:
7:0f5a3b0f3cab
Add auto update of the framebuffer; Include standart font into lib

Who changed what in which revision?

UserRevisionLine numberNew 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