enterout123 发表于 2009-5-11 09:26:50

请傻孩子指教SED1335的CGRAM如何使用?

我想在文本方式下显示中文,在自建CGRAM后,显示乱码.不知道问题出在哪里?我怀疑是自己对光标使用不理解,还有就是CGRAM实际地址的计算.
1)在向CGRAM写汉字点阵时,先确定地址为cgram_addr+0x80*8+i,i表示汉字点阵第i个字节.这样对吗?
2)再确定光标移动方向为向右,这点我就不明白,是不是在写CGRAM时,不要使用光标自动移动?

Gorgon_Meducer 发表于 2009-5-11 10:25:34

SD1335我还是2008年用的,现在已经记不太清楚了。
你在文本模式下,用它自己的8*8字体显示正确么?

enterout123 发表于 2009-5-11 20:54:17

其他都正常,主要我希望所有文字和ASCII都在文本下显示,这个论坛可能很多人遇到这问题无法解决.主要是数据手册对CGRAM描述有点模糊.

Gorgon_Meducer 发表于 2009-5-11 21:00:18

你看得是中文数据手册还是E文数据手册?

enterout123 发表于 2009-5-13 10:32:18

现在我可以证明字型代码已经成功写入CGRAM,8X8共四个块(左上+左下+右上+右下),比如我显示"束"左上字型时,显示的是两个垂直的,多了一半.程序如下:
/*************************************************
建立 cgram,将显示字符送入cgram中

入口参数约定:Base.... 起始 参考A
*************************************************/
void BuildCgram(void)
{
    uchar i;
    send_cmd(cgram);                                              //写设置CGRAM开始地址命令
    Write16BitData(cgram_adr);                                    //写设置CGRAM地址命令的参数+0x80*8????
    send_cmd(csrw);                                             //光标定位
    Write16BitData(cgram_adr+(uint)0x80*8);                     //写设置光标地址命令的参数
    send_cmd(csrdir_down);                                       //光标向右移动
    send_cmd(mwrite);
    for (i=0;i<16;i=i+2)send_dat(Cdotlib);//Cdotlib是"束"的点阵库,由上向下由左向右取模 ,这是写左上            
    for (i=1; i<16; i=i+2)send_dat(Cdotlib);
    for (i=16;i<32; i=i+2)send_dat(Cdotlib);
    for (i=17;i<32; i=i+2)send_dat(Cdotlib);
}
/****************************************************************************
汉字写入子程序(文本方式)
在文本方式下显示汉字, 首先要建立汉字Cgram, 要定义汉字代码.
在文本方式下写汉字需要写入4 个代码以组成一个汉字
每8字节组成一个点阵Ascii小区,4个小区组合成一个汉字所以需要4个代码 参考B
*****************************************************************************/
void PutCdotInAlpha( uint x, uint y)
{
    uint temp;
        uchar i;
        uchar code_number=0x80;
        temp=y*xsize+x;
    send_cmd(csrdir_down);                                 
    send_cmd(csrw);                                 // 写入“光标地址 CSR 设置”命令
    Write16BitData(temp);                           //设置光标地址 CSR =计算得到的光标地址
    send_cmd(mwrite);                              // 写入“连续写入显示数据”命令
    send_dat(code_number) ;         // 写入汉字的左上部?这个地方出问题,实际显示的是相同的两个左上部,一上一下排列
    //send_dat(code_number+1);
   //send_dat(code_number+2);
      //send_dat(code_number+3);   
   
}

cctnt 发表于 2009-5-13 10:42:54

for (i=0;i<16;i=i+2)send_dat(Cdotlib);//Cdotlib是"束"的点阵库,由上向下由左向右取模 ,这是写左上               
    for (i=1; i<16; i=i+2)send_dat(Cdotlib);
改为
for (i=0;i<8;i=i++)send_dat(Cdotlib);//Cdotlib是"束"的点阵库,由上向下由左向右取模 ,这是写左上               
    for (i=8; i<16; i=i++)send_dat(Cdotlib); //__________这是写左下

不知道为何不用8×16的字符模式?

enterout123 发表于 2009-5-13 13:26:36

5楼说的好,看来是个内行,我也用过8X16.同样不行.还请关照下啊!

enterout123 发表于 2009-5-14 09:27:41

问题已经解决,过段时间将完整的程序上传.

luy3728000 发表于 2010-4-14 11:06:15

什么原因???
页: [1]
查看完整版本: 请傻孩子指教SED1335的CGRAM如何使用?