OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5823|回复: 3

24*24字库在mini板上更改疑问?

[复制链接]

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
发表于 2013-10-27 20:49:15 | 显示全部楼层 |阅读模式

#include "fontupd.h"
#include "sys.h"
#include "fat.h"
#include "flash.h"
#include "usart.h"
#include "delay.h"
#include "lcd.h"
 

//以下下字段一定不要乱改!!!
//字节0~3,  记录UNI2GBKADDR;字节4~7  ,记录UNI2GBKADDR的大小
//字节8~11, 记录FONT16ADDR ;字节12~15,记录FONT16ADDR的大小
//字节16~19,记录FONT12ADDR ;字节20~23,记录FONT12ADDR的大小


//字节32,用来存放字库是否存在的标志位,0XAA,表示存在字库;其他值,表示字库不存在!

//系统文件夹   
const unsigned char *folder[2]=
{
"SYSTEM",
"FONT",  
}; 
//系统文件定义
const unsigned char *sysfile[2]=
{    
//"GBK16.FON",
//"GBK12.FON",
"GBK24.FON",
"UNI2GBK.SYS",  
};
//字节0~3,  记录UNI2GBKADDR;字节4~7  ,记录UNI2GBKADDR的大小
//字节8~11, 记录FONT16ADDR ;字节12~15,记录FONT16ADDR的大小
//字节16~19,记录FONT12ADDR ;字节20~23,记录FONT12ADDR的大小
//字体存放,从100K处开始
//100K,存放UNICODE2GBK的转换码 

//u32 FONT16ADDR ;//16字体存放的地址
//u32 FONT12ADDR ;//12字体存放的地址
u32 FONT24ADDR ;//24字体存放的地址
u32 UNI2GBKADDR;//UNICODE TO GBK 表存放地址    

//更新字体文件
//返回值:0,更新成功;
//   其他,错误代码.
//正点原子@ALIENTEK
//V1.1
#ifdef EN_UPDATE_FONT
u8 temp[512];  //零时空间
u8 Update_Font(void)
{
 u32 fcluster=0;   
 u32 i;
 //u8 temp[512];  //零时空间  在这里定义,会内存溢出
 u32 tempsys[2];  //临时记录文件起始位置和文件大小
 float prog;
 u8 t;  
 FileInfoStruct FileTemp;//零时文件夹            
 //得到根目录的簇号
 if(FAT32_Enable)fcluster=FirstDirClust;
 else fcluster=0;     
 FileTemp=F_Search(fcluster,(unsigned char *)folder[0],T_FILE);//查找system文件夹  
 if(FileTemp.F_StartCluster==0)return 1;        //系统文件夹丢失    
 {            
  //先查找字体
  FileTemp=F_Search(FileTemp.F_StartCluster,(unsigned char *)folder[1],T_FILE);//在system文件夹下查找FONT文件夹
  if(FileTemp.F_StartCluster==0)return 2;//字体文件夹丢失 

  fcluster=FileTemp.F_StartCluster;      //字体文件夹簇号    
  FileTemp=F_Search(fcluster,(unsigned char *)sysfile[1],T_SYS);//在system文件夹下查找SYS文件
  if(FileTemp.F_StartCluster==0)return 3;//FONT12字体文件丢失 
  LCD_ShowString(20,90,"Write UNI2GBK to FLASH...");  
  LCD_ShowString(108,110,"%");  
  F_Open(&FileTemp);//打开该文件
  i=0;  
  while(F_Read(&FileTemp,temp))//成功读出512个字节
  {  
   if(i<FileTemp.F_Size)//不超过文件大小
   {
    SPI_Flash_Write(temp,i+100000,512);//从100K字节处开始写入512个数据  
    i+=512;//增加512个字节
   }
   prog=(float)i/FileTemp.F_Size;
   prog*=100;
   if(t!=prog)
   {
    t=prog;
    if(t>100)t=100;
    LCD_ShowNum(84,110,t,3,16);//显示数值
   }        
  }
  UNI2GBKADDR=100000;//UNI2GBKADDR从100K处开始写入.
  tempsys[0]=UNI2GBKADDR;
  tempsys[1]=FileTemp.F_Size;     //UNI2GBKADDR 大小
  SPI_Flash_Write((u8*)tempsys,0,8);//记录在地址0~7处

  delay_ms(1000);      
 
  FONT24ADDR=FileTemp.F_Size+UNI2GBKADDR;//F24的首地址
  FileTemp=F_Search(fcluster,(unsigned char *)sysfile[0],T_FON);//在system文件夹下查找FONT24字体文件
  if(FileTemp.F_StartCluster==0)return 4;//FONT24字体文件丢失 

  LCD_ShowString(20,90,"Write FONT24 to FLASH... ");   
  F_Open(&FileTemp);//打开该文件
  i=0;  
  while(F_Read(&FileTemp,temp))//成功读出512个字节
  {
   if(i<FileTemp.F_Size)//不超过文件大小
   {
    SPI_Flash_Write(temp,i+FONT24ADDR,512);//从0开始写入512个数据  
    i+=512;//增加512个字节
   }
   prog=(float)i/FileTemp.F_Size;
   prog*=100;
   if(t!=prog)
   {
    t=prog;
    if(t>100)t=100;
    LCD_ShowNum(84,110,t,3,16);//显示数值
   }
  }              
  tempsys[0]=FONT24ADDR;
  tempsys[1]=FileTemp.F_Size;     //FONT24ADDR 大小
  SPI_Flash_Write((u8*)tempsys,8,8);//记录在地址8~15处  
  delay_ms(1000);       
 }
 
 t=0XAA;
    SPI_Flash_Write(&t,16,1);//写入字库存在标志 0XAA
 LCD_ShowString(20,90,"  Font Update Successed  ");     
 delay_ms(1000);  
 delay_ms(1000);  
 return 0;//成功
}
#endif

