stm32 SPFD5420A TFT液晶屏调试字体旋转
使用安富莱开发板自带液晶屏让字体像手机屏幕字体旋转似的让字体随着屏幕的转动而转动
在安富莱开发板液晶屏驱动代码里修改算法得到的
下面代码是修改后的算法:
/*
*********************************************************************************************************
* 函 数 名: LCD_DispStr
* 功能说明: 在LCD指定坐标(左上角)显示一个字符串
* 形 参:
* _usX : X坐标,对于3.0寸宽屏,范围为【0 - 399】
* _usY : Y坐标,对于3.0寸宽屏,范围为 【0 - 239】
* _ptr : 字符串指针
* _tFont : 字体结构体,包含颜色、背景色(支持透明)、字体代码、文字间距等参数
* 返 回 值: 无
*********************************************************************************************************
*/
void LCD_DispStr(uint16_t _usX, uint16_t _usY, char *_ptr, FONT_T *_tFont,uint8_t direction_flag)
{
uint8_t num = 1;
uint32_t i;
uint8_t code1;
uint8_t code2;
uint32_t address;
uint8_t buf[24 * 24 / 8]; /* 最大支持24点阵汉字 */
uint8_t m, width, height;
uint16_t x, y;
*********************************************************************************************************
* 函 数 名: LCD_DispStr
* 功能说明: 在LCD指定坐标(左上角)显示一个字符串
* 形 参:
* _usX : X坐标,对于3.0寸宽屏,范围为【0 - 399】
* _usY : Y坐标,对于3.0寸宽屏,范围为 【0 - 239】
* _ptr : 字符串指针
* _tFont : 字体结构体,包含颜色、背景色(支持透明)、字体代码、文字间距等参数
* 返 回 值: 无
*********************************************************************************************************
*/
void LCD_DispStr(uint16_t _usX, uint16_t _usY, char *_ptr, FONT_T *_tFont,uint8_t direction_flag)
{
uint8_t num = 1;
uint32_t i;
uint8_t code1;
uint8_t code2;
uint32_t address;
uint8_t buf[24 * 24 / 8]; /* 最大支持24点阵汉字 */
uint8_t m, width, height;
uint16_t x, y;
/* 暂时只支持16点阵宋体汉字 */
if (_tFont->usFontCode == FC_ST_16X16)
{
height = 16;
while (*_ptr != 0)
{
code1 = *_ptr; /* ascii代码 或者汉字代码的高字节 */
if (code1 < 0x80)
{
/* 将ascii字符点阵复制到buf */
memcpy(buf, &g_Ascii16[code1 * 16], 16);
width = 8;
}
else
{
code2 = *++_ptr;
if (code2 == 0)
{
break;
}
if (_tFont->usFontCode == FC_ST_16X16)
{
height = 16;
while (*_ptr != 0)
{
code1 = *_ptr; /* ascii代码 或者汉字代码的高字节 */
if (code1 < 0x80)
{
/* 将ascii字符点阵复制到buf */
memcpy(buf, &g_Ascii16[code1 * 16], 16);
width = 8;
}
else
{
code2 = *++_ptr;
if (code2 == 0)
{
break;
}
/* 计算16点阵汉字点阵地址
ADDRESS = [(code1-0xa1) * 94 + (code2-0xa1)] * 32
;
*/
#ifdef USE_SMALL_FONT
m = 0;
while(1)
{
address = m* 34;
m++;
if(num == 0)
{
if ((code1 == g_Hz16_lie[address + 0]) && (code2 == g_Hz16_lie[address + 1]))
{
address += 2;
memcpy(buf, &g_Hz16_lie[address], 32);
break;
}
else if ((g_Hz16_lie[address + 0] == 0xFF) && (g_Hz16_lie[address + 1] == 0xFF))
{
/* 字库搜索完毕,未找到,则填充全FF */
memset(buf, 0xFF, 32);
break;
}
}
else
{
if ((code1 == g_Hz16[address + 0]) && (code2 == g_Hz16[address + 1]))
{
address += 2;
memcpy(buf, &g_Hz16[address], 32);
break;
}
else if ((g_Hz16[address + 0] == 0xFF) && (g_Hz16[address + 1] == 0xFF))
{
/* 字库搜索完毕,未找到,则填充全FF */
memset(buf, 0xFF, 32);
break;
}
}
}
width = 16;
#else
address = ((code1-0xa1) * 94 + (code2-0xa1)) * 32 + HZK16_ADDR;
memcpy(buf, (const uint8_t *)address, 32);
#endif
width = 16;
}
if(direction_flag == 0) //字的显示是从左往右显示
{
y = _usY; //将y轴坐标给y
/* 开始刷LCD */
for (m = 0; m < height; m++) // 字符高度
{
x = _usX;
for (i = 0; i < width; i++) // 字符宽度
{
if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
{
LCD_PutPixel(x, y, _tFont->usTextColor); // 设置像素颜色为文字色 ,也就是往屏幕上打点
}
else if (_tFont->usBackColor != CL_MASK) /* 如果是颜色掩码值,则做透明处理 */
{
LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
}
ADDRESS = [(code1-0xa1) * 94 + (code2-0xa1)] * 32
;
*/
#ifdef USE_SMALL_FONT
m = 0;
while(1)
{
address = m* 34;
m++;
if(num == 0)
{
if ((code1 == g_Hz16_lie[address + 0]) && (code2 == g_Hz16_lie[address + 1]))
{
address += 2;
memcpy(buf, &g_Hz16_lie[address], 32);
break;
}
else if ((g_Hz16_lie[address + 0] == 0xFF) && (g_Hz16_lie[address + 1] == 0xFF))
{
/* 字库搜索完毕,未找到,则填充全FF */
memset(buf, 0xFF, 32);
break;
}
}
else
{
if ((code1 == g_Hz16[address + 0]) && (code2 == g_Hz16[address + 1]))
{
address += 2;
memcpy(buf, &g_Hz16[address], 32);
break;
}
else if ((g_Hz16[address + 0] == 0xFF) && (g_Hz16[address + 1] == 0xFF))
{
/* 字库搜索完毕,未找到,则填充全FF */
memset(buf, 0xFF, 32);
break;
}
}
}
width = 16;
#else
address = ((code1-0xa1) * 94 + (code2-0xa1)) * 32 + HZK16_ADDR;
memcpy(buf, (const uint8_t *)address, 32);
#endif
width = 16;
}
if(direction_flag == 0) //字的显示是从左往右显示
{
y = _usY; //将y轴坐标给y
/* 开始刷LCD */
for (m = 0; m < height; m++) // 字符高度
{
x = _usX;
for (i = 0; i < width; i++) // 字符宽度
{
if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
{
LCD_PutPixel(x, y, _tFont->usTextColor); // 设置像素颜色为文字色 ,也就是往屏幕上打点
}
else if (_tFont->usBackColor != CL_MASK) /* 如果是颜色掩码值,则做透明处理 */
{
LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
}
x++; //从左往右打点,打width个
}
y++; //向下移一个坐标(x从左往右移16个,y从上往下移1个)
}
}
if(direction_flag == 1)
{
x = _usX; //将x轴坐标给x
/* 开始刷LCD */
for (m = 0; m < height; m++) /* 字符高度 height*/
{
y = _usY;
for (i = 0; i < width; i++) /* 字符宽度 */
{
if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
{
LCD_PutPixel(x, y, _tFont->usTextColor); /* 设置像素颜色为文字色 */
}
else if (_tFont->usBackColor != CL_MASK) /* 如果是颜色掩码值,则做透明处理 */
{
LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
}
y++;//从上往下打点,打width个
}
x--; //向左移一个坐标(y从上往下16个,x从右往左1个)
}
}
if(direction_flag == 2)
{
x = _usX;//将x轴坐标给x
/* 开始刷LCD */
for (m = 0; m < height; m++) /* 字符高度 */
{
y = _usY;
for (i = 0; i < width; i++) /* 字符宽度 */
{
if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
{
LCD_PutPixel(x, y, _tFont->usTextColor); /* 设置像素颜色为文字色 */
}
else if (_tFont->usBackColor != CL_MASK) /* 如果是颜色掩码值,则做透明处理 */
{
LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
}
}
y++; //向下移一个坐标(x从左往右移16个,y从上往下移1个)
}
}
if(direction_flag == 1)
{
x = _usX; //将x轴坐标给x
/* 开始刷LCD */
for (m = 0; m < height; m++) /* 字符高度 height*/
{
y = _usY;
for (i = 0; i < width; i++) /* 字符宽度 */
{
if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
{
LCD_PutPixel(x, y, _tFont->usTextColor); /* 设置像素颜色为文字色 */
}
else if (_tFont->usBackColor != CL_MASK) /* 如果是颜色掩码值,则做透明处理 */
{
LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
}
y++;//从上往下打点,打width个
}
x--; //向左移一个坐标(y从上往下16个,x从右往左1个)
}
}
if(direction_flag == 2)
{
x = _usX;//将x轴坐标给x
/* 开始刷LCD */
for (m = 0; m < height; m++) /* 字符高度 */
{
y = _usY;
for (i = 0; i < width; i++) /* 字符宽度 */
{
if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
{
LCD_PutPixel(x, y, _tFont->usTextColor); /* 设置像素颜色为文字色 */
}
else if (_tFont->usBackColor != CL_MASK) /* 如果是颜色掩码值,则做透明处理 */
{
LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
}
y--; //y从下往上打点,打y个
}
x++; //向右移一个坐标,(y从下往上16个,x从左往右1个)
}
}
}
x++; //向右移一个坐标,(y从下往上16个,x从左往右1个)
}
}
if (_tFont->usBackColor != CL_MASK && _tFont->usSpace > 0)
{
/* 如果文字底色按_tFont->usBackColor,并且字间距大于点阵的宽度,那么需要在文字之间填充(暂时未实现) */
}
if(direction_flag == 0)
{
_usX += width + _tFont->usSpace; //字体顺序从左往右显示
_ptr++; /* 指向下一个字符 */
}
{
/* 如果文字底色按_tFont->usBackColor,并且字间距大于点阵的宽度,那么需要在文字之间填充(暂时未实现) */
}
if(direction_flag == 0)
{
_usX += width + _tFont->usSpace; //字体顺序从左往右显示
_ptr++; /* 指向下一个字符 */
}
if(direction_flag == 1)
{
_usY += width + _tFont->usSpace; //字体顺序从上往下显示
_ptr++; /* 指向下一个字符 */
}
if(direction_flag == 2)
{
_usY -= width - _tFont->usSpace; //字体顺序从下往上显示
_ptr++; /* 指向下一个字符 */
}
}
}
else
{
/* 暂时不支持其他字体 */
return;
}
}
{
_usY += width + _tFont->usSpace; //字体顺序从上往下显示
_ptr++; /* 指向下一个字符 */
}
if(direction_flag == 2)
{
_usY -= width - _tFont->usSpace; //字体顺序从下往上显示
_ptr++; /* 指向下一个字符 */
}
}
}
else
{
/* 暂时不支持其他字体 */
return;
}
}