This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/lib/lcd/lcds.c

341 lines
9.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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);
// }