汉字索引的问题
typedef struct typFNT_GB16 // 汉字字模数据结构{
signed char Index; // 汉字内码索引
char Msk; // 点阵码数据
};
/////////////////////////////////////////////////////////////////////////
// 汉字字模表 //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 //
/////////////////////////////////////////////////////////////////////////
struct typFNT_GB16 code GB_16[] = // 数据表
{
"爱", 0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,
0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,
0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,
0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,
"你", 0x11,0x00,0x11,0x00,0x11,0x00,0x23,0xFC,
0x22,0x04,0x64,0x08,0xA8,0x40,0x20,0x40,
0x21,0x50,0x21,0x48,0x22,0x4C,0x24,0x44,
0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80
};
void dprintf(uchar col,uchar layer,uchar *ptr)//ASCII的汉字混合显示程序
{
uchar c1,c2;
uchar i,j,k;
uchar ulen;
uchar ucol,ulayer;
ulen=0;
ucol=col;
ulayer=layer;
i=0;
while(ptr!='\0') ulen++;//判断字符串的长度
while(i<ulen)
{
c1=ptr;
c2=ptr;
if(c1<=128)//字符和汉字的分界线
{
显示字符的没问题
i++;
}
else
{
for(j=0;j<255;j++)
{
if((c1==GB_16.Index)&&(c2==GB_16.Index))//索引汉字.....这里查找汉字什么就是找不到?
{这里显示汉字什}
}
ucol+=16;
i+=2;
}
}
}
主函数调用dprintf(1,1,“爱你”)时查找不到汉字、还有索引用c1=ptr和第个字,c2=ptr;算是第二个字了,我有点搞不明白,
一个汉字是有两个内码,但什么把它分出来啊、各位大虾懂的和小弟说说啊?
在线等我哦,搞了几天搞不下啊、帮帮忙啊 signed char Index; // 汉字内码索引
===>
unsigned char Index; // 汉字内码索引 本帖最后由 shangdawei 于 2012-5-8 09:47 编辑
>> 一个汉字是有两个内码,但什么把它分出来啊
不想分开, 可以试试这个
typedef struct _typFNT_GB16 // 汉字字模数据结构
{
unsigned short Index; // 汉字内码索引
char Msk; // 点阵码数据
} typFNT_GB16;
typFNT_GB16 GB_16[] = // 数据表
{
'爱',// 0xB0AE
0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,
0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,
0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,
0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,
'你', // 0xC4E3
0x11,0x00,0x11,0x00,0x11,0x00,0x23,0xFC,
0x22,0x04,0x64,0x08,0xA8,0x40,0x20,0x40,
0x21,0x50,0x21,0x48,0x22,0x4C,0x24,0x44,
0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80
};
if( (c1*256+c2) ==GB_16.Index )
{
}
shangdawei 发表于 2012-5-8 09:46 static/image/common/back.gif
>> 一个汉字是有两个内码,但什么把它分出来啊
不想分开, 可以试试这个
谢谢大哥啊、 还有啊,大虾,我在网上看到c1=ptr和第个字,c2=ptr;这算是第二个字了,什么会是一个汉字内码啊。我有点搞不明白,
希望能解答一下哦 可以查询那个汉子码 hxlwb 发表于 2012-5-8 11:38 static/image/common/back.gif
可以查询那个汉子码
c2=prt这个不就是字符串的第二个字符了吗、什么会是第一个字的第二个内码啊???? 什么都没有人回答了哦、{:cry:}。我又看到有的用c1=ptr;c2=ptr;就是查两个字吗、
有可能是一句子,什么只查第一个和第二个就可以知道后面汉字的内码了吗?{:cry:}
没人能解答一下啊~~~ tanguicaicai 发表于 2012-5-9 17:22 static/image/common/back.gif
没人能解答一下啊~~~
提示你你一下
char是8bit的,汉字索引是16位的 我和你在研究同一个问题,好几天了,也调不来显示 总是显示乱码 // ------------------汉字字模的数据结构定义 ------------------------ //
flash structtypFNT_GB16 // 汉字字模数据结构
{
unsigned charIndex; // 汉字内码索引
unsigned char Msk; // 点阵码数据
};
/////////////////////////////////////////////////////////////////////////
// 汉字字模表 //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 //
/////////////////////////////////////////////////////////////////////////
structtypFNT_GB16 flash codeGB_16 = // 数据表
{//这个 可能是 传说中的 结构体 数组
/*--文字:一--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16 --*/
"主",0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 主程序里调用的这一句:
OLED_PutString(0x1c,0,"科技");delay_ms(8000);
其中0x1c ,0 是要显示的字的座标,这座标没有问题。 void OLED_PutString(unsigned int x, unsigned int y,unsigned char flash *s)
{
unsigned int l=0;
while(*s) {
if( *s < 0x80)
{
OLED_PutChar(x+l*2,y,*s);
s++;l++;
}
else
{
PutGB1616(x+l*2,y,(unsigned char *)s);
s+=2;l+=2;
}
}
} void PutGB1616(unsigned int x, unsigned int y, unsigned char c)
{
unsigned int i,j,k;
OLED_SetPos(x,x+4-1,y, y+16-1);
for (k=0;k<64;k++)
{ //64标示自建汉字库中的个数,循环查询内码
if ((codeGB_16.Index==c)&&(codeGB_16.Index==c))
{
//unsigned int m = codeGB_16.Msk;
for(i=0;i<32;i++)
{ //16*16=256点32*8=256
unsigned char m = codeGB_16.Msk;
unsigned char m2;
m2=m&0b11000000;
send_2bit(m2);
//send_2bit(0x00);
m2=m&0x30;
m2<<=2;
send_2bit(m2);
//send_2bit(0xff);
m2=m&0x0c;
m2<<=4;
send_2bit(m2);
//send_2bit(0x00);
m2=m&0x03;
m2<<=6;
send_2bit(m2);
//send_2bit(0xff);
}
}
}
} 一个汉字两个字节..如果是汉字,在计算机里面就是两个字节的内码...你可以KEIL软仿调试的。。可以看见汉字内码在内存的如何存放的。。。然后再用一个简单的汉字内码查看器,看看是不是对上了。。计算机都是一个一个字节的存放的。。不管是什么东西。。。所以汉字是是两个字节,那么ptr就是汉字的第一个内码字节,ptr就是以起始地址偏移1个字节,就是汉字的第二个内码字节。。如果是ASCII码,那么才是你说的第二个字符,因为ASCII是在内存中只占一个字节的。。。 http://www.ourdev.cn/thread-4099591-1-1.html看我的回复。。。楼主。。。 myqiang1990 发表于 2012-5-9 18:12 static/image/common/back.gif
http://www.ourdev.cn/thread-4099591-1-1.html看我的回复。。。楼主。。。
为什么有些signed char Index; 是3,有些是2呢?
我觉得应该是2,可是改成2 .编译不通过,报错 我觉得我的程序,就是在数组里面 寻找汉字内码时,对应错误
我有两个问题搞不懂
1 是 为什么有些signed char Index; 是3
2 是 if( *s < 0x80)
{
OLED_PutChar(x+l*2,y,*s);
s++;l++;
}
else
{
PutGB1616(x+l*2,y,(unsigned char *)s);
s+=2;l+=2;
}
上面这句,里面有个(unsigned char *)s,搞不懂这是什么意思 zhwm3064 发表于 2012-5-9 18:57 static/image/common/back.gif
我觉得我的程序,就是在数组里面 寻找汉字内码时,对应错误
我有两个问题搞不懂
把报错的信息发来看看 myqiang1990 发表于 2012-5-9 19:49 static/image/common/back.gif
把报错的信息发来看看
Error:H\shengju\手持机程序\初步显示\GB1616.h(16).included from:初步.c:too many inintializers 我的程序是引用了别人在Keil上的程序,他的程序是用于LCD显示的,
我把程序改了下,用在CVAVR上,另外是用在OLED显示上,现在显示是没问题,因为我在上面的程序上改了下试验,可以显示正常。(改成后面那句就可以显示了send_2bit(m2); //send_2bit(0xff);)
这正明,就是,汉字内码引用时没有 对上号 为什么有些signed char Index; 是3,有些是2呢?
我自己回答:这是因这汉字内码 在后面自动加上一个0*/ zhwm3064 发表于 2012-5-9 17:46 static/image/common/back.gif
// ------------------汉字字模的数据结构定义 ------------------------ //
flash structtypFNT_GB16...
你的汉字内码什么有3个啊,我的能显示了,还有你那前面用的
flash有什么不同啊 zhwm3064 发表于 2012-5-10 05:47 static/image/common/back.gif
为什么有些signed char Index; 是3,有些是2呢?
我自己回答:这是因这汉字内码 在后面自动加上一个0*/ ...
不是一个汉字只有两个码吗、什么有3个
】 myqiang1990 发表于 2012-5-9 18:05 static/image/common/back.gif
一个汉字两个字节..如果是汉字,在计算机里面就是两个字节的内码...你可以KEIL软仿调试的。。可以看见汉字 ...
听君一言,胜读10年书啊。
谢谢··受教了。 myqiang1990 发表于 2012-5-9 18:12 static/image/common/back.gif
http://www.ourdev.cn/thread-4099591-1-1.html看我的回复。。。楼主。。。
大虾还有点不明白的地方就是以c1=dp;c2=dp;这只 能查输入一串汉字的第一个字的内码啊。后面的
又什么查·如果是这样uchar i;一个变量,c1=dp;c2=dp;当写完一个字时i++;这我能理解, tanguicaicai 发表于 2012-5-10 08:58 static/image/common/back.gif
你的汉字内码什么有3个啊,我的能显示了,还有你那前面用的
flash有什么不同啊 ...
可能是编译器不同造成的,在Keil中,可能是两字节
我用的是CVAVR,取两字节会报错,只好用三字节了。是因为在生成的两字节编码的后边。又自动添加了一个0.休止符 tanguicaicai 发表于 2012-5-10 08:58 static/image/common/back.gif
你的汉字内码什么有3个啊,我的能显示了,还有你那前面用的
flash有什么不同啊 ...
我前面用的flash,我不是太清楚了,我想可能是定义 这些数字 存在flash存储器中吧 昨晚回去搞了一下,出现了一个很怪得现象哦,哪位大虾了解的说一下哦、
display_st1(x,y,*dp,uchar mode);这个函数 是可以写入汉字和字符的(也就调用上面的字模来)
写入一个变量时像uchar c1=4;display_st1(1,1,c1,0);时它显示出现乱码哦display_st1(1,1,“145”,0);它又可以哦 大家就没有遇到这种情况吗?
display_st1(uchar x,uchar y,uchar *dp,uchar mode); 大家就没有遇到这种情况吗?
display_st1(uchar x,uchar y,uchar *dp,uchar mode);
写入一个变量就不能正常的显示,固定显示又可以哦,我
搞不清为什么哦,display_st1(1,1,“145”,0);这样又可以,uchar c1=3;
display_st1(1,1,c1,0);当我在前面设定c1=3;时,它又不能
正常显示,郁闷啊 是不是我问这个问题很菜没人回哦 木有人回咱了,我改个一个法子让它显示0~9,
void display_shuzi(uchar x, uchar y,uchar a,uchar inverse) 这个是显示数字和变量的
{ uchar k,j;
for(k=0;k<255;k++)
{ if((a+0x30)>0x39)break;
if((a+0x30)== ASC_12.Index )
{ lcd_address(x,y);
for(j=0;j<6;j++)
{ if(inverse)lcd_data(~ASC_12.Msk);
else lcd_data(ASC_12.Msk);}
lcd_address(++x,y);
for(j=6;j<12;j++)
{ if(inverse)lcd_data(~ASC_12.Msk);
else lcd_data(ASC_12.Msk);}
break;}}
}
void display_st1(uchar x,uchar y,uchar *dp,uchar inverse)
{ uchar c1,c2;
// uint c;
uchar i,j,k,ulen,upage,ucol;
upage=x;
ucol=y;
while ( (uchar)dp != '\0' ){ulen++;};
i=0;
while(i<ulen)
{c1=dp;
c2=dp;
if(c1<128)
{for(k=0;k<255;k++)
{ if(c1== ASC_12.Index ) break;}
// if(ucol>128){ucol=1,upage++;}
lcd_address(upage,ucol);
for(j=0;j<6;j++)
{ if(inverse)lcd_data(~ASC_12.Msk);
else lcd_data(ASC_12.Msk);}
lcd_address(++upage,ucol);
for(j=6;j<12;j++)
{ if(inverse)lcd_data(~ASC_12.Msk);
else lcd_data(ASC_12.Msk);}
upage--;
ucol=ucol+7;
i++; }
else { for(k=0;k<40;k++)
{if((c1 == GB_12.Index)&&(c2 == GB_12.Index))
break;}
lcd_address(upage,ucol);
for(j=0;j<12;j++)
{ if(inverse)lcd_data(~GB_12.Msk);
else lcd_data(GB_12.Msk);}
lcd_address(++upage,ucol);
for(j=12;j<24;j++)
{ if(inverse)lcd_data(~GB_12.Msk);
else lcd_data(GB_12.Msk);}
upage--;
ucol=ucol+12;i=i+2;}
}}
路过,学习了 路过,看一下~{:smile:}
页:
[1]