|
做STM32H7B0显示汉字文本,需要用到字库,开始用HZK16,发现字太大了,改用HZK12,这个很合适。
下边是汉字显示函数
void LCD_DisplayChinese(uint16_t x, uint16_t y, char *pText)
{
uint16_t index = 0, counter = 0; // 计数变量
uint16_t HZnm; // 汉字区位码
uint8_t disChar; //字模的值
uint16_t Xaddress = x; //水平坐标
//汉字区位码计算该字在库中的地址。16*12用24, 16*16用32
HZnm = *pText; //区码
W25Qxx_TestAddr = (HZnm-0xB0)*ZT_32or24*94 + ZT_32or24*94*15 +0x42000;//
// 0x42000是HZK12在芯片上的起始地址 HZK16起始地址=0
HZnm = *(pText+1); //位码
W25Qxx_TestAddr += (HZnm-0xA1)*ZT_32or24;
//取汉字点阵USART_RX_BUF
SPI_Status = SPI_W25Qxx_ReadBuffer(W25Qxx_ReadBuffer,W25Qxx_TestAddr,ZT_32or24); //15啊 16薄
//画点显示
//for(index = 0; index <LCD_CHFonts->Sizes; index++)
for(index = 0; index <ZT_32or24; index++) //32
{
//// 获取相应的字模
disChar = W25Qxx_ReadBuffer[index];
for(counter = 0; counter < 8; counter++)
{ //屏幕地址起点
switch(HZ_XSFS&07)//汉字显示方式 0=黑底 1=反与 2=异或 3=或
{ case 0:
*(__IO uint16_t*)( LCD.LayerMemoryAdd + 2*(Xaddress + y*LCD_Width) ) = ZFS2YS[disChar][counter];
break;
case 1:
*(__IO uint16_t*)( LCD.LayerMemoryAdd + 2*(Xaddress + y*LCD_Width) ) &= ~ ZFS2YS[disChar][counter];
break;
case 2:
*(__IO uint16_t*)( LCD.LayerMemoryAdd + 2*(Xaddress + y*LCD_Width) ) |= ZFS2YS[disChar][counter];
break;
case 3:
*(__IO uint16_t*)( LCD.LayerMemoryAdd + 2*(Xaddress + y*LCD_Width) ) ^= ZFS2YS[disChar][counter];
break;
}
//
Xaddress++; //水平坐标自加
if( (Xaddress - x)==LCD_CHFonts->Width ) // 如果水平坐标达到了字符宽度,则退出当前循环
{ // 进入下一行的绘制
Xaddress = x;
y++;
break;
}
}
}
}
字库贴出来,方便使用,我找了一转才找到这个最合适。
HZK12
(191.67 KB, 下载次数: 42)
|
|