请傻孩子指教SED1335的CGRAM如何使用?
我想在文本方式下显示中文,在自建CGRAM后,显示乱码.不知道问题出在哪里?我怀疑是自己对光标使用不理解,还有就是CGRAM实际地址的计算.1)在向CGRAM写汉字点阵时,先确定地址为cgram_addr+0x80*8+i,i表示汉字点阵第i个字节.这样对吗?
2)再确定光标移动方向为向右,这点我就不明白,是不是在写CGRAM时,不要使用光标自动移动? SD1335我还是2008年用的,现在已经记不太清楚了。
你在文本模式下,用它自己的8*8字体显示正确么? 其他都正常,主要我希望所有文字和ASCII都在文本下显示,这个论坛可能很多人遇到这问题无法解决.主要是数据手册对CGRAM描述有点模糊. 你看得是中文数据手册还是E文数据手册? 现在我可以证明字型代码已经成功写入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);
} 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的字符模式? 5楼说的好,看来是个内行,我也用过8X16.同样不行.还请关照下啊! 问题已经解决,过段时间将完整的程序上传. 什么原因???
页:
[1]