使用ISO-MINI显示汉字,例程是将所有汉字做成二级汉字库,写入sd卡里。而我们在做项目时,使用的汉字不多,这种情况下,可以自己建一个汉字库,将汉字库写在头文件里,通过访问汉字的内码得到汉字的点阵信息,最后将汉字显示出来。我用C写了一个程序,在Code::Blocks里运行,能完整的打印出汉字,但是在keil里就不行了,已经很长时间了,一直没有解决该问题,请高手们帮我看看,问题出在哪里。
Code::Blocks里运行的代码:
typedef struct
{
unsigned char Index[2]; //汉字内码索引
unsigned char Msk[32]; //汉字点阵
/* data */
}typFont_GB16;
const typFont_GB16 ChnChar_16[]=
{
"这",
0x00,0x80,0x20,0x40,0x10,0x40,0x17,0xFC,0x00,0x10,0x02,0x10,0xF1,0x20,0x10,0xA0,
0x10,0x40,0x10,0xA0,0x11,0x10,0x12,0x08,0x14,0x08,0x28,0x00,0x47,0xFE,0x00,0x00,
"是",
0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x00,0x00,
0xFF,0xFE,0x01,0x00,0x11,0x00,0x11,0xF8,0x11,0x00,0x29,0x00,0x45,0x00,0x83,0xFE,
"一",
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"个",
...... //这里省略一些汉字
}
int main(void)
{
unsigned char page, column,k, *cn= "晶";
unsigned int temp;
for(k=0; k<13; k++)
{
if((ChnChar_16[k].Index[0] == cn[0]) && (ChnChar_16[k].Index[1] == cn[1]))
{
for(page=0; page<16; page++)
{
temp = ChnChar_16[k].Msk[page*2];
temp = (temp<<8);
temp += ChnChar_16[k].Msk[page*2+1];
for(column=0; column<16; column++)
{
if(temp & (0x8000>>column))
printf(&quot;*&quot;);
else
printf(&quot; &quot;);
} //一行完成
printf(&quot;\n&quot;);
}//一页完成
}
}
// getch();
return 0;
}
运行结果如图。
但是在keil里,汉字内码检测不能通过,始终进入不了while(1); 死循环
keil里使用的字库就是Code::Blocks里使用的字库
void LCD_DispChnChar(uint16_t x, uint16_t y, unsigned char CnChar[2], uint16_t color)
{
uint16_t page, column, temp, i;
uint8_t k;
LCD_OpenWindow(x, y, CHN_WIDTH, CHN_HEIGHT);
LCD_ILI9341_CMD(0x2C);
for(k=0; k<13; k++)
{
if((ChnChar_16[k].Index[0] == CnChar[0]) && (ChnChar_16[k].Index[1] == CnChar[1]))
while(1); ///////////如果内码与所要求的汉字一样,等待。。。。。。。
}
for(page=0; page < CHN_HEIGHT; page++)
{
/*取2个字节的数据,在lcd上是汉字的一行*/
// temp = pHanzi.Msk[page*2];
// temp = (temp<<8);
// temp |= pHanzi.Msk[page*2+1];
for(column=0; column < CHN_WIDTH; column++)
{
if(temp & (0x01<<15))
{
LCD_WR_Data(color);
}
else
{
LCD_WR_Data(BACKGROUND);
}
temp <<= 1;
}//一行写完
}//全部写完
} |