//用这个函数得到字体地址
//在系统使用汉字支持之前,必须调用该函数
//包括FONT16ADDR,FONT12ADDR,UNI2GBKADDR; 
u8 Font_Init(void)
{
 u32 tempsys[2];//临时记录文件起始位置和文件大小
 u8 fontok=0;
 SPI_Flash_Read(&fontok,16,1);//读出字库标志位,看是否存在字库
 if(fontok!=0XAA)return 1;
 SPI_Flash_Read((u8*)tempsys,0,8);//读出8个字节  
 UNI2GBKADDR=tempsys[0];      

 SPI_Flash_Read((u8*)tempsys,8,8);//读出8个字节  
 FONT24ADDR=tempsys[0];

 return 0; 
}

红色和蓝色是我参考16字体改动过的程序,下面是text.c


#include "sys.h"
#include "fontupd.h"
#include "flash.h"
#include "lcd.h"
#include "text.h"
                 
//code 字符指针开始
//从字库中查找出字模
//code 字符串的开始地址,ascii码
//mat  数据存放地址 size*2 bytes大小
//正点原子@HYW
//CHECK:09/10/30
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{
 unsigned char qh,ql;
 unsigned char i;      
 unsigned long foffset;
 qh=*code;
 ql=*(++code);
 if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
 {        
     for(i=0;i<(size*3);i++)*mat++=0x00;//填充满格
     return; //结束访问
 }         
 if(ql<0x7f)ql-=0x40;//注意!
 else ql-=0x41;
 qh-=0x81;  
 foffset=((unsigned long)190*qh+ql)*(size*3);//得到字库中的字节偏移量     

 if(size==24)
   SPI_Flash_Read(mat,foffset+FONT24ADDR,72);               

//显示一个指定大小的汉字
//x,y :汉字的坐标
//font:汉字GBK码
//size:字体大小
//mode:0,正常显示,1,叠加显示 
//正点原子@HYW
//CHECK:09/10/30
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
 u8 temp,t,t1;
 u16 y0=y;
 u8 dzk[72];
 u16 tempcolor;

 Get_HzMat(font,dzk,size);//得到相应大小的点阵数据
 if(mode==0)//正常显示
 { 
     for(t=0;t<size*3;t++)
     {                 
         temp=dzk[t];
         for(t1=0;t1<8;t1++)
   {
    if(temp&0x80)LCD_DrawPoint(x,y);
     else
    {
     tempcolor=POINT_COLOR;
     OINT_COLOR=BACK_COLOR;
     LCD_DrawPoint(x,y);
     OINT_COLOR=tempcolor;//还原
    }
    temp<<=1;
    y++;
    if((y-y0)==size)
    {
     y=y0;
     x++;
     break;
    }
   }   
     }
 }else//叠加显示
 {
     for(t=0;t<size*3;t++)
     {                 
      temp=dzk[t];//得到12数据                         
         for(t1=0;t1<8;t1++)
   {
    if(temp&0x80)LCD_DrawPoint(x,y);  
    temp<<=1;
    y++;
    if((y-y0)==size)
    {
     y=y0;
     x++;
     break;
    }
   }   
     }
 }   
}
//在指定位置开始显示一个字符串    
//支持自动换行
//(x,y):起始坐标
//str  :字符串
//size :字体大小
//mode:0,非叠加方式;1,叠加方式   
//正点原子@HYW
//CHECK:09/10/30     
void Show_Str(u16 x,u16 y,u8*str,u8 size,u8 mode)
{                
    u8 bHz=0;     //字符或者中文                       
    while(*str!=0)//数据未结束
    {
        if(!bHz)
        {
         if(*str>0x80)bHz=1;//中文
         else              //字符
         {     
                if(x>(LCD_W-size/2))//换行
    {      
     y+=size;
     x=0;   
    }          
          if(y>(LCD_H-size))break;//越界返回     
          if(*str==13)//换行符号
          {        
              y+=size;
     x=0;
              str++;
          } 
          else LCD_ShowChar(x,y,*str,size,mode);//有效部分写入
    str++;
          x+=size/2; //字符,为全字的一半
         }
        }else//中文
        {    
            bHz=0;//有汉字库   
            if(x>(LCD_W-size))//换行
   {    
    y+=size;
    x=0;   
   }
         if(y>(LCD_H-size))break;//越界返回            
         Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示
         str+=2;
         x+=size;//下一个汉字偏移    
        }      
    }  
}         
//得到字符串的长度
//正点原子@HYW
//CHECK OK 091118
u16 my_strlen(u8*str)
{
 u16 len=0;
 while(*str!='\0')
 {
  str++;
  len++;
 }
 return len;
}
//在str1后面加入str2
//正点原子@HYW
//CHECK OK 091118
void my_stradd(u8*str1,u8*str2)
{     
 while(*str1!='\0')str1++;
 while(*str2!='\0')
 {
  *str1=*str2;
  str2++;
  str1++;
 }
 *str1='\0';//加入结束符    

//在指定宽度的中间显示字符串
//如果字符长度超过了len,则用Show_Str显示
//len:指定要显示的宽度
//针对12*12字体!!!
void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len)
{
 u16 strlenth=0;
    strlenth=my_strlen(str);
 strlenth*=size/3;
 if(strlenth>len)Show_Str(x,y,str,size,1);
 else
 {
  strlenth=(len-strlenth)/3;
     Show_Str(strlenth+x,y,str,size,1);
 }
}  

 

原子哥,帮我看看哪里还需要改吧,实在是不知道怎么改了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-27 23:55:52 | 显示全部楼层
Mini板的扩展例程,就有显示24*24汉字的例子....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2013-10-28 11:03:27 | 显示全部楼层
我看那个例程是显示了几个汉字的啊,我想要做一个24的字体库,像16的那样,毕竟7寸屏上16的字体太小了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-28 18:27:31 | 显示全部楼层
回复【3楼】 lixulongren :
---------------------------------
方法是一样的.
另外,论坛有人发过详细的字库制作方法,你可以参考下啊.
http://www.openedv.com/posts/list/16673.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 15:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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