galaxyp 发表于 2010-5-8 18:38:07

诺基亚5110 四行汉字完整处理方案

n5110 四行汉字完整处理方案

http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_552443.jpg
(原文件名:001.jpg)

在坛子里看了不少资料,但是没有找到一个完整方案,花了1天做了一个完整方案出来,先说下思路。
由图可知,由于5110是按字节写的,但是12X12的汉字需要1.5个字节,在x方向上没有问题,在Y方向上就会出现4位的空



白,而下行字又直接写到整字节上,造成了一个4位宽的行间距。
我的解决方案是,在写0、3行的时候,将他们的下半区8位存入数组中,当写2、5行的时候,将2、5行的上半区下移4位和0、3行写入时保存的下半区内容或操作再写进1、4行,将2、5行的上半区上移4何2、5行的下版区下移4位或操作写入第3、5行。
看上去有点复杂,其实程序挺简单的,缺点就是要占用2*84个字节的内存。

效果
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_552444.jpg
(原文件名:002.jpg)


贴上程序的主要部分
typedef struct hanzi
        {
        uint16                                hanzi;                                       
        uint8                          code;                                       
}p_hanzi;


p_hanzi hanzi[] = {

{"子",         {//"子"0xD3D7
                  0x00,0x20,0x21,0x21,0x21,0x21,0xF9,0x25,   
                      0x23,0x21,0x30,0x20,0x00,0x00,0x00,0x04,
                      0x08,0x08,0x0F,0x00,0x00,0x00,0x00,0x00},},
                                                                                                       
{"工",         {//"工",0xA4B9
                    0x00,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,       
                      0x02,0x03,0x02,0x00,0x04,0x04,0x04,0x04,
                      0x04,0x07,0x04,0x04,0x04,0x04,0x06,0x04},},


{"师",         {//"师"0xA6CA
                       0x00,0xFC,0x00,0xFF,0x00,0xFA,0x0A,0x0A,               
                      0xFE,0x0A,0x0B,0xFA,0x00,0x09,0x04,0x03,
                      0x00,0x03,0x00,0x00,0x0F,0x00,0x02,0x03},},

};


uint8 Lcd_First_line_save;
uint8 Lcd_third_line_save;

void Write_lcd_chinese_string_4line(uint8 x,uint8 y , const char *str)
{
        uint8_t *p = (uint8_t *)str;
        while(*p != 0)
        {
        Lcd_Write_Chinese_Muli_Line(x, y, *(uint16_t *)p);
        x += 12;                       
        p += 2;
        }
}

void Write_lcd_chinese_string(uint8 x,uint8 y , const char *str)
{
        uint8_t *p = (uint8_t *)str;
        while(*p != 0)
        {
        Write_lcd_chinese(x, y, *(uint16_t *)p);
        x += 12;                       
        p += 2;
        }
}


void Write_lcd_chinese(uint8 x,uint8 y , uint16 str)
{
uint8 nexthalf = 0;
uint8 n=0,xx=0;
uint8 number;
uint8_t *p = (uint8_t *)str;
        for(n=0;n<10;n++)
        {
                if(str == hanzi.hanzi)
                {
                number=n;
                break;
                }
        }
        for(n=0;n<2;n++)
        {
        uint8 t=0;
        uint8 s=0;
                for(xx=x;xx<x+12;xx++)
                {
                LCD_set_XY(xx,y+n);
                LCD_write_byte(hanzi.code,1);
                Lcd_First_line_save=hanzi.code;
                s++;
                }
                nexthalf = 12;
                s=0;
        }
}


void Lcd_Write_Chinese_Muli_Line(uint8 x,uint8 y , uint16 str)
{
uint8 nexthalf = 0;
uint8 s=0,n=0,xx=0;
uint8 number;
uint8_t *p = (uint8_t *)str;
uint8 line_temp={0,2,3,5};

        for(n=0;n<10;n++)                                        //查找字符
        {if(str == *(uint16 *)(hanzi.hanzi)){number=n;break;}}

        if(line_temp == 0 || line_temp == 3)//处理1、3行的情况,需保存数据
        {
                for(n=0;n<2;n++)
                {
                        for(xx=x;xx<x+12;xx++)
                        {
                        uint8 temp;
                        LCD_set_XY(xx,line_temp+n);
                        temp = hanzi.code;
                        LCD_write_byte(temp,1);
                        if(line_temp == 0 ){Lcd_First_line_save=hanzi.code;}
                        if(line_temp == 3 ){Lcd_third_line_save=hanzi.code;}
                        s++;
                        }
                nexthalf = 12;
                s=0;
                }
        }

        if(line_temp == 2 || line_temp == 5)//处理2、4行的情况,需特殊处理
        {
                for(xx=x;xx<x+12;xx++)                        //上半区字节下移4位 | 上行字符或操作
                {
                uint8 temp;
                LCD_set_XY(xx,line_temp-1);

                if(line_temp == 2 ){temp = hanzi.code<<4 | Lcd_First_line_save;}
                if(line_temp == 5 ){temp = hanzi.code<<4 | Lcd_third_line_save;}
                LCD_write_byte(temp,1);
                s++;
                }
                s=0;

                for(xx=x;xx<x+12;xx++)                        //下半区字节上移4位 | 下半区字节上移4位
                {
                uint8 temp;
                LCD_set_XY(xx,line_temp);
                temp = hanzi.code>>4 | hanzi.code<<4;
                LCD_write_byte(temp,1);
                s++;
                }
        }

}
int main(void)
{
        LCD_init();//初始化液晶   
        LCD_clear();
        Write_lcd_chinese_string_4line(0,0,"师师子师师工工");
        Write_lcd_chinese_string_4line(0,1,"师师工工子工工");
        Write_lcd_chinese_string_4line(0,2,"工师工子师工工");
        Write_lcd_chinese_string_4line(0,3,"师师工工师工工");
//        Write_lcd_chinese_string(10,0,"师工");
//        Write_lcd_chinese_string(10,2,"师工");
//        Write_lcd_chinese_string(10,4,"师工");

}

