诺基亚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,"师工");
} 不错 学习了! mark mark mark 学习了,独辟蹊径啊 这个要mark mark 非常不错,顶@ mark 为什么x方向上没有问题呢? 支持,这种方案速度很快! mark mark mark mark 学习了。。 这程序定义的变量怎么跟一般的C语言不一样啊???看不懂???能不能给全部的程序啊?? 楼主 能发一下字库 和驱动吗 ? MARK mark5110 佩服啊,学习了 很强大 mark mark mark! mark mark mark 我用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 mark 牛人 示意图很好 LZ如何将汉字反白? 厉害,这招很巧妙,受教了! 方法不错 有空研究下 多谢楼主,好东东 从未研究过这一块 先mark mark!{:lol:}
支持下!! 不错,赞一个 嗯{:biggrin:} 学习了,谢谢 make
补丁 佩服LZ{:smile:} 多谢楼主分享。。。。。。。。 嗯,不错,我也受教了。 请问5110 显示四行汉字的字模是怎么取得 学习了,不错 哈哈,这个方案不错,已经搞定了,和楼主的方法差不错! 可惜楼主已经不再论坛,程序是写的不错,我有几个问题想问你啊
页:
[1]