野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11031|回复: 17

如何显示中文,不用SD卡

[复制链接]
发表于 2015-6-17 00:38:04 | 显示全部楼层 |阅读模式
想显示不多的汉字,不想用SD卡,如何用字模自制字库然后显示出来
回复

使用道具 举报

发表于 2015-6-17 08:58:30 | 显示全部楼层
直接把字库放到外部FLASH里面即可

我们有现成的参考例程,你看看
ucosiii+emwin+flash文件系统 共56个例程,欢迎下载
http://www.firebbs.cn/forum.php? ... =8766&fromuid=1
(出处: 野火初学论坛)
回复 支持 反对

使用道具 举报

发表于 2015-6-17 10:56:38 | 显示全部楼层
只用为数不多的几个汉字,当然可以直接写在程序中了,将字模以二维数组形式保存于主文件或头文件中
字数肯定不能太多,否则程序存储器不够,另外改变显示内容不方便
存外部FLASH当然比较好了,不用文件系统了,不过我们用的开发板外部FLASH空间也不大,想多存几种字体都不够了,特别是大字体,体积呈几何增长
16*16汉字实在太小了
回复 支持 反对

使用道具 举报

发表于 2015-6-17 11:34:28 | 显示全部楼层
11kxmx 发表于 2015-6-17 10:56
只用为数不多的几个汉字,当然可以直接写在程序中了,将字模以二维数组形式保存于主文件或头文件中
字数肯 ...

你可以换W25Q64或者Q25Q128的FLASH,这样就很多空间了
回复 支持 反对

使用道具 举报

发表于 2015-6-17 16:14:48 | 显示全部楼层
如果另外加装的话还可以,不知用杜邦线连接时钟频率要不要降低很多,这种密引脚芯片没有工具和一定技术,自己想更换太难了,弄不好把板子搞坏了
希望野火以后出的板子直接加W25Q64,成本好象高不了多少?毕竟零件成本占总成本比例不高
原子钟的 低价STM32 MINI 板就是W25Q64
还有24C02,换成24C08或24C16,成本增加也不多,可几乎所有单片机开发板都是24C02
回复 支持 反对

使用道具 举报

发表于 2015-6-17 18:06:48 | 显示全部楼层
11kxmx 发表于 2015-6-17 16:14
如果另外加装的话还可以,不知用杜邦线连接时钟频率要不要降低很多,这种密引脚芯片没有工具和一定技术,自 ...

杜邦线连接没有影响,焊接这些也很简单,多折腾几次就可以了,板子的样品都是我们自己焊接的

那你买的板子应该比较久了,以前用的是W25X16

现在的MINI和ISO用的都是W25Q64,F4用的是W25Q128。
回复 支持 反对

使用道具 举报

发表于 2015-6-17 18:08:16 | 显示全部楼层
11kxmx 发表于 2015-6-17 16:14
如果另外加装的话还可以,不知用杜邦线连接时钟频率要不要降低很多,这种密引脚芯片没有工具和一定技术,自 ...

EEPROM现在是基本没有人用,放在那里就是为了做I2C这个实验,24C02有256个字节,现在很少很少有客户会把数据放到EEPROM里面了,对不对。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-17 18:49:55 | 显示全部楼层
11kxmx 发表于 2015-6-17 10:56
只用为数不多的几个汉字,当然可以直接写在程序中了,将字模以二维数组形式保存于主文件或头文件中
字数肯 ...

数组生成了,可是怎么在程序里调用输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-17 20:41:55 | 显示全部楼层
lijunjun 发表于 2015-6-17 18:49
数组生成了,可是怎么在程序里调用输出

这是字模输出的数组,但是不知道怎么显示出来

这是数组

这是数组
回复 支持 反对

使用道具 举报

发表于 2015-6-18 08:29:15 | 显示全部楼层
本帖最后由 11kxmx 于 2015-6-18 08:45 编辑
lijunjun 发表于 2015-6-17 20:41
这是字模输出的数组,但是不知道怎么显示出来

