/** * @file * @author xxx * @date 2023-08-29 14:28:04 * @brief LCD驱动 * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. */ #include "lcds.h" #include "lcd_st7525.h" #include "lcd_sharp.h" #include #define BACK_COLOR WHITE // static uint8_t dotbuf[64]; // 字符点阵缓冲 void lcd_free(lcd_t *handle) { DBG_ASSERT(handle != NULL __DBG_LINE); osel_mem_free(handle); } // LCD初始化 lcd_t *lcd_create(lcd_info_t info) { lcd_t *handle = (lcd_t *)osel_mem_alloc(sizeof(lcd_t)); DBG_ASSERT(handle != NULL __DBG_LINE); osel_memcpy((uint8_t *)&handle->info, (uint8_t *)&info, sizeof(lcd_info_t)); switch (info.type) { case LCD_ST7525: // lcd_st7525_init(&handle->driver); break; case LCD_SHARP: lcd_sharp_init(&handle->driver); break; default: lcd_free(handle); return NULL; } return handle; } void lcd_set_font_size(font_type_e font) { GUI_SetBkColor(GUI_WHITE); GUI_SetColor(GUI_BLACK); switch (font) { case FONT_SMALL: GUI_SetFont(&GUI_FontHZ16x16); break; case FONT_MEDIUM: GUI_SetFont(&GUI_FontHZ24x24); break; case FONT_LARGE: GUI_SetFont(&GUI_FontHZ24x24); break; default: break; } } // // 显示字符串 // int32_t lcd_put_string(lcd_t *lcd, font_type_e font, int32_t page, int32_t col, char *s, BOOL reverse) // { // uint16_t slen; // uint16_t index = 0, offset = 0; // if (lcd == NULL) // return -1; // slen = strlen(s); // osel_memset(dotbuf, 0, ARRAY_LEN(dotbuf)); // while (1) // { // if ((uint8_t) * (s + index) < 0x81) // assic // { // uint8_t ch; // ch = *(s + index); // if (TRUE == font_get_asc(font, &ch, dotbuf)) // { // if (reverse) // { // for (uint8_t i = 0; i < font_list[font]->size; i++) // { // dotbuf[i] = ~dotbuf[i]; // } // } // lcd->driver.fill(lcd, page, col + offset, font_list[font]->width, font_list[font]->height, dotbuf); // } // index += font_list[font]->offset; // offset += font_list[font]->width; // } // else // 汉字 // { // font_hz_item_t hz; // char *ch; // ch = s + index; // if (TRUE == font_get_hz(font, ch, &hz)) // { // if (reverse) // { // for (uint8_t i = 0; i < font_hz_list[font]->size; i++) // { // dotbuf[i] = ~hz.msk[i]; // } // } // else // { // osel_memcpy(dotbuf, hz.msk, font_hz_list[font]->size); // } // lcd->driver.fill(lcd, page, col + offset, font_hz_list[font]->width, font_hz_list[font]->height, dotbuf); // } // index += font_hz_list[font]->offset; // offset += font_hz_list[font]->width; // } // if (index >= slen) // { // break; // } // } // return 0; // } // 对齐显示字符串,其余部分填充背景色 int32_t lcd_put_alignment_string(lcd_t *lcd, font_type_e font, int32_t row, char *s, uint8_t alignment, BOOL reverse, uint16_t color) { lcd_set_font_size(font); uint16_t len = GUI_GetStringDistX(s); switch (alignment) { case GUI_TA_LEFT: case GUI_TA_NORMOL: if (reverse == FALSE) { GUI_SetTextMode(GUI_TEXTMODE_REV); // 反转文本 GUI_DispStringAt(s, 0, GUI_GetFontSizeY() * row); GUI_SetTextAlign(GUI_TA_LEFT); GUI_SetColor(GUI_WHITE); // 设置文本颜色 GUI_SetTextMode(GUI_TEXTMODE_TRANS); // 恢复文本 GUI_SetColor(GUI_BLACK); // 设置文本颜色 } else { GUI_DispStringAt(s, 0, GUI_GetFontSizeY() * row); GUI_SetTextAlign(GUI_TA_LEFT); } break; case GUI_TA_HCENTER: if (reverse == TRUE) { GUI_SetTextMode(GUI_TEXTMODE_REV); // 反转文本 GUI_DispStringAt(s, (lcd->info.width - len) / 2, GUI_GetFontSizeY() * row); GUI_SetColor(GUI_WHITE); // 设置文本颜色 GUI_SetTextMode(GUI_TEXTMODE_TRANS); // 恢复文本 GUI_SetColor(GUI_BLACK); // 设置文本颜色 } else { GUI_DispStringAt(s, (lcd->info.width - len) / 2, GUI_GetFontSizeY() * row); } break; case GUI_TA_RIGHT: if (reverse == TRUE) { GUI_SetTextMode(GUI_TEXTMODE_REV); // 反转文本 GUI_DispStringAt(s, 0, GUI_GetFontSizeY() * row); GUI_SetTextAlign(GUI_TA_RIGHT); GUI_SetColor(GUI_WHITE); // 设置文本颜色 GUI_SetTextMode(GUI_TEXTMODE_TRANS); // 恢复文本 GUI_SetColor(GUI_BLACK); // 设置文本颜色 } else { GUI_DispStringAt(s, 0, GUI_GetFontSizeY() * row); GUI_SetTextAlign(GUI_TA_RIGHT); } break; default: break; } return 0; } // // 获取字符串在X轴上占用多少个点阵 // uint16_t lcd_strings_width(lcd_t *lcd, font_type_e font, char *s) // { // uint16_t index = 0, offset = 0; // uint16_t slen = strlen(s); // // 计算占用的点数 // while (1) // { // if ((uint8_t) * (s + index) < 0x81) // assic // { // index += font_list[font]->offset; // offset += font_list[font]->width; // } // else // 汉字 // { // index += font_hz_list[font]->offset; // offset += font_hz_list[font]->width; // } // if (index >= slen) // { // break; // } // } // return offset; // } // // 颜色填充,使用WHITE可以清空数据 // int32_t lcd_color_fill(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey, uint16_t color) // { // if (lcd == NULL) // return -1; // return lcd->driver.color_fill(lcd, sx, ex, sy, ey, color); // } // // 颜色填充 ,列 // int32_t lcd_color_fill_col(lcd_t *lcd, font_type_e font, uint8_t page, uint8_t sx, uint16_t color) // { // uint8_t y1, y2; // uint8_t h = lcd->info.height / 8; // y1 = page * h; // y2 = y1 + h * 2 - 2; // -2这个数据只是为了显示效果 // return lcd_color_fill(lcd, sx, lcd->info.width, y1, y2, color); // } // // 颜色填充 ,行 // int32_t lcd_color_fill_page(lcd_t *lcd, font_type_e font, uint8_t page, uint16_t color) // { // return lcd_color_fill_col(lcd, font, page, 0, color); // } // // 画线 // void line(lcd_t *lcd, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color) // { // int32_t tmp; // int32_t dx = x2 - x1; // int32_t dy = y2 - y1; // if (lcd == NULL) // return; // if (ABS(dx) < ABS(dy)) // { // if (y1 > y2) // { // tmp = x1; // x1 = x2; // x2 = tmp; // tmp = y1; // y1 = y2; // y2 = tmp; // dx = -dx; // dy = -dy; // } // x1 <<= 16; // /* dy is apriori >0 */ // dx = (dx << 16) / dy; // while (y1 <= y2) // { // lcd->driver.set_point(lcd, x1 >> 16, y1, color); // x1 += dx; // y1++; // } // } // else // { // if (x1 > x2) // { // tmp = x1; // x1 = x2; // x2 = tmp; // tmp = y1; // y1 = y2; // y2 = tmp; // dx = -dx; // dy = -dy; // } // y1 <<= 16; // dy = dx ? (dy << 16) / dx : 0; // while (x1 <= x2) // { // lcd->driver.set_point(lcd, x1, y1 >> 16, color); // y1 += dy; // x1++; // } // } // } // // 画矩形 // void rect(lcd_t *lcd, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color) // { // if (lcd == NULL) // return; // line(lcd, x1, y1, x2, y1, color); // line(lcd, x2, y1, x2, y2, color); // line(lcd, x2, y2, x1, y2, color); // line(lcd, x1, y2, x1, y1, color); // } // // 画十字 // void cross(lcd_t *lcd, int32_t x, int32_t y, uint16_t color) // { // if (lcd == NULL) // return; // line(lcd, x - 10, y, x - 2, y, color); // line(lcd, x + 2, y, x + 10, y, color); // line(lcd, x, y - 10, x, y - 2, color); // line(lcd, x, y + 2, x, y + 10, color); // line(lcd, x - 6, y - 9, x - 9, y - 9, color + 1); // line(lcd, x - 9, y - 8, x - 9, y - 6, color + 1); // line(lcd, x - 9, y + 6, x - 9, y + 9, color + 1); // line(lcd, x - 8, y + 9, x - 6, y + 9, color + 1); // line(lcd, x + 6, y + 9, x + 9, y + 9, color + 1); // line(lcd, x + 9, y + 8, x + 9, y + 6, color + 1); // line(lcd, x + 9, y - 6, x + 9, y - 9, color + 1); // line(lcd, x + 8, y - 9, x + 6, y - 9, color + 1); // } // // 画点 // void point(lcd_t *lcd, int32_t x, int32_t y, uint16_t color) // { // if (lcd == NULL) // return; // lcd->driver.set_point(lcd, x, y, color); // }