搜索
bottom↓
回复: 30

3310显示4行汉字新方法-指针法!!

[复制链接]

出0入0汤圆

发表于 2006-3-29 12:41:40 | 显示全部楼层 |阅读模式
首先要谢谢ouravr 和zhi2005及所有人!!



经过一天的研究与解读zhi2005的程序,在其基础上加以改进,改进后的程序更节省RAM,

只在函数内部定义了几个局部变量;接口性更强,对3310取模软件生成的字库数据可直接调用。

利用了zhi2005的概念,把3310屏分成28个区,每个区可写一个12×12的汉字。用X表示横坐标,范围从0到6,即一行可写7个汉字;用Y表示纵坐标,范围从0到3,即一列可写4个汉字。



3310显示4行汉字的特点可用下图表示:









假如一个汉字(12×12)头为高位,尾为低位的话,则一共可分两种显示方式,即先显示高8位后显示低4位和先显示高4位后显示低8位。因此0行字和2行字的显示方式相同,即先显示高8位,后显示低4位;1行字和3行字的显示方式,即先显示高4位,后显示低8位。

3310纵向48个象素,又因为一个RAM字节可显示8个象素,所以在纵向上可分成6栏(从0~5)。显示一个12×12的汉字后就占了1.5个字节,而3310是以字节为单位送数据的,

因此显示一行字其实就占用了两栏的RAM字节。而一个汉字的后12个数据的高位部分全为0,即第二栏的RAM字节的高位部分没有显示,因此可把下一行字的前12个数据的低四位移到高四位来和上行字的后12个数据的低4位相与后并送第二栏RAM显示(标号为1)。这是先显示一个汉字的高8位,后显示低4位的情况。

第二中情况也类似,请查看程序。

对程序中的flag 局部变量是用来区分一些特殊情况而设的。

特殊情况就是:不是从第0行开始显示,而是从第1行或第3行开始显示,这就要对半个字节进行特别处理。

国语学的不好,表达能力不强,有什么解释不到的地方,还请各位见谅!!

非常愿意跟各位一起学习!



以下是显示四行汉字的程序,其中LCD_ChineseConvertTypeOne和LCD_ChineseConvertTypeTwo为两中转换类型的子程序,它们只能被LCD_WriteChinese调用。

//======================================

void LCD_ChineseConvertTypeOne(const unsigned char (*c)[24],unsigned char x,unsigned char y,unsigned char flag)

{

        unsigned char i,data,temp;

        LCD_set_XY(x*12, y);

        for(i=0;i<12;i++)                                                // 显示高8位

                LCD_write_byte((*c),1);       

        LCD_set_XY(x*12, y+1);

        for(i=0;i<12;i++)

        {                                                                                                  // 显示低4位

                if(get_bit(flag,0))

                        temp=(*(c-21))<<4;                       

                else

                        temp=0;

                data=(*c)[i+12]|temp;

                LCD_write_byte(data,1);

        }

}

//======================================

void LCD_ChineseConvertTypeTwo(const unsigned char (*c)[24],unsigned char x,unsigned char y,unsigned char flag)

{

        unsigned char i,temp,data;

        LCD_set_XY(x*12, y);

        for(i=0;i<12;i++)

        {                                                                // 显示高4位                //

                if(get_bit(flag,1))

                                temp=0;

                else

                                temp = (*(c-7))[i+12];

                data = (*c)<<4;       

                data |= temp;

                LCD_write_byte(data,1);

        }

        LCD_set_XY(x*12,y+1);

        for(i=0;i<12;i++)

        {                                                                // 显示低8位

                temp = (*c)>>4;

                data = (*c)[i+12]<<4;

                data |= temp;

                LCD_write_byte(data,1);

        }

}

//======================================

void LCD_WriteChinese(const unsigned char (*c)[24],unsigned char num,unsigned char x,unsigned char y)

