|
本帖最后由 weran 于 2024-7-22 09:28 编辑
一、实例效果图
当设计需要用到繁体字、生僻字时,可以使用GBK的字符集而且GBK内码完全兼容GB2312,同时支持繁体字并对生僻汉字和少数民族文字进行了扩充,总汉字数有2万多个。我这里使用高通字库软件生成GBK字库,高通字库软件会生成一个二进制文件和点阵编码范围列表文档。
点阵编码范围列表:
编码范围 字符序号范围 每字节编码含字符数(高字节->次低字节)
0xA1A1 - 0xA9FE 0 - 845 *94, *1.
GBK扩充5区:
0xA840 - 0xA9A0 846 - 1039 *97, *1.
0xB0A1 - 0xF7FE 1040 - 7807 *94, *1.
GBK扩充3区:
0x8140 - 0xA0FE 7808 - 13919 *191, *1.
GBK扩充4区:
0xAA40 - 0xFDA0 13920 - 22067 *97, *1.
0xFE40 - 0xFE4F 22068 - 22083 -, *1.
(扩充4区可以整合到一个调用, 即0xAA40 - 0xFEA0区)
GBK 扩充3区/4区的范围中, 剔除'xx7F'的码位字符, 可 低位 > 0x7F, 序号-1操作.
文件共有字符数: 22084 个.
二、演示代码
1、根据点阵编码范围列表文档编写出字体的索引代码
- /*****************************************************
- // 显示字符串函数
- // str:字符串
- // Font_Lib_Offset:汉字库在FLASH中地址偏移,宏定义预设
- // Font_Size:字型大小
- // Font_Gap:字符间距
- // x & y:字符串显示坐标
- ******************************************************/
- void Show_User_Def_String(char *str,unsigned long Font_Lib_Offset,unsigned short Font_Size,unsigned short Font_Gap,unsigned short x,unsigned short y)
- {
- unsigned short i,len;
- unsigned short hanziIndex;
- unsigned char hanziCode[200];
-
- strcpy((char*)hanziCode,str);
- len=strlen(&*hanziCode)/2;
-
- for(i=0;i<len;i++)
- {
- if(hanziCode[2*i]>=0xA1 && hanziCode[2*i]<=0xA9 && hanziCode[2*i+1]>=0xA1) //A3A1--A3FF
- {
- hanziCode[2*i]-=0xA1; //区码
- hanziCode[2*i+1]-=0xA1; //位码
- Font_Lib_Offset=0*Font_Size*Font_Size/8;
- hanziIndex=94*(hanziCode[2*i])+(hanziCode[2*i+1]);
- }
- if(hanziCode[2*i]>=0xB0 && hanziCode[2*i]<=0xF7 && hanziCode[2*i+1]>=0xA1) //GBK扩充5区 常用字 0xB0A1 - 0xF7FE
- {
- hanziCode[2*i]-=0xB0; //区码
- hanziCode[2*i+1]-=0xA1; //位码
- Font_Lib_Offset=1040*Font_Size*Font_Size/8;
- hanziIndex=94*(hanziCode[2*i])+(hanziCode[2*i+1]);
- }
- if(hanziCode[2*i]>=0x81 && hanziCode[2*i]<=0xA0) //GBK扩充3区 GBK编码包含字体 0x8140 - 0xA0FE
- {
- hanziCode[2*i]-=0x81; //区码
- hanziCode[2*i+1]-=0x40; //位码
- Font_Lib_Offset=7808*Font_Size*Font_Size/8;
- hanziIndex=191*(hanziCode[2*i])+(hanziCode[2*i+1]);
- }
- if(hanziCode[2*i]>=0xAA && hanziCode[2*i]<=0xFD && hanziCode[2*i+1]<=0xA0) //GBK扩充4区 偏僻字体 繁体 0xAA40 - 0xFDA0
- {
- hanziCode[2*i]-=0xAA; //区码
- hanziCode[2*i+1]-=0x40; //位码
- Font_Lib_Offset=13920*Font_Size*Font_Size/8;
- hanziIndex=97*(hanziCode[2*i])+(hanziCode[2*i+1]);
- }
-
- Show_User_Def_Font(hanziIndex, Font_Lib_Offset, Font_Size, x+Font_Size*i+Font_Gap*(i-1)-4*i, y);
- }
- }
复制代码 2、main.c演示代码
- SPI_NOR_initial_DMA (0,Font_BUS,Font_CS,1,0); //FLASH<128Mb BUS 1 CS 2
- BTE_Solid_Fill(display_address,canvas_image_width,0,0,0x01,LCD_Width,LCD_Height);
- User_Def_Font_Initial(32,1,color256_green,color256_yellow);
- //输出常用字 偏僻字 繁体字 32x32
- str="蘇州菱致電子液晶顯示齉龘龘靐齉齾甪直瓛"; //GBK编码,使用VSCode软件编辑文字
- Show_User_Def_String(str,GBK_SongTi_32,32,4,100,200);
- #if defined (MCU_8bit_ColorDepth_8bpp)
- BTE_S0_Color_8bpp();
- #endif
- #if defined (MCU_8bit_ColorDepth_16bpp) || defined (MCU_16bit_ColorDepth_16bpp)
- BTE_S0_Color_16bpp();
- #endif
- #if defined (MCU_8bit_ColorDepth_24bpp) || defined (MCU_16bit_ColorDepth_24bpp_Mode_1) || defined (MCU_16bit_ColorDepth_24bpp_Mode_2)
- BTE_S0_Color_24bpp();
- #endif
-
- BTE_Memory_Copy_Chroma_key(display_address,canvas_image_width,0,0,0,canvas_image_width,0,0,0x01,800,480);
复制代码 三、程序流程图
四、源代码下载:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|