野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13483|回复: 7

新人,关于LCD直接显示汉字问题

[复制链接]
发表于 2015-6-1 22:13:47 | 显示全部楼层 |阅读模式
本帖最后由 笨跑哥 于 2015-6-1 22:15 编辑

使用ISO-MINI显示汉字,例程是将所有汉字做成二级汉字库,写入sd卡里。而我们在做项目时,使用的汉字不多,这种情况下,可以自己建一个汉字库,将汉字库写在头文件里,通过访问汉字的内码得到汉字的点阵信息,最后将汉字显示出来。我用C写了一个程序,在Code::Blocks里运行,能完整的打印出汉字,但是在keil里就不行了,已经很长时间了,一直没有解决该问题,请高手们帮我看看,问题出在哪里。
Code::Blocks里运行的代码:


typedef struct
{
        unsigned char Index[2];                //汉字内码索引
        unsigned char Msk[32];                //汉字点阵
        /* data */
}typFont_GB16;

const typFont_GB16  ChnChar_16[]=
{
"这",
0x00,0x80,0x20,0x40,0x10,0x40,0x17,0xFC,0x00,0x10,0x02,0x10,0xF1,0x20,0x10,0xA0,
0x10,0x40,0x10,0xA0,0x11,0x10,0x12,0x08,0x14,0x08,0x28,0x00,0x47,0xFE,0x00,0x00,
"是",
0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x00,0x00,
0xFF,0xFE,0x01,0x00,0x11,0x00,0x11,0xF8,0x11,0x00,0x29,0x00,0x45,0x00,0x83,0xFE,
"一",
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"个",

......   //这里省略一些汉字
}


int main(void)
{
    unsigned char page, column,k, *cn= "晶";
    unsigned int temp;
    for(k=0; k<13; k++)
    {
        if((ChnChar_16[k].Index[0] == cn[0]) && (ChnChar_16[k].Index[1] == cn[1]))
        {
            for(page=0; page<16; page++)
            {
                temp = ChnChar_16[k].Msk[page*2];
                temp = (temp<<8);
                temp += ChnChar_16[k].Msk[page*2+1];
                for(column=0; column<16; column++)
                {
                if(temp & (0x8000>>column))
                    printf("*");
                else
                    printf(" ");
                } //一行完成
                printf("\n");
            }//一页完成
        }
    }
  //  getch();
    return 0;
}


运行结果如图。
但是在keil里,汉字内码检测不能通过,始终进入不了while(1);   死循环
keil里使用的字库就是Code::Blocks里使用的字库

void LCD_DispChnChar(uint16_t x, uint16_t y, unsigned char CnChar[2], uint16_t color)
{
    uint16_t page, column, temp, i;
    uint8_t  k;


    LCD_OpenWindow(x, y, CHN_WIDTH, CHN_HEIGHT);
    LCD_ILI9341_CMD(0x2C);
         
    for(k=0; k<13; k++)
    {
      if((ChnChar_16[k].Index[0] == CnChar[0]) && (ChnChar_16[k].Index[1] == CnChar[1]))
       while(1);    ///////////如果内码与所要求的汉字一样,等待。。。。。。。
    }
    for(page=0; page < CHN_HEIGHT; page++)
    {
      /*取2个字节的数据,在lcd上是汉字的一行*/
//                        temp = pHanzi.Msk[page*2];
//                        temp = (temp<<8);
//                        temp |= pHanzi.Msk[page*2+1];
      for(column=0; column < CHN_WIDTH; column++)
      {
        if(temp & (0x01<<15))
        {
          LCD_WR_Data(color);
        }
        else
        {
          LCD_WR_Data(BACKGROUND);
        }
        temp <<= 1;
      }//一行写完
    }//全部写完
}





无标题.png
回复

使用道具 举报

发表于 2015-6-2 09:38:25 | 显示全部楼层
#include "stm32f10x.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_usart1.h"

extern void Lcd_Delay(__IO uint32_t nCount);

typedef struct
{
        unsigned char Index[2];
        unsigned char Msk[32];
        /* data */
}typFont_GB16;

const typFont_GB16  ChnChar_16[]=
{
"这",
0x00,0x80,0x20,0x40,0x10,0x40,0x17,0xFC,0x00,0x10,0x02,0x10,0xF1,0x20,0x10,0xA0,
0x10,0x40,0x10,0xA0,0x11,0x10,0x12,0x08,0x14,0x08,0x28,0x00,0x47,0xFE,0x00,0x00,
"是",
0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x00,0x00,
0xFF,0xFE,0x01,0x00,0x11,0x00,0x11,0xF8,0x11,0x00,0x29,0x00,0x45,0x00,0x83,0xFE,
"一",
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};


uint32_t n;

/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{  
        unsigned char k, *cn= "是";
       
        LCD_Init();       

        LCD_Clear(0, 0, 240, 320, BACKGROUND);       
       
         for(k=0; k<3; k++)
    {
      if((ChnChar_16[k].Index[0] == cn[0]) && (ChnChar_16[k].Index[1] == cn[1]))
                        {
                                        LCD_DispChar(60, 60, 'Y', RED);
                                        break;
                        }
    }

        LCD_DispStr(10, 10, (uint8_t *)"This is a lcd demo to display ascii", RED);       
       
        LCD_DispStr(40, 100, (uint8_t *)"count:", RED);
       
        for( n=0; n<500000; n++ )
        {
                LCD_DisNum(100, 100, n, RED);
                Lcd_Delay(0xAFFf>>4);
        }
       
        while( 1 ){}
}

在ISO-V2开发板配套的例程《11、 FSMC-液晶显示-英文》修改的,可以进入
if((ChnChar_16[k].Index[0] == cn[0]) && (ChnChar_16[k].Index[1] == cn[1]))
{
        LCD_DispChar(60, 60, 'Y', RED);
        break;
}
可以想到的方法就是把有中文的C文件用记事本打开(打开就好,不用改内容),直接另存为:ANSI编码格式
QQ截图20150602093740.png


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-2 17:36:34 | 显示全部楼层
亽亼 发表于 2015-6-2 09:38
#include "stm32f10x.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_usart1.h"

谢谢,马上就试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-2 17:43:53 | 显示全部楼层
实验完成,字库的头文件是UTF-8格式的,文件格式改过来就好了。感谢!!
回复 支持 反对

使用道具 举报

发表于 2016-1-15 20:55:11 | 显示全部楼层
不是很明白  楼主能不能再解释下  谢谢!
回复 支持 反对

使用道具 举报

发表于 2016-1-20 14:07:05 | 显示全部楼层
汉子在字库里可以生成的 只要调用就好打印就好的
回复 支持 反对

使用道具 举报

发表于 2016-1-22 13:35:01 | 显示全部楼层
h2f910302 发表于 2016-1-20 14:07
汉子在字库里可以生成的 只要调用就好打印就好的

楼主的意思是不使用SD卡
回复 支持 反对

使用道具 举报

发表于 2016-1-22 18:11:00 | 显示全部楼层
亽亼 发表于 2015-6-2 09:38
#include "stm32f10x.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_usart1.h"

我的怎么实现不了?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 11:35 , Processed in 0.039497 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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