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:
Tue Oct 16 17:50:37 2012 +0000
Revision:
1:66dd8afbfd06
Parent:
0:4bbc531be6e2
Child:
2:bdc53502af17
add get_contrast to read contrast setting

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