|
首先要谢谢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编辑过 |
|