打印

用51单片机12864显示bin文件中的汉字,请问bin文件的的内码是怎么回事,

[复制链接]
2460|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hllyellow|  楼主 | 2013-2-1 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是内码的程序虽然有注释还是看不懂,求详细解释
main()
{   uchar xdata* addx=0;                //初始值指向U6的开始,用于读取U6中天龙八部的内码
        ulong addf;                                //算得特定汉字在U0-U5中的位置
    uint i;                //存放汉字点阵的片内偏移地址
        ulong k,l;        //k存放内码的高8位,l存放内码的低八位
        uchar phang=0,plie=0;        //用于存放已显示汉字的个数
        uchar* hzdot;//用于存放调整好的汉字点阵的数组首地址,直接用于显示的输入

        E=1;
        dspon();
        cls();
        sets(0);
        cls();                                                                    //lcd初始化

        do
        {               

                P1=5;        //选中U6,装天龙八部的内码的
                while(((k=*addx)&0x80)==0x0) //识别该字符是ASCII码还是汉字码,ASCII码的最高位为0
                {
                if(k==0) while(1);//读到末尾标记/0的时候停止,死机
                if(k==0x0d)
                        {plie=0;
                         phang++;
                         if(phang>3) {phang=0;delay(1000);cls();}
                         addx+=2;
                        }
                }
                addx++;
                l=*addx;
                addx++;                //一个汉字的内码包括2个字节,下面的算法是根据汉字的内码来计算其在字库点阵中的位置
                addf=((k-161)*94+(l-161))*32;                //由内码计算汉字点阵首地址,k存放内码的高8位,l存放内码的低8位
                P1=addf/0x10000;        //计算汉字点阵所在的rom,片选
                i=(addf%0x10000);        //计算在汉字点阵被选中rom中的偏移地址地址
                hzdot=hz32(i);                //汉字点阵转向,转好后把调整好的汉字点阵放在全局变量graph32[]中
                wrhz(hzdot,phang,plie,0);        //显示汉字
                plie++;                               
                if(plie>7)
                        {phang++;plie=0;}        //列满7则行加1
                if(phang>3)                         //行满3则翻屏
                        {phang=0;delay(1000);cls();}       
         }while(1);

}

相关帖子

沙发
JerryWu75| | 2013-2-1 17:16 | 只看该作者
本帖最后由 JerryWu75 于 2013-2-1 17:28 编辑

国标对汉字的编码,你可以找一找GB2312看一看, 例如0xd6d0表示汉字"中",0xd6d0就是"中"的国标编码,0xd6区码,0xd0是位码.
addf=((k-161)*94+(l-161))*32;这行代码是计算汉字在ROM字库中的偏移地址,第一个汉字的起始区位码是0xa1a1,所以将汉字的区码k和位码I各自减去0xa1(161),然后在GB2312中每区94个汉字,每个汉字的点阵数据在字库中占用32个字节。
这样计算的到汉字在ROM字库中的地址,然后从这个地址开始取出32个字节的点阵数据进行显示。

使用特权

评论回复
板凳
uet_cache| | 2013-2-1 18:20 | 只看该作者
你液晶本身是带字库的吧。

使用特权

评论回复
地板
wzhouyuanw| | 2013-2-1 18:38 | 只看该作者
12864 ST7920 串口模式下 读绘图RAM的数据 始终=0,是不是串口模式下 不能读数据啊?
读数据的用途 主要是用来画点,如果读不到绘图RAM的数据,那么画点将没有意义
其它指令都正常 唯独 读取绘图RAM的数据=0 望使用过的高手 指点
在线等!!!!!!

使用特权

评论回复
5
dirtwillfly| | 2013-2-1 19:09 | 只看该作者
用汉字取模软件就可以,取模后用程序显示到液晶屏就行。不用管BIN文件是怎么样的。

使用特权

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

本版积分规则

2

主题

18

帖子

1

粉丝