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:
sam_grove
Date:
Sun Oct 27 23:16:07 2013 +0000
Revision:
10:8f86576007d6
Parent:
8:c9afe58d786a
Don't claim stdout by default. Make the user of the library do that.

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