![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
TO CHECKOUT
lcd.c@1:6a77fc8e1389, 2014-12-02 (annotated)
- Committer:
- chrish
- Date:
- Tue Dec 02 13:29:16 2014 +0000
- Revision:
- 1:6a77fc8e1389
- Parent:
- 0:785c2b62c4d1
Nr2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chrish | 0:785c2b62c4d1 | 1 | #include <stdarg.h> |
chrish | 0:785c2b62c4d1 | 2 | #include "lcd.h" |
chrish | 0:785c2b62c4d1 | 3 | |
chrish | 0:785c2b62c4d1 | 4 | void lcd_init(lcd_t * lcd, spi_t * spi, PinName CS, PinName CD) { |
chrish | 0:785c2b62c4d1 | 5 | //Prepare pins |
chrish | 0:785c2b62c4d1 | 6 | gpio_init_out(&(lcd->CS), CS ); |
chrish | 0:785c2b62c4d1 | 7 | gpio_init_out(&(lcd->CD), CD); |
chrish | 0:785c2b62c4d1 | 8 | |
chrish | 0:785c2b62c4d1 | 9 | gpio_write(&(lcd->CS), 1); |
chrish | 0:785c2b62c4d1 | 10 | gpio_write(&(lcd->CD), 1); |
chrish | 0:785c2b62c4d1 | 11 | // |
chrish | 0:785c2b62c4d1 | 12 | |
chrish | 0:785c2b62c4d1 | 13 | lcd->mode = PORTRAIT; |
chrish | 0:785c2b62c4d1 | 14 | //lcd->mode = LANDSCAPE; |
chrish | 0:785c2b62c4d1 | 15 | lcd->spi = spi; |
chrish | 0:785c2b62c4d1 | 16 | |
chrish | 0:785c2b62c4d1 | 17 | wait_ms(500); |
chrish | 0:785c2b62c4d1 | 18 | lcd_writeCommand(lcd, 0x01); |
chrish | 0:785c2b62c4d1 | 19 | wait_ms(200); |
chrish | 0:785c2b62c4d1 | 20 | |
chrish | 0:785c2b62c4d1 | 21 | |
chrish | 0:785c2b62c4d1 | 22 | lcd_writeCommand(lcd, 0xCF); |
chrish | 0:785c2b62c4d1 | 23 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 24 | lcd_writeData(lcd, 0x8B); |
chrish | 0:785c2b62c4d1 | 25 | lcd_writeData(lcd, 0x30); |
chrish | 0:785c2b62c4d1 | 26 | |
chrish | 0:785c2b62c4d1 | 27 | lcd_writeCommand(lcd, 0xED); |
chrish | 0:785c2b62c4d1 | 28 | lcd_writeData(lcd, 0x67); |
chrish | 0:785c2b62c4d1 | 29 | lcd_writeData(lcd, 0x03); |
chrish | 0:785c2b62c4d1 | 30 | lcd_writeData(lcd, 0x12); |
chrish | 0:785c2b62c4d1 | 31 | lcd_writeData(lcd, 0x81); |
chrish | 0:785c2b62c4d1 | 32 | |
chrish | 0:785c2b62c4d1 | 33 | lcd_writeCommand(lcd, 0xE8); |
chrish | 0:785c2b62c4d1 | 34 | lcd_writeData(lcd, 0x85); |
chrish | 0:785c2b62c4d1 | 35 | lcd_writeData(lcd, 0x10); |
chrish | 0:785c2b62c4d1 | 36 | lcd_writeData(lcd, 0x7A); |
chrish | 0:785c2b62c4d1 | 37 | |
chrish | 0:785c2b62c4d1 | 38 | lcd_writeCommand(lcd, 0xCB); |
chrish | 0:785c2b62c4d1 | 39 | lcd_writeData(lcd, 0x39); |
chrish | 0:785c2b62c4d1 | 40 | lcd_writeData(lcd, 0x2C); |
chrish | 0:785c2b62c4d1 | 41 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 42 | lcd_writeData(lcd, 0x34); |
chrish | 0:785c2b62c4d1 | 43 | lcd_writeData(lcd, 0x02); |
chrish | 0:785c2b62c4d1 | 44 | |
chrish | 0:785c2b62c4d1 | 45 | lcd_writeCommand(lcd, 0xF7); |
chrish | 0:785c2b62c4d1 | 46 | lcd_writeData(lcd, 0x20); |
chrish | 0:785c2b62c4d1 | 47 | |
chrish | 0:785c2b62c4d1 | 48 | lcd_writeCommand(lcd, 0xEA); |
chrish | 0:785c2b62c4d1 | 49 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 50 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 51 | |
chrish | 0:785c2b62c4d1 | 52 | lcd_writeCommand(lcd, 0xC0); /* Power control */ |
chrish | 0:785c2b62c4d1 | 53 | lcd_writeData(lcd, 0x1B); /* VRH[5:0] */ |
chrish | 0:785c2b62c4d1 | 54 | |
chrish | 0:785c2b62c4d1 | 55 | lcd_writeCommand(lcd, 0xC1); /* Power control */ |
chrish | 0:785c2b62c4d1 | 56 | lcd_writeData(lcd, 0x10); /* SAP[2:0];BT[3:0] */ |
chrish | 0:785c2b62c4d1 | 57 | |
chrish | 0:785c2b62c4d1 | 58 | lcd_writeCommand(lcd, 0xC5); /* VCM control */ |
chrish | 0:785c2b62c4d1 | 59 | lcd_writeData(lcd, 0x3F); |
chrish | 0:785c2b62c4d1 | 60 | lcd_writeData(lcd, 0x3C); |
chrish | 0:785c2b62c4d1 | 61 | |
chrish | 0:785c2b62c4d1 | 62 | lcd_writeCommand(lcd, 0xC7); /* VCM control2 */ |
chrish | 0:785c2b62c4d1 | 63 | lcd_writeData(lcd, 0xB7); |
chrish | 0:785c2b62c4d1 | 64 | |
chrish | 0:785c2b62c4d1 | 65 | lcd_writeCommand(lcd, 0x36); /* Memory Access Control */ |
chrish | 0:785c2b62c4d1 | 66 | lcd_writeData(lcd, 0x08); |
chrish | 0:785c2b62c4d1 | 67 | |
chrish | 0:785c2b62c4d1 | 68 | lcd_writeCommand(lcd, 0x3A); |
chrish | 0:785c2b62c4d1 | 69 | lcd_writeData(lcd, 0x55); |
chrish | 0:785c2b62c4d1 | 70 | |
chrish | 0:785c2b62c4d1 | 71 | lcd_writeCommand(lcd, 0xB1); |
chrish | 0:785c2b62c4d1 | 72 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 73 | lcd_writeData(lcd, 0x1B); |
chrish | 0:785c2b62c4d1 | 74 | |
chrish | 0:785c2b62c4d1 | 75 | lcd_writeCommand(lcd, 0xB6); /* Display Function Control */ |
chrish | 0:785c2b62c4d1 | 76 | lcd_writeData(lcd, 0x0A); |
chrish | 0:785c2b62c4d1 | 77 | lcd_writeData(lcd, 0xA2); |
chrish | 0:785c2b62c4d1 | 78 | |
chrish | 0:785c2b62c4d1 | 79 | lcd_writeCommand(lcd, 0xF2); /* 3Gamma Function Disable */ |
chrish | 0:785c2b62c4d1 | 80 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 81 | |
chrish | 0:785c2b62c4d1 | 82 | lcd_writeCommand(lcd, 0x26); /* Gamma curve selected */ |
chrish | 0:785c2b62c4d1 | 83 | lcd_writeData(lcd, 0x01); |
chrish | 0:785c2b62c4d1 | 84 | |
chrish | 0:785c2b62c4d1 | 85 | lcd_writeCommand(lcd, 0xE0); /* Set Gamma */ |
chrish | 0:785c2b62c4d1 | 86 | lcd_writeData(lcd, 0x0F); |
chrish | 0:785c2b62c4d1 | 87 | lcd_writeData(lcd, 0x2A); |
chrish | 0:785c2b62c4d1 | 88 | lcd_writeData(lcd, 0x28); |
chrish | 0:785c2b62c4d1 | 89 | lcd_writeData(lcd, 0x08); |
chrish | 0:785c2b62c4d1 | 90 | lcd_writeData(lcd, 0x0E); |
chrish | 0:785c2b62c4d1 | 91 | lcd_writeData(lcd, 0x08); |
chrish | 0:785c2b62c4d1 | 92 | lcd_writeData(lcd, 0x54); |
chrish | 0:785c2b62c4d1 | 93 | lcd_writeData(lcd, 0xA9); |
chrish | 0:785c2b62c4d1 | 94 | lcd_writeData(lcd, 0x43); |
chrish | 0:785c2b62c4d1 | 95 | lcd_writeData(lcd, 0x0A); |
chrish | 0:785c2b62c4d1 | 96 | lcd_writeData(lcd, 0x0F); |
chrish | 0:785c2b62c4d1 | 97 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 98 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 99 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 100 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 101 | |
chrish | 0:785c2b62c4d1 | 102 | lcd_writeCommand(lcd, 0xE1); /* Set Gamma */ |
chrish | 0:785c2b62c4d1 | 103 | lcd_writeData(lcd, 0x00); |
chrish | 0:785c2b62c4d1 | 104 | lcd_writeData(lcd, 0x15); |
chrish | 0:785c2b62c4d1 | 105 | lcd_writeData(lcd, 0x17); |
chrish | 0:785c2b62c4d1 | 106 | lcd_writeData(lcd, 0x07); |
chrish | 0:785c2b62c4d1 | 107 | lcd_writeData(lcd, 0x11); |
chrish | 0:785c2b62c4d1 | 108 | lcd_writeData(lcd, 0x06); |
chrish | 0:785c2b62c4d1 | 109 | lcd_writeData(lcd, 0x2B); |
chrish | 0:785c2b62c4d1 | 110 | lcd_writeData(lcd, 0x56); |
chrish | 0:785c2b62c4d1 | 111 | lcd_writeData(lcd, 0x3C); |
chrish | 0:785c2b62c4d1 | 112 | lcd_writeData(lcd, 0x05); |
chrish | 0:785c2b62c4d1 | 113 | lcd_writeData(lcd, 0x10); |
chrish | 0:785c2b62c4d1 | 114 | lcd_writeData(lcd, 0x0F); |
chrish | 0:785c2b62c4d1 | 115 | lcd_writeData(lcd, 0x3F); |
chrish | 0:785c2b62c4d1 | 116 | lcd_writeData(lcd, 0x3F); |
chrish | 0:785c2b62c4d1 | 117 | lcd_writeData(lcd, 0x0F); |
chrish | 0:785c2b62c4d1 | 118 | |
chrish | 0:785c2b62c4d1 | 119 | lcd_writeCommand(lcd, 0x11); /* Exit Sleep */ |
chrish | 0:785c2b62c4d1 | 120 | wait_ms(120); |
chrish | 0:785c2b62c4d1 | 121 | lcd_writeCommand(lcd, 0x29); |
chrish | 0:785c2b62c4d1 | 122 | lcd_fillScreen(lcd); |
chrish | 0:785c2b62c4d1 | 123 | } |
chrish | 0:785c2b62c4d1 | 124 | |
chrish | 0:785c2b62c4d1 | 125 | void lcd_cs(lcd_t * lcd, int value) { |
chrish | 0:785c2b62c4d1 | 126 | while(spi_busy(lcd->spi)); |
chrish | 0:785c2b62c4d1 | 127 | gpio_write(&(lcd->CS), value); |
chrish | 0:785c2b62c4d1 | 128 | } |
chrish | 0:785c2b62c4d1 | 129 | |
chrish | 0:785c2b62c4d1 | 130 | void lcd_cd(lcd_t * lcd, int value) { |
chrish | 0:785c2b62c4d1 | 131 | while(spi_busy(lcd->spi)); |
chrish | 0:785c2b62c4d1 | 132 | gpio_write(&(lcd->CD), value); |
chrish | 0:785c2b62c4d1 | 133 | } |
chrish | 0:785c2b62c4d1 | 134 | |
chrish | 0:785c2b62c4d1 | 135 | void lcd_setMode(lcd_t * lcd, lcd_mode mode) { |
chrish | 0:785c2b62c4d1 | 136 | lcd->mode = mode; |
chrish | 0:785c2b62c4d1 | 137 | } |
chrish | 0:785c2b62c4d1 | 138 | |
chrish | 0:785c2b62c4d1 | 139 | void lcd_writeCommand(lcd_t * lcd, int value) { |
chrish | 0:785c2b62c4d1 | 140 | lcd_cd(lcd, 0); |
chrish | 0:785c2b62c4d1 | 141 | lcd_cs(lcd, 0); |
chrish | 0:785c2b62c4d1 | 142 | |
chrish | 0:785c2b62c4d1 | 143 | spi_master_write(lcd->spi, value); |
chrish | 0:785c2b62c4d1 | 144 | |
chrish | 0:785c2b62c4d1 | 145 | lcd_cs(lcd, 1); |
chrish | 0:785c2b62c4d1 | 146 | } |
chrish | 0:785c2b62c4d1 | 147 | |
chrish | 0:785c2b62c4d1 | 148 | void lcd_writeData(lcd_t * lcd, int value) { |
chrish | 0:785c2b62c4d1 | 149 | lcd_cd(lcd, 1); |
chrish | 0:785c2b62c4d1 | 150 | lcd_cs(lcd, 0); |
chrish | 0:785c2b62c4d1 | 151 | |
chrish | 0:785c2b62c4d1 | 152 | spi_master_write(lcd->spi, value); |
chrish | 0:785c2b62c4d1 | 153 | |
chrish | 0:785c2b62c4d1 | 154 | lcd_cs(lcd, 1); |
chrish | 0:785c2b62c4d1 | 155 | } |
chrish | 0:785c2b62c4d1 | 156 | |
chrish | 0:785c2b62c4d1 | 157 | void lcd_writeData16(lcd_t * lcd, int value) { |
chrish | 0:785c2b62c4d1 | 158 | int data1 = value >> 8; |
chrish | 0:785c2b62c4d1 | 159 | int data2 = value & 0xff; |
chrish | 0:785c2b62c4d1 | 160 | lcd_cd(lcd, 1); |
chrish | 0:785c2b62c4d1 | 161 | lcd_cs(lcd, 0); |
chrish | 0:785c2b62c4d1 | 162 | |
chrish | 0:785c2b62c4d1 | 163 | spi_master_write(lcd->spi, data1); |
chrish | 0:785c2b62c4d1 | 164 | spi_master_write(lcd->spi, data2); |
chrish | 0:785c2b62c4d1 | 165 | |
chrish | 0:785c2b62c4d1 | 166 | lcd_cs(lcd, 1); |
chrish | 0:785c2b62c4d1 | 167 | } |
chrish | 0:785c2b62c4d1 | 168 | |
chrish | 0:785c2b62c4d1 | 169 | void lcd_setColumn(lcd_t * lcd, int start, int end) { |
chrish | 0:785c2b62c4d1 | 170 | lcd_writeCommand(lcd, 0x2A); /* column command address */ |
chrish | 0:785c2b62c4d1 | 171 | lcd_writeData16(lcd, start); |
chrish | 0:785c2b62c4d1 | 172 | lcd_writeData16(lcd, end); |
chrish | 0:785c2b62c4d1 | 173 | } |
chrish | 0:785c2b62c4d1 | 174 | |
chrish | 0:785c2b62c4d1 | 175 | void lcd_setPage(lcd_t * lcd, int start, int end) { |
chrish | 0:785c2b62c4d1 | 176 | lcd_writeCommand(lcd, 0x2B); /* column command address */ |
chrish | 0:785c2b62c4d1 | 177 | lcd_writeData16(lcd, start); |
chrish | 0:785c2b62c4d1 | 178 | lcd_writeData16(lcd, end); |
chrish | 0:785c2b62c4d1 | 179 | } |
chrish | 0:785c2b62c4d1 | 180 | |
chrish | 0:785c2b62c4d1 | 181 | void lcd_setXY(lcd_t * lcd, int x, int y) { |
chrish | 0:785c2b62c4d1 | 182 | lcd_setColumn(lcd, x, x); |
chrish | 0:785c2b62c4d1 | 183 | lcd_setPage(lcd, y, y); |
chrish | 0:785c2b62c4d1 | 184 | lcd_writeCommand(lcd, 0x2c); |
chrish | 0:785c2b62c4d1 | 185 | } |
chrish | 0:785c2b62c4d1 | 186 | |
chrish | 0:785c2b62c4d1 | 187 | void lcd_setPixel(lcd_t * lcd, int x, int y, int color) { |
chrish | 0:785c2b62c4d1 | 188 | lcd_setXY(lcd, x, y); |
chrish | 0:785c2b62c4d1 | 189 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 190 | } |
chrish | 0:785c2b62c4d1 | 191 | |
chrish | 0:785c2b62c4d1 | 192 | void lcd_setLandscape(lcd_t * lcd) { |
chrish | 0:785c2b62c4d1 | 193 | lcd->mode = LANDSCAPE; |
chrish | 0:785c2b62c4d1 | 194 | } |
chrish | 0:785c2b62c4d1 | 195 | |
chrish | 0:785c2b62c4d1 | 196 | void lcd_setPortrait(lcd_t * lcd) { |
chrish | 0:785c2b62c4d1 | 197 | lcd->mode = PORTRAIT; |
chrish | 0:785c2b62c4d1 | 198 | } |
chrish | 0:785c2b62c4d1 | 199 | |
chrish | 0:785c2b62c4d1 | 200 | void lcd_fillScreen(lcd_t * lcd) { |
chrish | 0:785c2b62c4d1 | 201 | lcd_setColumn(lcd, 0, 239); |
chrish | 0:785c2b62c4d1 | 202 | lcd_setPage(lcd, 0, 319); |
chrish | 0:785c2b62c4d1 | 203 | lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */ |
chrish | 0:785c2b62c4d1 | 204 | |
chrish | 0:785c2b62c4d1 | 205 | lcd_cd(lcd, 1); |
chrish | 0:785c2b62c4d1 | 206 | lcd_cs(lcd, 0); |
chrish | 0:785c2b62c4d1 | 207 | for(int i = 0; i < 76800; i++) |
chrish | 0:785c2b62c4d1 | 208 | { |
chrish | 0:785c2b62c4d1 | 209 | spi_master_write(lcd->spi, 0xFF); |
chrish | 0:785c2b62c4d1 | 210 | spi_master_write(lcd->spi, 0xFF); |
chrish | 0:785c2b62c4d1 | 211 | } |
chrish | 0:785c2b62c4d1 | 212 | while(spi_busy(lcd->spi)); |
chrish | 0:785c2b62c4d1 | 213 | lcd_cs(lcd, 1); |
chrish | 0:785c2b62c4d1 | 214 | } |
chrish | 0:785c2b62c4d1 | 215 | |
chrish | 0:785c2b62c4d1 | 216 | void lcd_drawLine(lcd_t * lcd, int x0, int y0, int x1, int y1, int color) { |
chrish | 0:785c2b62c4d1 | 217 | if (x0 == x1) { |
chrish | 0:785c2b62c4d1 | 218 | lcd_drawVerticalLine(lcd, x0, y0, y1-y0, color); |
chrish | 0:785c2b62c4d1 | 219 | }else if (y0 == y1) { |
chrish | 0:785c2b62c4d1 | 220 | lcd_drawHorizontalLine(lcd, x0, y0, x1-x0, color); |
chrish | 0:785c2b62c4d1 | 221 | }else { |
chrish | 0:785c2b62c4d1 | 222 | if(lcd->mode == LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 223 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 224 | x0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 225 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 226 | |
chrish | 0:785c2b62c4d1 | 227 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 228 | x1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 229 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 230 | |
chrish | 0:785c2b62c4d1 | 231 | x0 = 239-(x0); |
chrish | 0:785c2b62c4d1 | 232 | x1 = 239-(x1); |
chrish | 0:785c2b62c4d1 | 233 | } |
chrish | 0:785c2b62c4d1 | 234 | int x = x1-x0; |
chrish | 0:785c2b62c4d1 | 235 | int y = y1-y0; |
chrish | 0:785c2b62c4d1 | 236 | int dx = abs(x), sx = x0 < x1 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 237 | int dy = -abs(y), sy = y0 < y1 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 238 | int err = dx + dy, e2; /* error value e_xy */ |
chrish | 0:785c2b62c4d1 | 239 | |
chrish | 0:785c2b62c4d1 | 240 | lcd_setPixel(lcd, x0, y0, color); |
chrish | 0:785c2b62c4d1 | 241 | |
chrish | 0:785c2b62c4d1 | 242 | do |
chrish | 0:785c2b62c4d1 | 243 | { |
chrish | 0:785c2b62c4d1 | 244 | e2 = 2*err; |
chrish | 0:785c2b62c4d1 | 245 | |
chrish | 0:785c2b62c4d1 | 246 | if (e2 >= dy) { /* e_xy+e_x > 0 */ |
chrish | 0:785c2b62c4d1 | 247 | err += dy; x0 += sx; |
chrish | 0:785c2b62c4d1 | 248 | } |
chrish | 0:785c2b62c4d1 | 249 | |
chrish | 0:785c2b62c4d1 | 250 | if (e2 <= dx) { /* e_xy+e_y < 0 */ |
chrish | 0:785c2b62c4d1 | 251 | err += dx; y0 += sy; |
chrish | 0:785c2b62c4d1 | 252 | } |
chrish | 0:785c2b62c4d1 | 253 | |
chrish | 0:785c2b62c4d1 | 254 | lcd_setPixel(lcd, x0, y0, color); |
chrish | 0:785c2b62c4d1 | 255 | } while (x0 != x1 || y0 != y1); |
chrish | 0:785c2b62c4d1 | 256 | } |
chrish | 0:785c2b62c4d1 | 257 | } |
chrish | 0:785c2b62c4d1 | 258 | |
chrish | 0:785c2b62c4d1 | 259 | void lcd_drawVerticalLine(lcd_t * lcd, int x, int y, int length, int color) { |
chrish | 0:785c2b62c4d1 | 260 | if(lcd->mode == LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 261 | y = y^x; |
chrish | 0:785c2b62c4d1 | 262 | x = y^x; |
chrish | 0:785c2b62c4d1 | 263 | y = y^x; |
chrish | 0:785c2b62c4d1 | 264 | x = 239-(x); |
chrish | 0:785c2b62c4d1 | 265 | } |
chrish | 0:785c2b62c4d1 | 266 | |
chrish | 0:785c2b62c4d1 | 267 | lcd_setColumn(lcd, x, x); |
chrish | 0:785c2b62c4d1 | 268 | lcd_setPage(lcd, y, y + length); |
chrish | 0:785c2b62c4d1 | 269 | |
chrish | 0:785c2b62c4d1 | 270 | lcd_writeCommand(lcd, 0x2c); |
chrish | 0:785c2b62c4d1 | 271 | for(int i=0; i<length; i++) |
chrish | 0:785c2b62c4d1 | 272 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 273 | } |
chrish | 0:785c2b62c4d1 | 274 | |
chrish | 0:785c2b62c4d1 | 275 | void lcd_drawHorizontalLine(lcd_t * lcd, int x, int y, int length, int color) { |
chrish | 0:785c2b62c4d1 | 276 | if(lcd->mode == LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 277 | y = y^x; |
chrish | 0:785c2b62c4d1 | 278 | x = y^x; |
chrish | 0:785c2b62c4d1 | 279 | y = y^x; |
chrish | 0:785c2b62c4d1 | 280 | x = 239-x; |
chrish | 0:785c2b62c4d1 | 281 | lcd_setColumn(lcd, x - length, x); |
chrish | 0:785c2b62c4d1 | 282 | }else { |
chrish | 0:785c2b62c4d1 | 283 | lcd_setColumn(lcd, x, x + length); |
chrish | 0:785c2b62c4d1 | 284 | } |
chrish | 0:785c2b62c4d1 | 285 | |
chrish | 0:785c2b62c4d1 | 286 | lcd_setPage(lcd, y, y); |
chrish | 0:785c2b62c4d1 | 287 | |
chrish | 0:785c2b62c4d1 | 288 | lcd_writeCommand(lcd, 0x2c); |
chrish | 0:785c2b62c4d1 | 289 | for(int i=0; i<length; i++) |
chrish | 0:785c2b62c4d1 | 290 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 291 | } |
chrish | 0:785c2b62c4d1 | 292 | |
chrish | 0:785c2b62c4d1 | 293 | void lcd_drawRectangle(lcd_t * lcd , int x0, int y0, int x1, int y1, int color) { |
chrish | 0:785c2b62c4d1 | 294 | if(x0>x1) { |
chrish | 0:785c2b62c4d1 | 295 | x0=x0^x1; |
chrish | 0:785c2b62c4d1 | 296 | x1=x0^x1; |
chrish | 0:785c2b62c4d1 | 297 | x0=x0^x1; |
chrish | 0:785c2b62c4d1 | 298 | } |
chrish | 0:785c2b62c4d1 | 299 | |
chrish | 0:785c2b62c4d1 | 300 | if(y0>y1) { |
chrish | 0:785c2b62c4d1 | 301 | y0=y0^y1; |
chrish | 0:785c2b62c4d1 | 302 | y1=y0^y1; |
chrish | 0:785c2b62c4d1 | 303 | y0=y0^y1; |
chrish | 0:785c2b62c4d1 | 304 | } |
chrish | 0:785c2b62c4d1 | 305 | |
chrish | 0:785c2b62c4d1 | 306 | lcd_drawVerticalLine(lcd, x0, y0, y1-y0, color); |
chrish | 0:785c2b62c4d1 | 307 | lcd_drawVerticalLine(lcd, x0, y1, y1-y0, color); |
chrish | 0:785c2b62c4d1 | 308 | lcd_drawHorizontalLine(lcd, x0, y0, x1-x0, color); |
chrish | 0:785c2b62c4d1 | 309 | lcd_drawHorizontalLine(lcd, x1, y0, x1-x0, color); |
chrish | 0:785c2b62c4d1 | 310 | } |
chrish | 0:785c2b62c4d1 | 311 | |
chrish | 0:785c2b62c4d1 | 312 | void lcd_fillRectangle(lcd_t * lcd, int x0, int y0, int length, int width, int color) { |
chrish | 0:785c2b62c4d1 | 313 | int XY=0; |
chrish | 0:785c2b62c4d1 | 314 | |
chrish | 0:785c2b62c4d1 | 315 | int x1 = x0+length; |
chrish | 0:785c2b62c4d1 | 316 | int y1 = y0+width; |
chrish | 0:785c2b62c4d1 | 317 | |
chrish | 0:785c2b62c4d1 | 318 | if(x0 > x1) |
chrish | 0:785c2b62c4d1 | 319 | { |
chrish | 0:785c2b62c4d1 | 320 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 321 | x1 = x0^x1; |
chrish | 0:785c2b62c4d1 | 322 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 323 | } |
chrish | 0:785c2b62c4d1 | 324 | |
chrish | 0:785c2b62c4d1 | 325 | if(y0 > y1) |
chrish | 0:785c2b62c4d1 | 326 | { |
chrish | 0:785c2b62c4d1 | 327 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 328 | y1 = y0^y1; |
chrish | 0:785c2b62c4d1 | 329 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 330 | } |
chrish | 0:785c2b62c4d1 | 331 | |
chrish | 0:785c2b62c4d1 | 332 | if(lcd->mode == LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 333 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 334 | x0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 335 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 336 | |
chrish | 0:785c2b62c4d1 | 337 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 338 | x1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 339 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 340 | |
chrish | 0:785c2b62c4d1 | 341 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 342 | x1 = x0^x1; |
chrish | 0:785c2b62c4d1 | 343 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 344 | x0 = 239-x0; |
chrish | 0:785c2b62c4d1 | 345 | x1 = 239-x1; |
chrish | 0:785c2b62c4d1 | 346 | } |
chrish | 0:785c2b62c4d1 | 347 | |
chrish | 0:785c2b62c4d1 | 348 | //XL = constrain(XL, MIN_X, MAX_X); |
chrish | 0:785c2b62c4d1 | 349 | //x1 = constrain(x1, MIN_X, MAX_X); |
chrish | 0:785c2b62c4d1 | 350 | //y0 = constrain(y0, MIN_Y, MAX_Y); |
chrish | 0:785c2b62c4d1 | 351 | //y1 = constrain(y1, MIN_Y, MAX_Y); |
chrish | 0:785c2b62c4d1 | 352 | |
chrish | 0:785c2b62c4d1 | 353 | XY = (x1-x0+1); |
chrish | 0:785c2b62c4d1 | 354 | XY = XY*(y1-y0+1); |
chrish | 0:785c2b62c4d1 | 355 | |
chrish | 0:785c2b62c4d1 | 356 | lcd_setColumn(lcd, x0, x1); |
chrish | 0:785c2b62c4d1 | 357 | lcd_setPage(lcd, y0, y1); |
chrish | 0:785c2b62c4d1 | 358 | lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */ |
chrish | 0:785c2b62c4d1 | 359 | |
chrish | 0:785c2b62c4d1 | 360 | for(int i = 0; i < XY; i++) |
chrish | 0:785c2b62c4d1 | 361 | { |
chrish | 0:785c2b62c4d1 | 362 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 363 | } |
chrish | 0:785c2b62c4d1 | 364 | } |
chrish | 0:785c2b62c4d1 | 365 | |
chrish | 0:785c2b62c4d1 | 366 | void lcd_fillSprite(lcd_t * lcd, int x0, int y0, int length, int width, short int *pColor) { |
chrish | 0:785c2b62c4d1 | 367 | int XY=0; |
chrish | 0:785c2b62c4d1 | 368 | |
chrish | 0:785c2b62c4d1 | 369 | int x1 = x0+length; |
chrish | 0:785c2b62c4d1 | 370 | int y1 = y0+width; |
chrish | 0:785c2b62c4d1 | 371 | short int color; |
chrish | 0:785c2b62c4d1 | 372 | if(x0 > x1) |
chrish | 0:785c2b62c4d1 | 373 | { |
chrish | 0:785c2b62c4d1 | 374 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 375 | x1 = x0^x1; |
chrish | 0:785c2b62c4d1 | 376 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 377 | } |
chrish | 0:785c2b62c4d1 | 378 | |
chrish | 0:785c2b62c4d1 | 379 | if(y0 > y1) |
chrish | 0:785c2b62c4d1 | 380 | { |
chrish | 0:785c2b62c4d1 | 381 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 382 | y1 = y0^y1; |
chrish | 0:785c2b62c4d1 | 383 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 384 | } |
chrish | 0:785c2b62c4d1 | 385 | |
chrish | 0:785c2b62c4d1 | 386 | if(lcd->mode == LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 387 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 388 | x0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 389 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 390 | |
chrish | 0:785c2b62c4d1 | 391 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 392 | x1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 393 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 394 | |
chrish | 0:785c2b62c4d1 | 395 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 396 | x1 = x0^x1; |
chrish | 0:785c2b62c4d1 | 397 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 398 | x0 = 239-x0; |
chrish | 0:785c2b62c4d1 | 399 | x1 = 239-x1; |
chrish | 0:785c2b62c4d1 | 400 | } |
chrish | 0:785c2b62c4d1 | 401 | |
chrish | 0:785c2b62c4d1 | 402 | //XL = constrain(XL, MIN_X, MAX_X); |
chrish | 0:785c2b62c4d1 | 403 | //x1 = constrain(x1, MIN_X, MAX_X); |
chrish | 0:785c2b62c4d1 | 404 | //y0 = constrain(y0, MIN_Y, MAX_Y); |
chrish | 0:785c2b62c4d1 | 405 | //y1 = constrain(y1, MIN_Y, MAX_Y); |
chrish | 0:785c2b62c4d1 | 406 | |
chrish | 0:785c2b62c4d1 | 407 | XY = (x1-x0+1); |
chrish | 0:785c2b62c4d1 | 408 | XY = XY*(y1-y0+1); |
chrish | 0:785c2b62c4d1 | 409 | |
chrish | 0:785c2b62c4d1 | 410 | lcd_setColumn(lcd, x0, x1); |
chrish | 0:785c2b62c4d1 | 411 | lcd_setPage(lcd, y0, y1); |
chrish | 0:785c2b62c4d1 | 412 | lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */ |
chrish | 0:785c2b62c4d1 | 413 | |
chrish | 0:785c2b62c4d1 | 414 | #if 1 /* speed up */ |
chrish | 0:785c2b62c4d1 | 415 | lcd_cd(lcd, 1); |
chrish | 0:785c2b62c4d1 | 416 | lcd_cs(lcd, 0); |
chrish | 0:785c2b62c4d1 | 417 | for(int i = 0; i < XY; i++) |
chrish | 0:785c2b62c4d1 | 418 | { |
chrish | 0:785c2b62c4d1 | 419 | color = *pColor++; |
chrish | 0:785c2b62c4d1 | 420 | spi_master_write(lcd->spi, (color >> 8)); |
chrish | 0:785c2b62c4d1 | 421 | spi_master_write(lcd->spi, (color & 0xff)); |
chrish | 0:785c2b62c4d1 | 422 | } |
chrish | 0:785c2b62c4d1 | 423 | lcd_cs(lcd, 1); |
chrish | 0:785c2b62c4d1 | 424 | #else |
chrish | 0:785c2b62c4d1 | 425 | for(int i = 0; i < XY; i++) |
chrish | 0:785c2b62c4d1 | 426 | { |
chrish | 0:785c2b62c4d1 | 427 | lcd_writeData16(lcd, *color++); |
chrish | 0:785c2b62c4d1 | 428 | } |
chrish | 0:785c2b62c4d1 | 429 | #endif |
chrish | 0:785c2b62c4d1 | 430 | } |
chrish | 0:785c2b62c4d1 | 431 | |
chrish | 0:785c2b62c4d1 | 432 | |
chrish | 0:785c2b62c4d1 | 433 | void lcd_drawTraingle(lcd_t * lcd, int x0, int y0, int x1, int y1, int x2, int y2, int color) |
chrish | 0:785c2b62c4d1 | 434 | { |
chrish | 0:785c2b62c4d1 | 435 | lcd_drawLine(lcd, x0, y0, x1, y1, color); |
chrish | 0:785c2b62c4d1 | 436 | lcd_drawLine(lcd, x0, y0, x2, y2, color); |
chrish | 0:785c2b62c4d1 | 437 | lcd_drawLine(lcd, x1, y1, x2, y2, color); |
chrish | 0:785c2b62c4d1 | 438 | } |
chrish | 0:785c2b62c4d1 | 439 | |
chrish | 0:785c2b62c4d1 | 440 | void lcd_fillTraingle(lcd_t * lcd, int x0, int y0, int x1, int y1, int x2, int y2, int color) |
chrish | 0:785c2b62c4d1 | 441 | { |
chrish | 0:785c2b62c4d1 | 442 | if(lcd->mode == LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 443 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 444 | x0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 445 | y0 = y0^x0; |
chrish | 0:785c2b62c4d1 | 446 | |
chrish | 0:785c2b62c4d1 | 447 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 448 | x1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 449 | y1 = y1^x1; |
chrish | 0:785c2b62c4d1 | 450 | |
chrish | 0:785c2b62c4d1 | 451 | y2 = y2^x2; |
chrish | 0:785c2b62c4d1 | 452 | x2 = y2^x2; |
chrish | 0:785c2b62c4d1 | 453 | y2 = y2^x2; |
chrish | 0:785c2b62c4d1 | 454 | |
chrish | 0:785c2b62c4d1 | 455 | x0 = 239-x0; |
chrish | 0:785c2b62c4d1 | 456 | x1 = 239-x1; |
chrish | 0:785c2b62c4d1 | 457 | x2 = 239-x2; |
chrish | 0:785c2b62c4d1 | 458 | } |
chrish | 0:785c2b62c4d1 | 459 | |
chrish | 0:785c2b62c4d1 | 460 | if(y0 > y1) { |
chrish | 0:785c2b62c4d1 | 461 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 462 | y1 = y0^y1; |
chrish | 0:785c2b62c4d1 | 463 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 464 | |
chrish | 0:785c2b62c4d1 | 465 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 466 | x1 = x0^x1; |
chrish | 0:785c2b62c4d1 | 467 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 468 | } |
chrish | 0:785c2b62c4d1 | 469 | |
chrish | 0:785c2b62c4d1 | 470 | if(y1 > y2) { |
chrish | 0:785c2b62c4d1 | 471 | y2 = y2^y1; |
chrish | 0:785c2b62c4d1 | 472 | y1 = y2^y1; |
chrish | 0:785c2b62c4d1 | 473 | y2 = y2^y1; |
chrish | 0:785c2b62c4d1 | 474 | |
chrish | 0:785c2b62c4d1 | 475 | x2 = x2^x1; |
chrish | 0:785c2b62c4d1 | 476 | x1 = x2^x1; |
chrish | 0:785c2b62c4d1 | 477 | x2 = x2^x1; |
chrish | 0:785c2b62c4d1 | 478 | } |
chrish | 0:785c2b62c4d1 | 479 | |
chrish | 0:785c2b62c4d1 | 480 | if(y0 > y1) { |
chrish | 0:785c2b62c4d1 | 481 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 482 | y1 = y0^y1; |
chrish | 0:785c2b62c4d1 | 483 | y0 = y0^y1; |
chrish | 0:785c2b62c4d1 | 484 | |
chrish | 0:785c2b62c4d1 | 485 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 486 | x1 = x0^x1; |
chrish | 0:785c2b62c4d1 | 487 | x0 = x0^x1; |
chrish | 0:785c2b62c4d1 | 488 | } |
chrish | 0:785c2b62c4d1 | 489 | |
chrish | 0:785c2b62c4d1 | 490 | if(x1 > x2) { |
chrish | 0:785c2b62c4d1 | 491 | x1 = x1^x2; |
chrish | 0:785c2b62c4d1 | 492 | x2 = x1^x2; |
chrish | 0:785c2b62c4d1 | 493 | x1 = x1^x2; |
chrish | 0:785c2b62c4d1 | 494 | |
chrish | 0:785c2b62c4d1 | 495 | y1 = y1^y2; |
chrish | 0:785c2b62c4d1 | 496 | y2 = y1^y2; |
chrish | 0:785c2b62c4d1 | 497 | y1 = y1^y2; |
chrish | 0:785c2b62c4d1 | 498 | } |
chrish | 0:785c2b62c4d1 | 499 | |
chrish | 0:785c2b62c4d1 | 500 | int xl = x0; |
chrish | 0:785c2b62c4d1 | 501 | int yl = y0; |
chrish | 0:785c2b62c4d1 | 502 | int xle = x1; |
chrish | 0:785c2b62c4d1 | 503 | int yle = y1; |
chrish | 0:785c2b62c4d1 | 504 | int dxl = abs(x1-x0), sxl = x0 < x1 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 505 | int dyl = -abs(y1-y0), syl = y0 < y1 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 506 | int errl = dxl + dyl, e2l; |
chrish | 0:785c2b62c4d1 | 507 | |
chrish | 0:785c2b62c4d1 | 508 | int xr = x0; |
chrish | 0:785c2b62c4d1 | 509 | int yr = y0; |
chrish | 0:785c2b62c4d1 | 510 | int xre = x2; |
chrish | 0:785c2b62c4d1 | 511 | int yre = y2; |
chrish | 0:785c2b62c4d1 | 512 | int dxr = abs(x2-x0), sxr = x0 < x2 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 513 | int dyr = -abs(y2-y0), syr = y0 < y2 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 514 | int errr = dxr + dyr, e2r; |
chrish | 0:785c2b62c4d1 | 515 | |
chrish | 0:785c2b62c4d1 | 516 | int xlp = xl; |
chrish | 0:785c2b62c4d1 | 517 | int xrp = xr; |
chrish | 0:785c2b62c4d1 | 518 | |
chrish | 0:785c2b62c4d1 | 519 | do { |
chrish | 0:785c2b62c4d1 | 520 | if(yl <= yr && (xl != xle || yl != yle)) { |
chrish | 0:785c2b62c4d1 | 521 | e2l = 2*errl; |
chrish | 0:785c2b62c4d1 | 522 | if (e2l >= dyl && xl != xle) { |
chrish | 0:785c2b62c4d1 | 523 | errl += dyl; xl += sxl; |
chrish | 0:785c2b62c4d1 | 524 | } |
chrish | 0:785c2b62c4d1 | 525 | |
chrish | 0:785c2b62c4d1 | 526 | if (e2l <= dxl && yl != yle) { |
chrish | 0:785c2b62c4d1 | 527 | errl += dxl; yl += syl; |
chrish | 0:785c2b62c4d1 | 528 | |
chrish | 0:785c2b62c4d1 | 529 | if(yl == yr) { |
chrish | 0:785c2b62c4d1 | 530 | //lcd_drawHorizontalLine(lcd, xlp, yl-1, xrp-xlp+1, color); |
chrish | 0:785c2b62c4d1 | 531 | |
chrish | 0:785c2b62c4d1 | 532 | lcd_setColumn(lcd, xlp, xrp); |
chrish | 0:785c2b62c4d1 | 533 | lcd_setPage(lcd, yl-1, yl-1); |
chrish | 0:785c2b62c4d1 | 534 | lcd_writeCommand(lcd, 0x2c); |
chrish | 0:785c2b62c4d1 | 535 | for(int i=0; i < xrp-xlp; i++) |
chrish | 0:785c2b62c4d1 | 536 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 537 | |
chrish | 0:785c2b62c4d1 | 538 | xlp = xl; |
chrish | 0:785c2b62c4d1 | 539 | xrp = xr; |
chrish | 0:785c2b62c4d1 | 540 | } |
chrish | 0:785c2b62c4d1 | 541 | }else { |
chrish | 0:785c2b62c4d1 | 542 | if(sxl < 0) { |
chrish | 0:785c2b62c4d1 | 543 | xlp = xl; |
chrish | 0:785c2b62c4d1 | 544 | } |
chrish | 0:785c2b62c4d1 | 545 | } |
chrish | 0:785c2b62c4d1 | 546 | }else if (yle < yre) { |
chrish | 0:785c2b62c4d1 | 547 | dxl = abs(xl-x2); |
chrish | 0:785c2b62c4d1 | 548 | sxl = xl < x2 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 549 | dyl = -abs(yl-y2); |
chrish | 0:785c2b62c4d1 | 550 | syl = 1; |
chrish | 0:785c2b62c4d1 | 551 | xle = x2; |
chrish | 0:785c2b62c4d1 | 552 | yle = y2; |
chrish | 0:785c2b62c4d1 | 553 | errl = dxl + dyl; |
chrish | 0:785c2b62c4d1 | 554 | } |
chrish | 0:785c2b62c4d1 | 555 | |
chrish | 0:785c2b62c4d1 | 556 | if(yr <= yl && (xr != xre || yr != yre)) { |
chrish | 0:785c2b62c4d1 | 557 | e2r = 2*errr; |
chrish | 0:785c2b62c4d1 | 558 | if (e2r >= dyr && xr != xre) { |
chrish | 0:785c2b62c4d1 | 559 | errr += dyr; xr += sxr; |
chrish | 0:785c2b62c4d1 | 560 | } |
chrish | 0:785c2b62c4d1 | 561 | |
chrish | 0:785c2b62c4d1 | 562 | if (e2r <= dxr && yr != yre) { |
chrish | 0:785c2b62c4d1 | 563 | errr += dxr; yr += syr; |
chrish | 0:785c2b62c4d1 | 564 | |
chrish | 0:785c2b62c4d1 | 565 | if(yl==yr) { |
chrish | 0:785c2b62c4d1 | 566 | //lcd_drawHorizontalLine(lcd, xlp, yl-1, xrp-xlp+1, color); |
chrish | 0:785c2b62c4d1 | 567 | |
chrish | 0:785c2b62c4d1 | 568 | lcd_setColumn(lcd, xlp, xrp); |
chrish | 0:785c2b62c4d1 | 569 | lcd_setPage(lcd, yl-1, yl-1); |
chrish | 0:785c2b62c4d1 | 570 | lcd_writeCommand(lcd, 0x2c); |
chrish | 0:785c2b62c4d1 | 571 | for(int i=0; i < xrp-xlp; i++) |
chrish | 0:785c2b62c4d1 | 572 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 573 | |
chrish | 0:785c2b62c4d1 | 574 | xlp = xl; |
chrish | 0:785c2b62c4d1 | 575 | xrp = xr; |
chrish | 0:785c2b62c4d1 | 576 | } |
chrish | 0:785c2b62c4d1 | 577 | }else { |
chrish | 0:785c2b62c4d1 | 578 | if(sxr > 0) { |
chrish | 0:785c2b62c4d1 | 579 | xrp = xr; |
chrish | 0:785c2b62c4d1 | 580 | } |
chrish | 0:785c2b62c4d1 | 581 | } |
chrish | 0:785c2b62c4d1 | 582 | |
chrish | 0:785c2b62c4d1 | 583 | }else if (yre < yle) { |
chrish | 0:785c2b62c4d1 | 584 | dxr = abs(xr-x1); |
chrish | 0:785c2b62c4d1 | 585 | dyr = -abs(yr-y1); |
chrish | 0:785c2b62c4d1 | 586 | sxr = xr < x1 ? 1 : -1; |
chrish | 0:785c2b62c4d1 | 587 | syr = 1; |
chrish | 0:785c2b62c4d1 | 588 | xre = x1; |
chrish | 0:785c2b62c4d1 | 589 | yre = y1; |
chrish | 0:785c2b62c4d1 | 590 | errr = dxr + dyr; |
chrish | 0:785c2b62c4d1 | 591 | } |
chrish | 0:785c2b62c4d1 | 592 | }while ((xl < xle || yl < yle || xr < xre || yr < yre)); |
chrish | 0:785c2b62c4d1 | 593 | |
chrish | 0:785c2b62c4d1 | 594 | lcd_setColumn(lcd, xlp, xrp); |
chrish | 0:785c2b62c4d1 | 595 | lcd_setPage(lcd, yl, yl); |
chrish | 0:785c2b62c4d1 | 596 | lcd_writeCommand(lcd, 0x2c); |
chrish | 0:785c2b62c4d1 | 597 | for(int i=0; i < xrp-xlp; i++) |
chrish | 0:785c2b62c4d1 | 598 | lcd_writeData16(lcd, color); |
chrish | 0:785c2b62c4d1 | 599 | } |
chrish | 0:785c2b62c4d1 | 600 | |
chrish | 0:785c2b62c4d1 | 601 | void lcd_drawCircle(lcd_t * lcd, int x, int y, int radius, int color) |
chrish | 0:785c2b62c4d1 | 602 | { |
chrish | 0:785c2b62c4d1 | 603 | if(lcd->mode==LANDSCAPE) { |
chrish | 0:785c2b62c4d1 | 604 | y=x^y; |
chrish | 0:785c2b62c4d1 | 605 | x=x^y; |
chrish | 0:785c2b62c4d1 | 606 | y=x^y; |
chrish | 0:785c2b62c4d1 | 607 | x=239-x; |
chrish | 0:785c2b62c4d1 | 608 | } |
chrish | 0:785c2b62c4d1 | 609 | |
chrish | 0:785c2b62c4d1 | 610 | int dx = -radius, dy = 0, err = 2-2*radius, e2; |
chrish | 0:785c2b62c4d1 | 611 | do { |
chrish | 0:785c2b62c4d1 | 612 | lcd_setPixel(lcd, x-dx, y+dy, color); |
chrish | 0:785c2b62c4d1 | 613 | lcd_setPixel(lcd, x+dx, y+dy, color); |
chrish | 0:785c2b62c4d1 | 614 | lcd_setPixel(lcd, x+dx, y-dy, color); |
chrish | 0:785c2b62c4d1 | 615 | lcd_setPixel(lcd, x-dx, y-dy, color); |
chrish | 0:785c2b62c4d1 | 616 | e2 = err; |
chrish | 0:785c2b62c4d1 | 617 | if (e2 <= dy) { |
chrish | 0:785c2b62c4d1 | 618 | err += ++dy*2+1; |
chrish | 0:785c2b62c4d1 | 619 | if (-dx == dy && e2 <= dx) e2 = 0; |
chrish | 0:785c2b62c4d1 | 620 | } |
chrish | 0:785c2b62c4d1 | 621 | if (e2 > dx) err += ++dx*2+1; |
chrish | 0:785c2b62c4d1 | 622 | } while (dx <= 0); |
chrish | 0:785c2b62c4d1 | 623 | } |
chrish | 0:785c2b62c4d1 | 624 | |
chrish | 0:785c2b62c4d1 | 625 | void lcd_drawChar(lcd_t * lcd, char c, int x, int y, uint16_t size, uint16_t color) |
chrish | 0:785c2b62c4d1 | 626 | { |
chrish | 0:785c2b62c4d1 | 627 | if(!(c >= 32) && (c <= 127)) { |
chrish | 0:785c2b62c4d1 | 628 | c = '?'-32; |
chrish | 0:785c2b62c4d1 | 629 | } |
chrish | 0:785c2b62c4d1 | 630 | |
chrish | 0:785c2b62c4d1 | 631 | for (int i =0; i < FONT_X; i++ ) { |
chrish | 0:785c2b62c4d1 | 632 | uint8_t temp = simpleFont[c-32][i]; |
chrish | 0:785c2b62c4d1 | 633 | for(uint8_t f = 0; f < 8; f++) { |
chrish | 0:785c2b62c4d1 | 634 | if((temp>>f)&0x01) { |
chrish | 0:785c2b62c4d1 | 635 | lcd_fillRectangle(lcd, x+i*size, y+f*size, size, size, color); |
chrish | 0:785c2b62c4d1 | 636 | } |
chrish | 0:785c2b62c4d1 | 637 | #if 1 /* Hintergrund ebenfalls setzen */ |
chrish | 0:785c2b62c4d1 | 638 | else{ |
chrish | 0:785c2b62c4d1 | 639 | lcd_fillRectangle(lcd, x+i*size, y+f*size, size, size, WHITE); |
chrish | 0:785c2b62c4d1 | 640 | } |
chrish | 0:785c2b62c4d1 | 641 | #endif |
chrish | 0:785c2b62c4d1 | 642 | } |
chrish | 0:785c2b62c4d1 | 643 | } |
chrish | 0:785c2b62c4d1 | 644 | } |
chrish | 0:785c2b62c4d1 | 645 | |
chrish | 0:785c2b62c4d1 | 646 | void lcd_drawString(lcd_t * lcd, char * ca, int x, int y, uint16_t size, uint16_t color) |
chrish | 0:785c2b62c4d1 | 647 | { |
chrish | 0:785c2b62c4d1 | 648 | while(*ca) { |
chrish | 0:785c2b62c4d1 | 649 | lcd_drawChar(lcd, *ca, x, y, size, color); |
chrish | 0:785c2b62c4d1 | 650 | *ca++; |
chrish | 0:785c2b62c4d1 | 651 | |
chrish | 0:785c2b62c4d1 | 652 | if(x < MAX_X) { |
chrish | 0:785c2b62c4d1 | 653 | x += FONT_SPACE*size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 654 | } |
chrish | 0:785c2b62c4d1 | 655 | } |
chrish | 0:785c2b62c4d1 | 656 | } |
chrish | 0:785c2b62c4d1 | 657 | |
chrish | 0:785c2b62c4d1 | 658 | uint8_t lcd_drawNumber(lcd_t * lcd, long long_num, int x, int y, uint16_t size, uint16_t color) |
chrish | 0:785c2b62c4d1 | 659 | { |
chrish | 0:785c2b62c4d1 | 660 | uint8_t char_buffer[10] = ""; |
chrish | 0:785c2b62c4d1 | 661 | uint8_t i = 0; |
chrish | 0:785c2b62c4d1 | 662 | uint8_t f = 0; |
chrish | 0:785c2b62c4d1 | 663 | |
chrish | 0:785c2b62c4d1 | 664 | if(long_num < 0) { |
chrish | 0:785c2b62c4d1 | 665 | f = 1; |
chrish | 0:785c2b62c4d1 | 666 | lcd_drawChar(lcd, '-', x, y, size, color); |
chrish | 0:785c2b62c4d1 | 667 | long_num = -long_num; |
chrish | 0:785c2b62c4d1 | 668 | |
chrish | 0:785c2b62c4d1 | 669 | if(x < MAX_X) { |
chrish | 0:785c2b62c4d1 | 670 | x += FONT_SPACE*size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 671 | } |
chrish | 0:785c2b62c4d1 | 672 | }else if(long_num == 0) { |
chrish | 0:785c2b62c4d1 | 673 | f = 1; |
chrish | 0:785c2b62c4d1 | 674 | lcd_drawChar(lcd, '0', x, y, size, color); |
chrish | 0:785c2b62c4d1 | 675 | return f; //<-- Bullshit --> |
chrish | 0:785c2b62c4d1 | 676 | |
chrish | 0:785c2b62c4d1 | 677 | //if(x < MAX_X) { |
chrish | 0:785c2b62c4d1 | 678 | // x += FONT_SPACE*size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 679 | //} |
chrish | 0:785c2b62c4d1 | 680 | } |
chrish | 0:785c2b62c4d1 | 681 | |
chrish | 0:785c2b62c4d1 | 682 | while (long_num > 0) { |
chrish | 0:785c2b62c4d1 | 683 | char_buffer[i++] = long_num % 10; |
chrish | 0:785c2b62c4d1 | 684 | long_num /= 10; |
chrish | 0:785c2b62c4d1 | 685 | } |
chrish | 0:785c2b62c4d1 | 686 | |
chrish | 0:785c2b62c4d1 | 687 | f = f+i; |
chrish | 0:785c2b62c4d1 | 688 | |
chrish | 0:785c2b62c4d1 | 689 | for(; i > 0; i--) { |
chrish | 0:785c2b62c4d1 | 690 | lcd_drawChar(lcd, '0' + char_buffer[i - 1], x, y, size, color); |
chrish | 0:785c2b62c4d1 | 691 | |
chrish | 0:785c2b62c4d1 | 692 | if(x < MAX_X) { |
chrish | 0:785c2b62c4d1 | 693 | x += FONT_SPACE*size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 694 | } |
chrish | 0:785c2b62c4d1 | 695 | } |
chrish | 0:785c2b62c4d1 | 696 | |
chrish | 0:785c2b62c4d1 | 697 | return f; |
chrish | 0:785c2b62c4d1 | 698 | } |
chrish | 0:785c2b62c4d1 | 699 | |
chrish | 0:785c2b62c4d1 | 700 | uint8_t lcd_drawFloat(lcd_t * lcd, float floatNumber, uint8_t decimal, int x, int y, uint16_t size, uint16_t color) |
chrish | 0:785c2b62c4d1 | 701 | { |
chrish | 0:785c2b62c4d1 | 702 | uint16_t temp = 0; |
chrish | 0:785c2b62c4d1 | 703 | float decy = 0.0; |
chrish | 0:785c2b62c4d1 | 704 | float rounding = 0.5; |
chrish | 0:785c2b62c4d1 | 705 | uint8_t f = 0; |
chrish | 0:785c2b62c4d1 | 706 | |
chrish | 0:785c2b62c4d1 | 707 | if(floatNumber < 0.0) |
chrish | 0:785c2b62c4d1 | 708 | { |
chrish | 0:785c2b62c4d1 | 709 | lcd_drawChar(lcd, '-', x, y, size, color); |
chrish | 0:785c2b62c4d1 | 710 | floatNumber = -floatNumber; |
chrish | 0:785c2b62c4d1 | 711 | if(x < MAX_X) |
chrish | 0:785c2b62c4d1 | 712 | { |
chrish | 0:785c2b62c4d1 | 713 | x += FONT_SPACE * size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 714 | } |
chrish | 0:785c2b62c4d1 | 715 | f = 1; |
chrish | 0:785c2b62c4d1 | 716 | } |
chrish | 0:785c2b62c4d1 | 717 | |
chrish | 0:785c2b62c4d1 | 718 | for(uint8_t i = 0; i < decimal; ++i) |
chrish | 0:785c2b62c4d1 | 719 | { |
chrish | 0:785c2b62c4d1 | 720 | rounding /= 10.0; |
chrish | 0:785c2b62c4d1 | 721 | } |
chrish | 0:785c2b62c4d1 | 722 | floatNumber += rounding; |
chrish | 0:785c2b62c4d1 | 723 | |
chrish | 0:785c2b62c4d1 | 724 | temp = (uint16_t)floatNumber; |
chrish | 0:785c2b62c4d1 | 725 | uint8_t howlong = lcd_drawNumber(lcd, temp, x, y, size, color); |
chrish | 0:785c2b62c4d1 | 726 | f += howlong; |
chrish | 0:785c2b62c4d1 | 727 | |
chrish | 0:785c2b62c4d1 | 728 | if((x+8*size*howlong) < MAX_X) |
chrish | 0:785c2b62c4d1 | 729 | { |
chrish | 0:785c2b62c4d1 | 730 | x += FONT_SPACE * size * howlong; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 731 | } |
chrish | 0:785c2b62c4d1 | 732 | |
chrish | 0:785c2b62c4d1 | 733 | if(decimal > 0) |
chrish | 0:785c2b62c4d1 | 734 | { |
chrish | 0:785c2b62c4d1 | 735 | lcd_drawChar(lcd, '.', x, y, size, color); |
chrish | 0:785c2b62c4d1 | 736 | if(x < MAX_X) |
chrish | 0:785c2b62c4d1 | 737 | { |
chrish | 0:785c2b62c4d1 | 738 | x += FONT_SPACE * size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 739 | } |
chrish | 0:785c2b62c4d1 | 740 | f += 1; |
chrish | 0:785c2b62c4d1 | 741 | } |
chrish | 0:785c2b62c4d1 | 742 | |
chrish | 0:785c2b62c4d1 | 743 | decy = floatNumber - temp; |
chrish | 0:785c2b62c4d1 | 744 | /* decimal part, 4 */ |
chrish | 0:785c2b62c4d1 | 745 | for(uint8_t i = 0; i < decimal; i++) |
chrish | 0:785c2b62c4d1 | 746 | { |
chrish | 0:785c2b62c4d1 | 747 | decy *= 10; /* for the next decimal */ |
chrish | 0:785c2b62c4d1 | 748 | temp = decy; /* get the decimal */ |
chrish | 0:785c2b62c4d1 | 749 | lcd_drawNumber(lcd, temp, x, y, size, color); |
chrish | 0:785c2b62c4d1 | 750 | floatNumber = -floatNumber; |
chrish | 0:785c2b62c4d1 | 751 | |
chrish | 0:785c2b62c4d1 | 752 | if(x < MAX_X) |
chrish | 0:785c2b62c4d1 | 753 | { |
chrish | 0:785c2b62c4d1 | 754 | x += FONT_SPACE * size; /* Move cursor right */ |
chrish | 0:785c2b62c4d1 | 755 | } |
chrish | 0:785c2b62c4d1 | 756 | |
chrish | 0:785c2b62c4d1 | 757 | decy -= temp; |
chrish | 0:785c2b62c4d1 | 758 | } |
chrish | 0:785c2b62c4d1 | 759 | |
chrish | 0:785c2b62c4d1 | 760 | f += decimal; |
chrish | 0:785c2b62c4d1 | 761 | return f; |
chrish | 0:785c2b62c4d1 | 762 | } |