uint32_t lcd_drawchar(uint32_t x, uint32_t y, char c, uint32_t size, uint32_t fgcolor, uint32_t bgcolor, uint32_t clear_bg) { uint32_t ret, i, x0, y0, x1, y1, h, data, mask; uint8_t *ptr; //size = (size==0)?1:size; x1 = x+(FONT_WIDTH*size); y1 = y+(FONT_HEIGHT*size); if((x1-1) >= width) { return width+1; } else if((y1-1) >= height) { return width+1; } else if(c < FONT_START) { return x; } size--; ret = x1; lcd_enable(); ptr = (uint8_t*)&fontdata[(c-FONT_START)*(8*FONT_HEIGHT/8)]; if(size == 0) { y0 = y; for(h=FONT_HEIGHT; h!=0; h--) { data = *ptr++; x0 = x; for(mask=(1<<(FONT_WIDTH-1)); mask!=0; mask>>=1) { if(data & mask) { lcd_setarea(x0, y0, x0, y0); lcd_drawstart(); lcd_draw(fgcolor); lcd_drawstop(); } else if(clear_bg) { lcd_setarea(x0, y0, x0, y0); lcd_drawstart(); lcd_draw(bgcolor); lcd_drawstop(); } x0++; } y0++; } }
/** * @brief Main program * @param None * @retval None */ int main(void) { lcdInit(); /* // code from mikorcontroller.net graphics example with jpg pic: uint16_t x; uint8_t y; uint8_t r,g,b; lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1)); lcd_drawstart(); for(y = 0; y < LCD_HEIGHT; y++) { for(x = 0; x < LCD_WIDTH; x++) { r = x + y; g = x - y; b = y - x; lcd_draw(RGB(r,g,b)); } } lcd_drawstop(); */ // mk lcd_area(1, 1, 20, 20); lcd_drawstart(); lcd_draw(COLOR_BLACK); lcd_drawstop(); }
inline void lcd_setpixel(const uint16_t x0, const uint16_t y0, const colour_t colour) { lcd_setarea(x0, y0, x0, y0); lcd_drawstart(); lcd_draw(colour); lcd_drawstop(); }
void lcd_clear(unsigned int color) { unsigned int i; lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1)); lcd_drawstart(); for(i=(LCD_WIDTH*LCD_HEIGHT/8); i!=0; i--) { lcd_draw(color); //1 lcd_draw(color); //2 lcd_draw(color); //3 lcd_draw(color); //4 lcd_draw(color); //5 lcd_draw(color); //6 lcd_draw(color); //7 lcd_draw(color); //8 } lcd_drawstop(); return; }
int main(int argc, char const *argv[]) { if (argc > 1) { char input[MAX_INPUT_LENGTH]; int segments = 2; if (strcmp(argv[1], "-s") == 0) { if (argc == 4) { segments = atoi(argv[2]); strcpy(input, argv[3]); } } else { strcpy(input, argv[1]); } LCD *lcd = malloc(sizeof(LCD)); lcd_init(lcd, input, segments); lcd_draw(lcd); free(lcd); } else { printf("Usage: %s [-s SEGMENTS] NUMBER\n", argv[0]); } return 0; }
void lcd_reset(void) { uint32_t c, i, j; uint8_t initdata[] = { //0x40| 1, LCD_CMD_RESET, //0xC0|60, //0xC0|60, 0x40| 1, LCD_CMD_DISPLAY_OFF, 0xC0|20, 0x40| 1, LCD_CMD_POWER_CTRLB, 0x80| 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA 0x40| 1, LCD_CMD_POWERON_SEQ_CTRL, 0x80| 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67 0x40| 1, LCD_CMD_DRV_TIMING_CTRLA, 0x80| 3, 0x85, 0x01, 0x79, //0x79 0x78 0x40| 1, LCD_CMD_POWER_CTRLA, 0x80| 5, 0x39, 0X2C, 0x00, 0x34, 0x02, 0x40| 1, LCD_CMD_PUMP_RATIO_CTRL, 0x80| 1, 0x20, 0x40| 1, LCD_CMD_DRV_TIMING_CTRLB, 0x80| 2, 0x00, 0x00, 0x40| 1, LCD_CMD_POWER_CTRL1, 0x80| 1, 0x26, //0x26 0x25 0x40| 1, LCD_CMD_POWER_CTRL2, 0x80| 1, 0x11, 0x40| 1, LCD_CMD_VCOM_CTRL1, 0x80| 2, 0x35, 0x3E, 0x40| 1, LCD_CMD_VCOM_CTRL2, 0x80| 1, 0xBE, //0xBE 0x94 0x40| 1, LCD_CMD_FRAME_CTRL, 0x80| 2, 0x00, 0x1B, //0x1B 0x70 0x40| 1, LCD_CMD_ENABLE_3G, 0x80| 1, 0x08, //0x08 0x00 0x40| 1, LCD_CMD_GAMMA, 0x80| 1, 0x01, //G2.2 0x40| 1, LCD_CMD_POS_GAMMA, 0x80|15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, //0x80|15, 0x0F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, 0x40| 1, LCD_CMD_NEG_GAMMA, 0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F, //0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x0F, 0x40| 1, LCD_CMD_DISPLAY_CTRL, 0x80| 4, 0x0A, 0x82, 0x27, 0x00, 0x40| 1, LCD_CMD_ENTRY_MODE, 0x80| 1, 0x07, 0x40| 1, LCD_CMD_PIXEL_FORMAT, 0x80| 1, 0x55, //16bit 0x40| 1, LCD_CMD_MEMACCESS_CTRL, 0x80| 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y), 0x40| 1, LCD_CMD_COLUMN, 0x80| 2, 0x00, 0x00, 0x80| 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF, 0x40| 1, LCD_CMD_PAGE, 0x80| 2, 0x00, 0x00, 0x80| 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF, 0x40| 1, LCD_CMD_SLEEPOUT, 0xC0|60, 0xC0|60, 0x40| 1, LCD_CMD_DISPLAY_ON, 0xC0|20, }; //init pins INIT_PINS(); //hardware reset GPIO_CLRPIN(LCD_PORT, RST_PIN); delay_ms(20); GPIO_SETPIN(LCD_PORT, RST_PIN); delay_ms(120); lcd_enable(); //send init commands and data for(i=0; i<sizeof(initdata);) { c = initdata[i++]; switch(c&0xC0) { case 0x40: //command for(j=c&0x3F; j!=0; j--) { c = initdata[i++]; lcd_wrcmd8(c); } break; case 0x80: //data for(j=c&0x3F; j!=0; j--) { c = initdata[i++]; lcd_wrdata8(c); } break; case 0xC0: //delay delay_ms(c&0x3F); break; } } //clear display buffer lcd_drawstart(); for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--) { lcd_draw(0); } lcd_drawstop(); lcd_disable(); return; }
void cmd_lcd_drawimage(uint_least16_t fgcolor, uint_least16_t bgcolor) { uint_least8_t b, c, e, n; uint_least16_t a, x0, y0, x1, y1, w, h; uint_least32_t i, ms; x0 = if_read(); //x0 y0 = if_read(); //y0 w = if_read(); //w h = if_read(); //h x1 = x0+w-1; y1 = y0+h-1; c = if_read8(); //color mode + encoding e = c & COLOR_RLE; c = c & ~COLOR_RLE; lcd_enable(); lcd_setarea(x0, y0, x1, y1); lcd_drawstart(); switch(c) { case COLOR_BW: //black/white fgcolor = RGB(0,0,0); bgcolor = RGB(255,255,255); break; case COLOR_WB: //white/black fgcolor = RGB(255,255,255); bgcolor = RGB(0,0,0); break; case COLOR_FG: //fg/bg fgcolor = fgcolor; bgcolor = bgcolor; break; case COLOR_BG: //bg/fg fgcolor ^= bgcolor; bgcolor ^= fgcolor; fgcolor ^= bgcolor; break; } ms = get_ms(); if(e == 0) //no encoding { switch(c) { case COLOR_BW: //black/white case COLOR_WB: //white/black case COLOR_FG: //fg/bg case COLOR_BG: //bg/fg for(i=w*h; i!=0;) { if(if_available()) { a = if_read8(); for(b=0x80; (b!=0) && (i!=0); b>>=1) { if(a & b) { lcd_draw(fgcolor); } else { lcd_draw(bgcolor); } i--; } } else if((get_ms()-ms) > 2000) //2s { break; } } break; case COLOR_RGB323: case COLOR_RGB332: case COLOR_RGB233: case COLOR_GRAY: for(i=w*h; i!=0;) { if(if_available()) { a = if_read8(); if(c == COLOR_RGB323){ a = RGB323toRGB565(a); } else if(c == COLOR_RGB332){ a = RGB332toRGB565(a); } else if(c == COLOR_RGB233){ a = RGB233toRGB565(a); } else { a = GRAYtoRGB565(a); } lcd_draw(a); i--; } else if((get_ms()-ms) > 2000) //2s { break; } } break; default: case COLOR_RGB565: for(i=w*h; i!=0;) { if(if_available()) { a = if_read16(); lcd_draw(a); i--; } else if((get_ms()-ms) > 2000) //2s { break; } } break; case COLOR_RGB888: for(i=w*h; i!=0;) { if(if_available()) { a = (if_read8()&0xF8)<<8; //R (5 bits) a |= (if_read8()&0xFC)<<3; //G (6 bits) a |= (if_read8()&0xF8)>>3; //B (5 bits) lcd_draw(a); i--; } else if((get_ms()-ms) > 2000) //2s { break; } } break; }
void lcd_init() { const uint8_t MEM_BGR = 3; const uint8_t MEM_X = 6; const uint8_t MEM_Y = 7; uint8_t init_sequence[] = { VCMD_COMMAND | 1, LCD_CMD_RESET, VCMD_SLEEP |20, VCMD_COMMAND | 1, LCD_CMD_DISPLAY_OFF, VCMD_SLEEP |20, VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLB, VCMD_DATA | 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA VCMD_COMMAND | 1, LCD_CMD_POWERON_SEQ_CTRL, VCMD_DATA | 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67 VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLA, VCMD_DATA | 3, 0x85, 0x01, 0x79, //0x79 0x78 VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLA, VCMD_DATA | 5, 0x39, 0X2C, 0x00, 0x34, 0x02, VCMD_COMMAND | 1, LCD_CMD_PUMP_RATIO_CTRL, VCMD_DATA | 1, 0x20, VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLB, VCMD_DATA | 2, 0x00, 0x00, VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL1, VCMD_DATA | 1, 0x26, //0x26 0x25 VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL2, VCMD_DATA | 1, 0x11, VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL1, VCMD_DATA | 2, 0x35, 0x3E, VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL2, VCMD_DATA | 1, 0xBE, //0xBE 0x94 VCMD_COMMAND | 1, LCD_CMD_FRAME_CTRL, VCMD_DATA | 2, 0x00, 0x1B, //0x1B 0x70 VCMD_COMMAND | 1, LCD_CMD_ENABLE_3G, VCMD_DATA | 1, 0x08, //0x08 0x00 VCMD_COMMAND | 1, LCD_CMD_GAMMA, VCMD_DATA | 1, 0x01, //G2.2 VCMD_COMMAND | 1, LCD_CMD_POS_GAMMA, VCMD_DATA |15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, VCMD_COMMAND | 1, LCD_CMD_NEG_GAMMA, VCMD_DATA |15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F, VCMD_COMMAND | 1, LCD_CMD_DISPLAY_CTRL, VCMD_DATA | 4, 0x0A, 0x82, 0x27, 0x00, VCMD_COMMAND | 1, LCD_CMD_ENTRY_MODE, VCMD_DATA | 1, 0x07, VCMD_COMMAND | 1, LCD_CMD_PIXEL_FORMAT, VCMD_DATA | 1, 0x55, //16bit VCMD_COMMAND | 1, LCD_CMD_MEMACCESS_CTRL, VCMD_DATA | 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y), VCMD_COMMAND | 1, LCD_CMD_COLUMN, VCMD_DATA | 2, 0x00, 0x00, VCMD_DATA | 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF, VCMD_COMMAND | 1, LCD_CMD_PAGE, VCMD_DATA | 2, 0x00, 0x00, VCMD_DATA | 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF, VCMD_COMMAND | 1, LCD_CMD_SLEEPOUT, VCMD_SLEEP |60, VCMD_SLEEP |60, VCMD_COMMAND | 1, LCD_CMD_DISPLAY_ON, VCMD_SLEEP |20, }; DISABLE_IRQ(); // initialize pins IOCON_PIO2_0 &= ~IOCON_PIO2_0_FUNC_MASK; IOCON_PIO2_1 &= ~IOCON_PIO2_1_FUNC_MASK; IOCON_PIO2_2 &= ~IOCON_PIO2_2_FUNC_MASK; IOCON_PIO2_3 &= ~IOCON_PIO2_3_FUNC_MASK; IOCON_PIO2_4 &= ~IOCON_PIO2_4_FUNC_MASK; IOCON_PIO2_5 &= ~IOCON_PIO2_5_FUNC_MASK; IOCON_PIO2_6 &= ~IOCON_PIO2_6_FUNC_MASK; IOCON_PIO2_7 &= ~IOCON_PIO2_7_FUNC_MASK; IOCON_PIO2_8 &= ~IOCON_PIO2_8_FUNC_MASK; IOCON_PIO2_9 &= ~IOCON_PIO2_9_FUNC_MASK; IOCON_PIO2_10 &= ~IOCON_PIO2_10_FUNC_MASK; IOCON_PIO2_11 &= ~IOCON_PIO2_11_FUNC_MASK; IOCON_PIO3_5 &= ~IOCON_PIO3_5_FUNC_MASK; // set all 12 pins to output mode GPIO_GPIO2DIR |= 0xFFF; // set all pins high LCD_GPIO |= 0xFFF; // set pin 5 of gpio 3 to output mode GPIO_GPIO3DIR |= LCD_RD_MASK; GPIO_GPIO3DATA |= LCD_RD_MASK; ENABLE_IRQ(); // trigger hard-reset LCD_MASKED_GPIO(LCD_RST_MASK, 0); delay_ms(20); LCD_MASKED_GPIO(LCD_RST_MASK, LCD_RST_MASK); delay_ms(120); lcd_enable(); delay_ms(1); for (unsigned int i = 0; i < sizeof(init_sequence);) { uint8_t instruction = init_sequence[i++]; switch (instruction & 0xC0) { case VCMD_COMMAND: { //~ printf("cmd 0x%02x", instruction & 0x3f); for (int j = (instruction & 0x3f); j > 0; j--) { uint8_t data = init_sequence[i++]; //~ printf(" 0x%02x", data); lcd_wrcmd8(data); } //~ printf("\n"); break; } case VCMD_DATA: { //~ printf("data 0x%02x\n", instruction & 0x3f); for (int j = (instruction & 0x3f); j > 0; j--) { uint8_t data = init_sequence[i++]; //~ printf(" 0x%02x", data); lcd_wrdata8(data); } //~ printf("\n"); break; } case VCMD_SLEEP: { //~ printf("sleep %d\n", instruction & 0x3f); delay_ms(instruction & 0x3f); break; } default: // cannot happen :) continue; }; } lcd_drawstart(); for (int i = (LCD_WIDTH*LCD_HEIGHT/8); i > 0; i--) { lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); lcd_draw(0); } lcd_drawstop(); lcd_disable(); }