eworker 发表于 2010-5-8 20:48:50

不错

super373 发表于 2010-5-12 18:17:12

学习了!

ZZL520 发表于 2010-5-12 18:49:43

mark

1181zjf 发表于 2010-5-12 19:34:15

mark

guhenggao 发表于 2010-5-13 16:02:30

mark

xanadu 发表于 2010-7-14 21:53:07

学习了,独辟蹊径啊

ammcu 发表于 2010-7-15 08:08:47

这个要mark

iam35200 发表于 2010-7-15 08:24:57

mark

boy364100 发表于 2010-7-15 08:27:15

非常不错,顶@

wbanng 发表于 2010-7-21 16:40:39

mark

duo1007 发表于 2010-10-22 23:59:01

为什么x方向上没有问题呢?

worldly_guest 发表于 2010-10-23 08:31:59

支持,这种方案速度很快!

liuqihui_panda 发表于 2010-10-24 12:05:23

mark

owen3379 发表于 2010-12-11 00:32:17

mark

wnstony 发表于 2011-1-27 18:09:15

mark

616718006 发表于 2011-1-29 10:46:17

mark

522yt 发表于 2011-3-22 21:55:05

学习了。。

yuan90826 发表于 2011-4-8 20:05:23

这程序定义的变量怎么跟一般的C语言不一样啊???看不懂???能不能给全部的程序啊??

dinosaur2011 发表于 2011-4-22 19:33:48

楼主 能发一下字库 和驱动吗 ?

heroling 发表于 2011-4-23 09:51:05

MARK

zcx2012 发表于 2011-4-23 15:16:04

mark5110

215661599 发表于 2011-8-4 20:29:52

batou 发表于 2011-8-4 20:44:51

佩服啊,学习了

dwfeifei 发表于 2011-9-6 10:38:48

很强大

fedora10 发表于 2012-2-22 10:31:16

mark

wenjin0386 发表于 2012-2-22 10:53:34

mark

dong889 发表于 2012-2-22 11:27:45

mark!

anguo 发表于 2012-2-22 11:35:22

mark

shamork 发表于 2012-3-11 13:00:58

mark

chenhua1991 发表于 2012-3-11 14:03:56

mark

jianjun42 发表于 2012-3-11 15:42:30

我用bascom语言用同样的方法实现了5110写四行汉字的应用http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3984751&bbs_page_no=1&search_mode=3&search_text=jianjun42&bbs_id=9999

ldj7501 发表于 2012-3-11 15:44:22

mark

majiansongok 发表于 2012-4-18 19:23:10

    牛人

shangdawei 发表于 2012-4-18 19:32:32

示意图很好

metalmadman 发表于 2012-4-24 08:43:36

LZ如何将汉字反白?

呆子 发表于 2012-5-8 08:42:11

厉害,这招很巧妙,受教了!

wmm20031015 发表于 2012-5-8 09:27:54

方法不错

hyghyg1234 发表于 2012-9-20 16:42:51

有空研究下

大道必成 发表于 2012-9-20 18:48:40

多谢楼主,好东东

kevin_me 发表于 2012-9-20 18:51:51

从未研究过这一块 先mark

草根工作室 发表于 2013-2-7 19:59:33

mark!{:lol:}

hamipeter 发表于 2013-2-8 01:27:19

支持下!!

hamipeter 发表于 2013-2-20 22:10:39

不错,赞一个

路鸣雨 发表于 2013-2-20 22:30:00

嗯{:biggrin:}

185724132 发表于 2013-2-20 22:31:23

学习了,谢谢

yiqingkongjian 发表于 2013-4-25 07:28:33

make
补丁

Lboyve 发表于 2013-4-25 17:34:43

佩服LZ{:smile:}

sgzzour 发表于 2013-4-25 18:12:25

多谢楼主分享。。。。。。。。

Rookie_huang 发表于 2013-10-9 19:43:32

嗯,不错,我也受教了。

305546594 发表于 2013-11-26 00:09:10

请问5110 显示四行汉字的字模是怎么取得

yhsy1002 发表于 2013-11-27 12:20:24

学习了,不错

知识阅览者 发表于 2015-11-30 08:23:30

哈哈,这个方案不错,已经搞定了,和楼主的方法差不错!

koenlee93 发表于 2015-12-8 21:24:32

可惜楼主已经不再论坛,程序是写的不错,我有几个问题想问你啊
页: [1]
查看完整版本: 诺基亚5110 四行汉字完整处理方案