打印

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

[复制链接]
308|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3月的尾巴|  楼主 | 2019-11-20 11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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;
      }//一行写完
    }//全部写完
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

433

主题

433

帖子

0

粉丝