你的数组是怎样生成的,是几个汉字,怎么哪么大?
这是原来显示汉字的子程序(见例程:液晶显示汉字):可以去掉语句GetGBKCode_from_sd(buffer,pstr)
把buffer[]改成TABLE[]即可,如果汉字较多,表格可改成二维表TABLE[m][32],m表示汉字数量,32表示每个16*16汉字字模占32字节
const uint8_t *pstr 改成汉字编号 uint8_t  bianhao

void LCD_DispCH(uint16_t x, uint16_t y, const uint8_t *pstr, uint16_t color)
{
uint8_t page , column;
uint8_t buffer[32];  
uint16_t tmp_char=0;
LCD_OpenWindow(x, y, CH_WIDTH, CH_HEIGHT);
LCD_ILI9341_CMD(0X2C);
GetGBKCode_from_sd(buffer,pstr);  /* 取字模数据 */
for(page=0; page< CH_HEIGHT; page++)
{
    /* 取出两个字节的数据,在lcd上即是一个汉字的一行 */
  tmp_char=buffer[page*2];
  tmp_char=(tmp_char<<8);
  tmp_char|=buffer[2*page+1];
  
  for (column=0; column< CH_WIDTH; column++)
  {   
   if ( tmp_char & (0x01<<15) )  /* 高位在前 */
   {   
    LCD_WR_Data(color);
   }
   else
   {   
    LCD_WR_Data(BACKGROUND);
   }
   tmp_char <<= 1;
  }
}
}

等我下班了,给你贴一个编好的子程序和应用例子

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 23:43:45 | 显示全部楼层
11kxmx 发表于 2015-6-18 08:29
你的数组是怎样生成的,是几个汉字,怎么哪么大?
这是原来显示汉字的子程序(见例程:液晶显示汉字): ...

四个字,应该不大吧,这个是子程序吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 23:51:46 | 显示全部楼层
fire 发表于 2015-6-17 08:58
直接把字库放到外部FLASH里面即可

我们有现成的参考例程,你看看

火哥帮个忙啊,就要在没有ucos的基础上显示汉字,没有教程生成里数组不知道怎么用啊
回复 支持 反对

使用道具 举报

发表于 2015-6-23 22:31:54 | 显示全部楼层
本帖最后由 11kxmx 于 2015-7-10 15:30 编辑
lijunjun 发表于 2015-6-18 23:51
火哥帮个忙啊,就要在没有ucos的基础上显示汉字,没有教程生成里数组不知道怎么用啊

這是我的顯示32*32漢字的程序 n是漢字編號,由於我用到100多个漢字,所以用二維數組,便于查找

象你的只有4 個漢字,所以可以用一維數組
尋址时 前半行(8個點)用 Bmp111111802[n*32+i*2]  後半行(8個點)用 Bmp111111802[n*32+i*2+1]
如果顯示第0個漢字 n=0 第1個漢字 n=1   i 是行号