{

        unsigned char j,flag;

        if(y==1|y==3)

                flag=0x03;

        else

                flag=0;



        for(j=0;j<num;j++)

        {

                switch(y)

                {

                        case        0:

                        {

                                LCD_ChineseConvertTypeOne(c,x,y,flag);

                                clr_bit(flag,1);

                        }

                        break;

                        case        1:

                                LCD_ChineseConvertTypeTwo(c,x,y,flag);

                        break;

                        case        2:

                        {

                                LCD_ChineseConvertTypeOne(c,x,y+1,flag);

                                clr_bit(flag,1);

                        }

                        break;

                        case        3:

                                LCD_ChineseConvertTypeTwo(c,x,y+1,flag);

                        break;

                        default:break;

                }

                x++;

                c++;

                if(x>6)

                {

                        x = 0;

                        y ++;

                }

                if(y>3)

                        y = 0;               

        }

}






-----此内容被coole于2006-03-29,13:10:28编辑过

出0入0汤圆

发表于 2006-3-29 15:49:50 | 显示全部楼层
这个方法,值得一试

出0入0汤圆

发表于 2006-3-30 13:01:06 | 显示全部楼层
好贴,好好拜读一下!

出0入0汤圆

发表于 2006-7-26 21:41:05 | 显示全部楼层
我哦也要试!!谢谢楼主

出0入0汤圆

发表于 2006-7-27 10:31:45 | 显示全部楼层
好好好,堅決支持樓主!!!

出0入0汤圆

发表于 2006-7-27 16:01:09 | 显示全部楼层
学习,

出0入0汤圆

发表于 2007-3-31 22:17:47 | 显示全部楼层
好帖,要慢慢研究了

出0入0汤圆

发表于 2007-4-1 20:42:12 | 显示全部楼层
支持楼主这种精神。

去年跑去买3310,结果一问3510I只要10元/片,比3310便宜,就买了一堆3510I,把3310都给搁一边了。

对于用MEGA8跑这类液晶,大家还是得根据自己需要裁减以一下网站示范代码,减少函数参数和去掉不必要的代码,毕竟M8资源太少。

出0入0汤圆

发表于 2009-5-23 18:25:00 | 显示全部楼层
get_bit(),这种函数没有给出定义,调试不出来!!

出0入0汤圆

发表于 2009-5-23 19:18:05 | 显示全部楼层
楼主啊,虽然很认同你的分享精神,但12点阵的汉字有好多字都看不清哦,花了一把牛力做出来的却不会让你满意.

出0入0汤圆

发表于 2009-5-23 20:17:44 | 显示全部楼层
mark一个,有空回来学习一下解决问题的思想~

出0入0汤圆

发表于 2009-5-27 10:24:31 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2009-6-7 01:54:35 | 显示全部楼层
555我的汉字显示有问题

出0入0汤圆

发表于 2009-6-7 07:11:43 | 显示全部楼层

出0入0汤圆

发表于 2009-6-7 12:37:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-7 17:08:58 | 显示全部楼层
有意思,mark

出0入8汤圆

发表于 2009-12-1 11:19:52 | 显示全部楼层
这个方法不错,谢谢lz,争取把这个方法用在bascom-avr上面

出0入0汤圆

发表于 2009-12-1 15:21:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-27 16:01:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-27 16:55:02 | 显示全部楼层
关键是有12*12点阵好看的字库。

出0入0汤圆

发表于 2010-2-28 23:32:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-2 16:28:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-2 16:45:51 | 显示全部楼层
mark
头像被屏蔽

出0入0汤圆

发表于 2010-3-2 17:18:37 | 显示全部楼层
准备使用一下

出0入0汤圆

发表于 2010-3-2 23:57:47 | 显示全部楼层
mark

出0入8汤圆

发表于 2010-4-23 08:24:13 | 显示全部楼层
lz,你对3310液晶屏的显示原理讲的很清楚,这让我受益匪浅,但是我几经试验发现lz的方法有问题,在此提出,班门弄斧了,请多多指教。
就是这里:因此显示一行字其实就占用了两栏的RAM字节。而一个汉字的后12个数据的高位部分全为0,即第二栏的RAM字节的高位部分没有显示,因此可把下一行字的前12个数据的低四位移到高四位来和上行字的后12个数据的低4位相与后并送第二栏RAM显示(标号为1),这样可以显示吗?两个字节相与的结果不是高低四位全为0了,带着这样的疑问我在程序中修改为相或后试验成功了,这里是我的文章:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3984751&bbs_id=1000,

出0入0汤圆

发表于 2010-4-23 09:11:28 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-4-23 21:04:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-22 01:19:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-22 08:40:36 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 14:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表