请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 788|回复: 0
收起左侧

[LTDC] 12*12汉字库分享

[复制链接]

11

主题

28

回帖

61

积分

初级会员

积分
61
发表于 2022-8-6 16:37:42 | 显示全部楼层 |阅读模式
做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, 下载次数: 18)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-29 01:11 , Processed in 0.220205 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表