341 lines
9.4 KiB
C
341 lines
9.4 KiB
C
/**
|
||
* @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 <string.h>
|
||
|
||
#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);
|
||
// }
|