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;
}
}