void LCD_Disphanzi(uint16_t x, uint16_t y,uint16_t n,uint16_t color)
{
   uint16_t page, column,temp1,temp2,temp3,temp4;
   LCD_OpenWindow(x, y,32, 32); //32 *32
LCD_ILI9341_CMD(0X2C);

for( page=0; page < 128; page+=4 ) //32 *32漢字佔128字節
{
  temp1 = hanzi3232[n];
  temp2 = hanzi3232[n][page+1];
  temp3 = hanzi3232[n][page+2];
  temp4 =hanzi3232[n][page+3];
  for( column=0; column < 8; column++ )
  {
   if( temp1 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp1>>= 1;  
  }/*寫1/4行8個點*/
     for( column=0; column < 8; column++ )
  {
   if( temp2 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp2>>= 1;  
  }/*又寫1/4行*/
    for( column=0; column < 8; column++ )
  {
   if( temp3 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp3>>= 1;  
  }/* 又寫1/4行*/
    for( column=0; column < 8; column++ )
  {
   if( temp4 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp4>>= 1;  
  }/*又寫1/4行, 一行寫完*/
}/*寫128/4次即寫完32行*/
}

上面程序中每次寫1/4行的段落用了4 次,語句基本相似,所以程序還可以壓縮
下面是顯示64*64漢字程序,當然不會再把相似的語句段寫8次了
void LCD_Dispbighanzi(uint16_t x, uint16_t y,uint16_t n,uint16_t color)
{
   uint16_t page,byte,column,temp1;
   LCD_OpenWindow(x, y,64, 64); //64 *64  LCD_ILI9341_CMD(0X2C);

for( page=0; page < 512; page+=8 )
{
   for(byte=0;byte < 8; byte++)   
   {
    temp1 = hanzi64x64[n][page+byte];
     for( column=0; column < 8; column++ )
     {      
      if( temp1 & 0x01 )
      {
       LCD_WR_Data( color );
      }
      else
      {
       LCD_WR_Data( BACKGROUND );        
      }
      temp1>>= 1;  
     }/* 寫8 個點*/
  } /* 寫完一行*/   
}/*寫完64 行*/
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-29 20:37:00 | 显示全部楼层
11kxmx 发表于 2015-6-23 22:31
這是我的顯示32*32漢字的程序 n是漢字編號,由於我用到100多个漢字,所以用二維數組,便于查找

象你的只 ...

最近在忙做其他项目,好多天没上论坛了,谢谢你了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-1 22:35:47 | 显示全部楼层
11kxmx 发表于 2015-6-23 22:31
這是我的顯示32*32漢字的程序 n是漢字編號,由於我用到100多个漢字,所以用二維數組,便于查找

象你的只 ...

可不可以给个例子,邮箱814699480@qq.com,不胜感激
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-2 00:12:00 | 显示全部楼层
fire 发表于 2015-6-17 18:08
EEPROM现在是基本没有人用,放在那里就是为了做I2C这个实验,24C02有256个字节,现在很少很少有客户会把 ...

有没有不用SD卡不用外部FLASH显示汉字的例子,麻烦火哥告诉我怎么做,我只有你那字模制作工具,可是不知道怎么在程序中显示出来,麻烦火哥给个例子,我好好看看
回复 支持 反对

使用道具 举报

发表于 2017-9-27 22:52:01 | 显示全部楼层
fire 发表于 2015-6-17 08:58
直接把字库放到外部FLASH里面即可

我们有现成的参考例程,你看看

火哥 我按照楼下大神的例程编辑了16*16的自建字模显示程序 但显示的总是乱码 能帮我指出症结吗?
void LCD_Dispbighanzi(uint16_t x, uint16_t y,uint16_t n,uint16_t color)
{
   uint16_t page,byte,column,temp1;

   ILI9341_OpenWindow (x, y,16, 16);   
         ILI9341_Write_Cmd ( CMD_SetPixel );               
for( page=0; page < 32; page+=2 )//16*16汉字占用32个字节
{
   for(byte=0;byte < 8; byte++)   
   {
    temp1 = zimo[n][page+byte];
     for( column=0; column < 8; column++ )
     {      
      if( temp1 & 0x01 )
      {
      ILI9341_Write_Data ( CurrentTextColor );
      }
      else
      {
      ILI9341_Write_Data ( CurrentBackColor );
      }
      temp1>>= 1;  
     }
  }   
}
}
按照零死角PDF的教程设置了PCtolLCD的参数,生成“惠”字的字模如下
const unsigned char zimo[13][32]=
{
{0x00,0x00,0x01,0x80,0x7F,0xFE,0x01,0x80,0x1F,0xF8,0x11,0x88,0x1F,0xF8,0x11,0x88},
{0x1F,0xF8,0x01,0x98,0x3F,0xFC,0x01,0x04,0x2D,0x8C,0x6C,0x96,0x4F,0xF2,0x00,0x00},/*"惠",0*/
};
但是一直显示乱码,跪求看一眼是哪里出了问题?
T_T............................
回复 支持 反对

使用道具 举报

发表于 2017-10-15 14:02:53 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-27 22:22 , Processed in 0.048031 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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