分享一款GB18030汉字点阵库 字体大小12/16/24

2019-08-08 11:58发布

在前两天的撸一堆板子上面,发现一款汉字字库芯片
高通gotop的gt32l24m01
-28e03eda3ec74dd0.jpg
一看手册发现这玩意儿支持的字库相当多
汉字支持12*12 16*16 241*24三种大小的GB18030标准的27484个汉字和1038个汉字标点字符
然后呢一大堆各种大小样式的ascii字符
再仔细一读手册发现这玩意儿操作指令居然和25系列的flash一模一样
直接上编程器,发现是个4MB的,直接就给他整片拷贝下来了。
其中0-0x7ffff为空白区域512KB,用户可以自行使用。
那么就是说后面3.5MB的内容就是字库内容了
支持的字库列表和地址
6.JPG
7.JPG
手册上面的样张 一部分截图
4.JPG
5.JPG
拷贝下来的bin有4MB。找个4m的flash烧录进去

mini板上面找个现成的 实验30 汉字显示实验,简单一改就可以用了
效果如下:
专门试了下,支持中文标点符号没有问题~
2.JPG
3.JPG
汉字内码解析程序 手册上的个地方有错
[mw_shl_code=c,true]#include "sys.h"
#include "flash.h"
#include "lcd.h"
#include "text.h"       
#include "string.h"                                                                                                  
//////////////////////////////////////////////////////////////////////////////////         
//GT32L24M0140                                                          
//////////////////////////////////////////////////////////////////////////////////
                                                           
