UCGUI添加外置字库到SD卡(附字库)
<p style="text-indent: 0em;"><span style="color: rgb(255, 0, 0);">注:</span>本文参考了网上相关资料,且通过了本人的尝试。</p><p style="text-indent: 2em;">前天刚刚把原子哥的汉字显示实验看完,并且成功的将字库及FATFS的cc936.c文件装到SD卡,昨天又开始研究将UCGUI的汉字库装到SD卡里,为此上网查了许多资料。</p><p style="text-indent: 2em;">最开始我用的是论坛里坛友—<span style="color: rgb(0, 112, 192);">洋洋kan世界</span>的方法,但是显示出来的汉子不太好,汉子中间有一横线,(可能是自己移植的不太好吧,还有跟字库有很大的关系),因此自己又上网查找相关的解决办法,终于找到了办法,思路和坛友—<span style="color: rgb(0, 112, 192);">洋洋kan世界</span>的差不多。这次添加外置字库,最大的问题就是字库的获取上,我的大部分时间也是浪费在这上面的。</p><p style="text-indent: 2em;">辛苦了一天的成果,在这里拿出来和大家分享,希望对那些打算将UCGUI的汉字库放在SD卡的朋友们有帮助吧。<br/></p><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">步骤如下(下面附件有修改好的相关代码文件):</span></p><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);"></span></p><p class="artical_littlestyle1">1.在<span style="color: rgb(255, 0, 0);">GUIType.h</span>文件里添加如下内容:</p><pre class="brush:cpp;toolbar:false PrismJs">DECLARE_FONT(PROP_X);
#define GUI_FONTTYPE_PROP_USER \
GUIPROP_X_DispChar, \
GUIPROP_X_GetCharDistX, \
GUIMONO_GetFontInfo, \
GUIMONO_IsInFont, \
(tGUI_ENC_APIList*)0</pre><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">注意:</span><span style="color: rgb(0, 112, 192);">该内容不能放在太靠前的位置,这里我把它放在</span>“<span style="color: rgb(227, 108, 9);">/* PROPAA: Proportional, antialiased fonts, 2bpp, SJIS encoding */</span>”的前面。</p><p class="artical_littlestyle2">2.将<span style="color: rgb(255, 0, 0);">GUI_UC_EncodeNone.c</span>文件里的内容改为如下内容:</p><pre class="brush:cpp;toolbar:false PrismJs">/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* 礐/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : GUI_UC_EncodeNone.c
Purpose : Encoding routines for non unicode systems (default)
---------------------------END-OF-HEADER------------------------------
*/
#include "GUI_Protected.h"
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
/*********************************************************************
*
* _GetCharCode
*
* Purpose:
* Return the UNICODE character code of the current character.
*/
static U16 _GetCharCode(const char GUI_UNI_PTR * s) {
if((*s) > 0xA0)
{
return *(const U16 GUI_UNI_PTR *)s;
}
return *(const U8 GUI_UNI_PTR *)s;
}
/*********************************************************************
*
* _GetCharSize
*
* Purpose:
* Return the number of bytes of the current character.
*/
static int _GetCharSize(const char GUI_UNI_PTR * s) {
GUI_USE_PARA(s);
if((*s) > 0xA0)
{
return 2;
}
return 1;
}
/*********************************************************************
*
* _CalcSizeOfChar
*
* Purpose:
* Return the number of bytes needed for the given character.
*/
static int _CalcSizeOfChar(U16 Char) {
GUI_USE_PARA(Char);
if(Char > 0xA0A0)
{
return 2;
}
return 1;
}
/*********************************************************************
*
* _Encode
*
* Purpose:
* Encode character into 1/2/3 bytes.
*/
static int _Encode(char *s, U16 Char) {
if(Char > 0xA0A0)
{
*((U16 *)s) = (U16)(Char);
return 2;
}
*s = (U8)(Char);
return 1;
}
/*********************************************************************
*
* Static data
*
**********************************************************************
*/
/*********************************************************************
*
* _API_Table
*/
const GUI_UC_ENC_APILIST GUI__API_TableNone = {
_GetCharCode, /* return character code as U16 */
_GetCharSize, /* return size of character: 1 */
_CalcSizeOfChar, /* return size of character: 1 */
_Encode /* Encode character */
};
/*********************************************************************
*
* Exported code
*
**********************************************************************
*/
/*********************************************************************
*
* GUI_UC_SetEncodeNone
*/
void GUI_UC_SetEncodeNone(void) {
GUI_LOCK();
GUI_Context.pUC_API = &GUI__API_TableNone;
GUI_UNLOCK();
}
/*************************** End of file ****************************/</pre><p class="artical_littlestyle3">3.新建文件<span style="color: rgb(255, 0, 0);">GUICharPEx.c</span>文件,并且将它加入工程,其内容如下:</p><pre class="brush:cpp;toolbar:false PrismJs">#include <stddef.h> /* needed for definition of NULL */
#include "GUI_Private.h"
#include "ff.h"
#include "malloc.h"
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
//字模数据的暂存数组,以单个字模的最大字节数为设定值
#define BYTES_PER_FONT 128
static U8 GUI_FontDataBuf[BYTES_PER_FONT];
extern void GUI_X_GetFontData(char *font, U32 oft, U8 *ptr, U8 bytes);
//从外部存储器取得字模数据
static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c)
{
U8 BytesPerFont;
U32 oft;
char *font = (char *)pProp->paCharInfo->pData;
BytesPerFont = GUI_Context.pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数
if (BytesPerFont > BYTES_PER_FONT){BytesPerFont = BYTES_PER_FONT;}
if (c < 0x80) //英文字符地址偏移算法
{
oft = c * BytesPerFont;
}
else
{
oft = ((((c >> 8)-0xA1)) + ((c & 0xFF)-0xA1) * 94)* BytesPerFont; //中文字符地址偏移算法包括符号
}
GUI_X_GetFontData(font, oft, GUI_FontDataBuf, BytesPerFont);
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUIPROP_DispChar
*
* Purpose:
* This is the routine that displays a character. It is used by all
* other routines which display characters as a subroutine.
*/
void GUIPROP_X_DispChar(U16P c)
{
int BytesPerLine;
GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_Context.pAFont->p.pProp;
//搜索定位字库数据信息
for (; pProp; pProp = pProp->pNext)
{
if ((c >= pProp->First) && (c <= pProp->Last))break;
}
if (pProp)
{
GUI_DRAWMODE OldDrawMode;
const GUI_CHARINFO GUI_UNI_PTR * pCharInfo = pProp->paCharInfo;
GUI_GetDataFromMemory(pProp, c);//取出字模数据
BytesPerLine = pCharInfo->BytesPerLine;
OldDrawMode = LCD_SetDrawMode(DrawMode);
LCD_DrawBitmap(GUI_Context.DispPosX, GUI_Context.DispPosY,
pCharInfo->XSize, GUI_Context.pAFont->YSize,
GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag,
1, /* Bits per Pixel */
BytesPerLine,
&GUI_FontDataBuf[0],
&LCD_BKCOLORINDEX
);
/* Fill empty pixel lines */
if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize)
{
int YMag = GUI_Context.pAFont->YMag;
int YDist = GUI_Context.pAFont->YDist * YMag;
int YSize = GUI_Context.pAFont->YSize * YMag;
if (DrawMode != LCD_DRAWMODE_TRANS)
{
LCD_COLOR OldColor = GUI_GetColor();
GUI_SetColor(GUI_GetBkColor());
LCD_FillRect(GUI_Context.DispPosX, GUI_Context.DispPosY + YSize,
GUI_Context.DispPosX + pCharInfo->XSize,
GUI_Context.DispPosY + YDist);
GUI_SetColor(OldColor);
}
}
LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag;
}
}
/*********************************************************************
*
* GUIPROP_GetCharDistX
*/
int GUIPROP_X_GetCharDistX(U16P c)
{
const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUI_Context.pAFont->p.pProp;
for (; pProp; pProp = pProp->pNext)
{
if ((c >= pProp->First) && (c <= pProp->Last))break;
}
return (pProp) ? (pProp->paCharInfo)->XSize * GUI_Context.pAFont->XMag : 0;
}
/*---------------------------------------------------------------------------*/
/*字库外部函数部分-----------------------------------------------------------*/
void GUI_X_GetFontData(char* font, U32 oft, U8 *ptr, U8 bytes)
{
FIL *fsrc; // 定义文件操作类
FRESULT res; // 定义操作结果变量
UINT br; // 定义读写数量变量
fsrc=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
res = f_open(fsrc, font, FA_OPEN_EXISTING | FA_READ); //打开字库文件
if(res != FR_OK)
{
//打开失败显示问号
}
res = f_lseek(fsrc,oft); //找到首地址
res = f_read(fsrc, ptr, bytes, &br); //读取32个字库点阵数据
res = f_close(fsrc); //关闭字体
myfree(SRAMIN,fsrc);
}</pre><p class="artical_littlestyle4">4.接下来就是新建三个自己的与字体相关的文件</p><p style="text-indent: 2em;">分别是:<span style="color: rgb(255, 0, 0);">GUI_Font12.c</span>,<span style="color: rgb(255, 0, 0);">GUI_Font14.c</span>,<span style="color: rgb(255, 0, 0);">GUI_Font16.c</span>,并且将它们加入工程。<span style="color: rgb(255, 0, 0);">GUI_Font12.c</span>内容如下:</p><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">注意:下述代码的字库在SD卡的路径(SD卡卷标为0,且” SYSTEM”文件夹为SD卡根目录下的文件夹 )。</span></p><pre class="brush:cpp;toolbar:false PrismJs">#include "GUI.h"
/*
****************************************
*
*说明:GUI_FontHZ12.C文件
*
*By:ailson jack
*
*Date:2013.09.21
*****************************************
*/
extern int GUIPROP_X_GetCharDistX(U16P c);//声明部分
extern void GUIPROP_X_DispChar(U16P c) ;
GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ12_CharInfo[2] =
{
{ 6, 6, 1, (void *)"0:SYSTEM/FONT/GUI_ASC12.gui"},//&ASC_ROM_6X12 字库的路径
{ 12,12,2, (void*) "0:SYSTEM/FONT/GUI_HZ12.gui"}, //&HZ_ROM_12X12字库的路径
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ= {
0xA1A1, //第一个字符
0xFEFE, //最后一个字符
&GUI_FontHZ12_CharInfo[1], //字符信息
(void *)0,
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropASC= {
0x0000, //第一个字符
0x007F, //最后一个字符
&GUI_FontHZ12_CharInfo[0], //字符信息
(void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropHZ,
};
GUI_CONST_STORAGE GUI_FONT GUI_FontHZ12 =
{
GUI_FONTTYPE_PROP_USER,
12, //xsize
12, //yszie
1, //x方向放大倍数
1, //y方向放大倍数
(void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropASC
};</pre><p style="text-indent: 2em;">至于<span style="color: rgb(255, 0, 0);">GUI_Font14.c</span>,<span style="color: rgb(255, 0, 0);">GUI_Font16.c</span>,的内容,可查看下面的附件。</p><p style="text-indent: 2em;">至此,UCGUI的外置字库添加完成.</p><p style="text-indent: 2em;">然后可在<span style="color: rgb(255, 0, 0);">main()函数</span>所在的文件里面输入:<br/></p><pre class="brush:cpp;toolbar:false PrismJs">extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ12;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ14;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16;</pre><p style="text-indent: 2em;">再在<span style="color: rgb(255, 0, 0);">main()函数</span>里面输入如下代码(只是部分代码,相关初始化什么的就自己去弄吧):<br/></p><pre class="brush:cpp;toolbar:false PrismJs">GUI_SetFont(&GUI_FontHZ16);
GUI_DispStringAt("UC/GUI外置字库",30,30);
GUI_DispStringAt("---2013.09.21",81,50);
GUI_SetFont(&GUI_Font8x16);
GUI_DispStringAt("AILSON JACK",60,90);
GUI_SetFont(&GUI_FontHZ12);
GUI_DispStringAt("MCU的世界,你值得探索!!!(12x12)",3,120);
GUI_SetFont(&GUI_FontHZ14);
GUI_DispStringAt("MCU的世界,你值得探索!!!(14x14)",3,140);
GUI_SetFont(&GUI_FontHZ16);
GUI_DispStringAt("MCU的世界,你值得探索!!!(16x16)",3,160);
GUI_SetFont(&GUI_FontHZ16);</pre><p style="text-indent: 2em;">移植不是随便编的,有图有真相哦 ,其效果图如下:<br/></p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.08.11/1533955020300703.jpg" onclick="preview_image('/uploads/AilsonJack/2018.08.11/1533955020300703.jpg')"/></p><p style="text-indent: 2em;">好了,至此,应该就完成了UCGUI添加外置字库到SD卡的全过程。</p><p style="text-indent: 0em;"> 下面是一些附件: <a class="btn btn-success" href="https://pan.baidu.com/s/1qWp11Pa#list/path=%2F" target="_blank">点此下载</a></p><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">注:SYSTEM.rar是SD卡根目录下的字库。直接将其解压,然后将解压得到的文件夹拷贝到SD卡的根目录下即可。</span><br/></p>
暂无评论,要不要来个沙发
发表评论
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla