发新帖我要提问
123
返回列表
打印

学习:求一个简洁的C语言汉字字模查表显示程序

[复制链接]
楼主: kuernikewa
手机看帖
扫描二维码
随时随地手机跟帖
41
JerryGE| | 2008-9-6 11:55 | 只看该作者 回帖奖励 |倒序浏览

多音字的理解

一般只是用一部分汉字,又不是做全库,多音字的话后面跟个编号不就可以了。

使用特权

评论回复
42
yzqok| | 2008-9-10 10:19 | 只看该作者

路过。。。

使用特权

评论回复
43
rainmans| | 2008-9-13 17:23 | 只看该作者

用合适的查找算法可以保证每次查找所用时间都是线性的

用#define反而不是合适的方法吧?
至少在单片机领域,得用多少define对应字库里面的汉字?增加多少code段的代码量?

使用特权

评论回复
44
xwj| | 2008-9-13 17:30 | 只看该作者

LS理解错误,用#define定义的是字模偏移,恰恰相反

用#define可以减少代码量

只是使用上麻烦些罢了

使用特权

评论回复
45
尘爱1314| | 2008-9-14 12:17 | 只看该作者

ILI9320程序

谁有ILI9320驱动,那来参考下吧

使用特权

评论回复
46
尘爱1314| | 2008-9-14 12:25 | 只看该作者

也正在思考这个问题!

/********************************************************/
/* ASCII(8*16) 及 汉字(16*16) 显示函数      */
/********************************************************/ 
unsigned char dprintf16(unsigned char x,unsigned char y,  char *ptr,unsigned char normal)
{
    
    unsigned char i,j,uLen,uRow,uCol;
    unsigned char c1;
    #ifdef HZ16     
    unsigned char c2;
    unsigned int  k;
    #endif

    uLen=0;
    i=0;
    uRow = y;
    uCol = x;
   // SetAddr(uRow,uCol);      //起点定位
    while (ptr[uLen]!=0) //探测字串长度
    {
        uLen++;
    }    
    while(i<uLen)
    {
           
        c1 = ptr;
        #ifdef HZ16
        c2 = ptr[i+1];
        //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
        
        if(c1 <=128)    // ASCII
          {
        #endif
            for(j=0;j<16;j++) //写16行
            {
                SetAddr(uRow+j,uCol);
                WriteComm(0xb0);                // 写数据(命令)
                if (c1 >= 0x20)
                  {
                    if(normal)
                        WriteAuto( ASC_MSK[(unsigned int)(c1-0x20)*16+j]);
                    else 
                        WriteAuto( ASC_MSK[(unsigned int)(c1-0x20)*16+j]^0xff);                    
                  }
                else
                {
                       WriteAuto(0);                        
                  }
                 WriteComm(0xb2);                //写数据结束
                
             }
            if(c1 != 0x08)      // 非退格
            {
                    uCol++;   // 列数加1
            }
         
        #ifdef HZ16                                 
        }
        #endif
        #ifdef HZ16
        else        // 中文
          {
            for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)      // 查找定位
            {
                if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
                {
                    break;
                }                            
            }
            for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
            {
                SetAddr(uRow+k,uCol);
                WriteComm(0xb0);              // 写数据
                if(j < sizeof(GB_16)/sizeof(GB_16[0]))
                  {
                    if(normal)
                    {
                          WriteAuto(GB_16[j].Msk[k*2]);
                          WriteAuto(GB_16[j].Msk[k*2+1]); 
                    } else 
                    {
                          WriteAuto(GB_16[j].Msk[k*2]^0xff);
                          WriteAuto(GB_16[j].Msk[k*2+1]^0xff); 
                    }
                       //WriteAuto(0xff);
                     //WriteAuto(0xff);
                  }
                else           // 未找到该字
                  {
                      if(k < sizeof(GB_16[0].Msk)/4)
                        {
                            WriteAuto(0);
                            WriteAuto(0);
                        }
                     else
                        {
                            WriteAuto(0);
                            WriteAuto(0);
                        }
                    }
                 WriteComm(0xb2);
              }
              uCol += 2;
              i++;
        };
        #endif

        if(uCol >= 30)                          // 光标后移
          {
              uRow += 16;
            if(uRow < 0x80)
            {
                uCol -= 30;
            }
              else
            {
            uRow = 0;
            uCol = 0;
            }
           }

       //  SetAddr(uRow,uCol);
         i++;
    }
    return uLen;        //返回字串长度,汉字按2字节计算
}     
#endif

使用特权

评论回复
47
sharks| | 2008-9-15 23:49 | 只看该作者

看看这个方法

  LCD_DisplayString("中文汉字字符串");
  不是更方便?
  试试看,看看字符串编译成了什么,楼主可能立即就明白该怎么做了!

使用特权

评论回复
48
huhaijiang| | 2008-9-17 13:13 | 只看该作者

re

做个记号,,,,

使用特权

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

本版积分规则