//code 字符指针开始
//从字库中查找出字模
//code 字符串的开始地址,GBK码
//mat  数据存放地址 (size/8+((size%8)?1:0))*(size) bytes大小       
//size:字体大小
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{                    
        unsigned char c1,c2,c3,c4;
        unsigned char i;                                          
        unsigned long foffset;
        unsigned long h=0;
        u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数         
        c1=*code;
        c2=*(++code);
        c3=*(++code);
        c4=*(++code);
        if(c2==0x7f)
        {                       
            for(i=0;i<csize;i++)*mat++=0x00;//填充满格
            return; //结束访问
        }
        if(size==12)
        {       
                        if(c1 >= 0xA1 && c1 <= 0xa9 && c2 >= 0xa1) //Section 1
                                h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
                        else if(c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //Section 5
                        {
                                if(c2 > 0x7f)
                                        c2--;
                                h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
                        }
                        if(c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //Section 2
                                h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038;
                        else if(c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40 ) //Section 3
                        {
                                if(c2 > 0x7f)
                                        c2--;
                                        h=(c1-0x81)*190 + (c2-0x40) + 1038 +6768;
                        }
                        else if(c1>=0xaa && c2<0xa1) //Section 4
                        {
                        if(c2>0x7f)
                        c2--;
                        h=(c1-0xaa)*96 + (c2-0x40) + 1038 +12848;
                        }
                        foffset=h*24;
                        SPI_Flash_Read(mat,foffset+0x093D0E,24);
        }
       
        else        if(size==16)
        {       
                                if(c1 <= 0xA1 && c1 >= 0xA0 && c2 >= 0xa1) //Section 1 标点
                                        h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
                                else if(c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //Section 5
                                {
                                        if(c2 > 0x7f)
                                                c2--;
                                        h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
                                }
                                if(c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //Section 2
                                        h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038;
                                else if(c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40 ) //Section 3
                                {
                                        if(c2 > 0x7f)
                                                c2--;
                                        h = (c1 - 0x81) * 190 + (c2 - 0x40) + 1038 + 6768;
                                }
                                else if(c1 >= 0xaa && c2 < 0xa1) //Section 4
                                {
                                        if(c2 > 0x7f)
                                                c2--;
                                        h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848;
                                }
                                else if(c1 == 0x81 && c2 >= 0x39) //四字节区 1
                                {
                                        h = 1038 + 21008 + (c3 - 0xEE) * 10 + c4 - 0x39;
                                }
                                else if(c1 == 0x82) //四字节区 2
                                {
                                        h = 1038 + 21008 + 161 + (c2 - 0x30) * 1260 + (c3 - 0x81) * 10 + c4 - 0x30;
                                }
                        foffset=h*32;
                        SPI_Flash_Read(mat,foffset+0x114FDE,32);
        }
        if(size==24)
        {       
                                if(c1 >= 0xA1 && c1 <= 0xAB && c2 >= 0xa1) //Section 1
                                        h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
                                else if(c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //Section 5
                                {
                                        if(c2 > 0x7f)
                                                c2--;
                                        h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
                                }
                                if(c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //Section 2
                                        h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038;
                                else if(c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40) //Section 3
                                {
                                        if(c2 > 0x7f)
                                                c2--;
                                        h = (c1 - 0x81) * 190 + (c2 - 0x40) + 1038 + 6768;
                                }
                                else if(c1 >= 0xaa && c2 < 0xa1) //Section 4
                                {
                                        if(c2 > 0x7f)
                                                c2--;
                                        h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848;
                                }
                                else if(c1 == 0x81 && c2 >= 0x39) //四字节区  1
                                {
                                        h = 1038 + 21008 + (c3 - 0xEE) * 10 + c4 - 0x39;
                                }
                                else if(c1 == 0x82) //四字节区  2
                                {
                                        h = 1038 + 21008 + 161 + (c2 - 0x30) * 1260 + (c3 - 0x81) * 10 + c4 - 0x30;
                                }
                                foffset=h*72;
                                SPI_Flash_Read(mat,foffset+0x1F43DE,72);
        }                                                                                                                           
}  
//显示一个指定大小的汉字
//x,y :汉字的坐标
//font:汉字GBK码
//size:字体大小
//mode:0,正常显示,1,叠加显示          
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
        u8 temp,t,t1;
        u16 x0=x;
        u8 dzk[72];   
        u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数         
        if(size!=12&&size!=16&&size!=24)return;        //不支持的size
        Get_HzMat(font,dzk,size);        //得到相应大小的点阵数据
        for(t=0;t<csize;t++)
        {                                                                                                     
                temp=dzk[t];                        //得到点阵数据                          
                for(t1=0;t1<8;t1++)
                {
                        if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
                        else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
                        temp<<=1;
                        x++;
                        if((x-x0)==size)
                        {
                                x=x0;
                                y++;
                                break;
                        }
                }           
        }  
}





//在指定位置显示一个字符 从字库中取
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar_ZK(u16 x,u16 y,u8 num,u8 size,u8 mode)
{                                                            
    u8 temp,t1,t;
        u16 x0=x;
        u8 cache[48];
        u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数        24号字最大用48
        num=num-0x20;//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
       
                if(size==12)SPI_Flash_Read(cache,num*12+0x080900,12);                 //调用1206字体
                else if(size==16)SPI_Flash_Read(cache,num*16+0x080D80,16);        //调用1608字体
                else if(size==24){SPI_Flash_Read(cache,num*48+0x081B80,48);csize=48;}        //调用2412字体
                else return;                                                                //没有的字库       
       
        for(t=0;t<csize;t++)
        {   
                temp=cache[t];
                for(t1=0;t1<8;t1++)
                {                            
                        if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
                        else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
                        temp<<=1;
                        x++;
                        //if(x>=lcddev.width)return;        //超区域了                       
                        if((x-x0)==size/2)
                        {
                                x=x0;
                                y++;
                                //if(y>=lcddev.height)return;                //超区域了
                                break;
                        }
                }           
        }                                            
}   
//在指定位置开始显示一个字符串            
//支持自动换行
//(x,y):起始坐标
//width,height:区域
//str  :字符串
//size :字体大小
//mode:0,非叠加方式;1,叠加方式                                 
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{                                       
        u16 x0=x;
        u16 y0=y;                                                                    
    u8 bHz=0;     //字符或者中文                                                                                              
    while(*str!=0)//数据未结束
    {
        if(!bHz)
        {
                if(*str>0x80)bHz=1;//中文
                else              //字符
                {      
                if(x>(x0+width-size/2))//换行
                                {                                  
                                        y+=size;
                                        x=x0;          
                                }                                                            
                        if(y>(y0+height-size))break;//越界返回      
                        if(*str==13)//换行符号
                        {         
                            y+=size;
                                        x=x0;
                            str++;
                        }  
                        else LCD_ShowChar_ZK(x,y,*str,size,mode);//有效部分写入     外部字库
                                                // else LCD_ShowChar(x,y,*str,size,mode);//有效部分写入  内部字库
                                str++;
                        x+=size/2; //字符,为全字的一半
                }
        }else//中文
        {     
                                        bHz=0;//有汉字库   
                                        if(x>(x0+width-size))//换行
                                        {            
                                                y+=size;
                                                x=x0;                  
                                        }
                if(y>(y0+height-size))break;//越界返回                                                       
                Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示
                str+=2;
                x+=size;//下一个汉字偏移            
        }                                                 
    }   
}  [/mw_shl_code]


东西丢 {MOD}了
内容包含 字库bin文件 芯片手册和完整的mini板子的程序
链接:http://pan.baidu.com/s/1cKVLsM 密码:h1i1



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。