这两天在研读TFT彩屏的绘图和写字程序,flash,SD 卡这些都没学,所以教程中的写字程序SD卡 flash也没怎么看懂,也没有很好理解字库制作的程序,于是就想着自己用字摸软件弄几个汉字,输出对应数组,然后自己写个字摸扫描程序读取这些数组从而显示字体。
目前来说写个函数包能够单个的显示一个汉字,也就是比如能够扫描自己做的单个汉字的一维数组。但二维数组传值就弄不来,先看一维数组单个汉字
比如制作了个16*16字体 const unsigned char CH_WORD1[72]= {0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x03,0x80,0x1C,0x07,0x1F,0xFC,0x06,0x00,0x00,0x0C,0x00,0x00,0x19,0xC0,0x00, 0x31,0x80,0x00,0x03,0x80,0x0E,0x07,0x3F,0xF8,0x07,0x00,0xC0,0x0F,0x00,0xC0,0x1B,0x00,0xC0,0x33,0x00,0xC0,0x63,0x00,0xC0,
0x03,0x00,0xC0,0x03,0x00,0xC0,0x03,0x00,0xC0,0x03,0x00,0xC0,0x03,0x01,0xC0,0x03,0x0F,0xC0,0x03,0x03,0x80,0x00,0x00,0x00};
函数写成
//从左往右 从上往下扫描 横屏模式
void LCD_show_CH_WORD(u16 x,u16 y,u8 *CH,u8 size)
{
u8 i,j;
u8 temp;
u8 byt=size*size/8; //size 字体 16*16或12*12或24*24
u8 px; //像素点
byt=size*size/8;
for(j=0;j<size;j++) //一个字体的第 j 行
{
for(i=0;i<(size/8);i++) //一个字体第j行第 i 个字节
{
temp=*CH++; //导入单个汉字一维数组
for(px=0;px<8;px++) //一个字节第j行的第 i 个字节的px位
{
if(temp&0x80) LCD_DrawPoint(x+px+i*8,y+j); // 画点
temp<<=1; //高位先扫描
}
}
}
}
调用函数写为
LCD_show_CH_WORD(160, 160, (u8*)CH_WORD1, 24);
这个就显示一个24*24的汉字,调用一个一维数组 显示没问题。 但我现在想连续显示汉字字符串,也就是调用一个制作好的二维数组,每一维代表一个汉字,也写成一个函数包,形参里写入这个二维数组,问题就在于这个形参我写不好,就算写好了,这个形参在程序里我也不知如何用。网上也学了些C代码将讲解2维数组形参传值的例子,但始终用不好。 二维数组每一维代表一个汉字,
比如我现在要调用这个二维数组显示汉字串
unsigned char String_CH1[4][72]= {
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x03,0x80,0x1C,0x07,0x1F,0xFC,0x06,0x00,0x00,0x0C,0x00,0x00,0x19,0xC0,0x00,
0x31,0x80,0x00,0x03,0x80,0x0E,0x07,0x3F,0xF8,0x07,0x00,0xC0,0x0F,0x00,0xC0,0x1B,0x00,0xC0,0x33,0x00,0xC0,0x63,0x00,0xC0,
0x03,0x00,0xC0,0x03,0x00,0xC0,0x03,0x00,0xC0,0x03,0x00,0xC0,0x03,0x01,0xC0,0x03,0x0F,0xC0,0x03,0x03,0x80,0x00,0x00,0x00},
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x1C,0x03,0xFF,0xFC,0x03,0x00,0x1C,0x03,0x00,0x1C,0x03,0x00,0x1C,
0x03,0x00,0x1C,0x03,0xFF,0xFC,0x03,0x00,0x1C,0x03,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x07,0x00,0x00,
0x07,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x18,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00},
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x70,0x07,0xFF,0xC0,0x00,0x1C,0x00,
0x00,0x1C,0x00,0x00,0x1C,0x0C,0x3F,0xFF,0xFE,0x00,0x1C,0x00,0x03,0x1C,0x00,0x03,0x9C,0x00,0x03,0x1C,0x30,0x07,0x1F,0xF8,
0x07,0x1C,0x00,0x07,0x9C,0x00,0x06,0xDC,0x00,0x0C,0x7C,0x00,0x1C,0x3E,0x00,0x18,0x0F,0xFE,0x30,0x00,0x3C,0x00,0x00,0x00},
{ 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x18,0x1C,0x0C,0x1F,0xFF,0xFC,0x1C,0x18,0x1C,0x1C,0x38,0x1C,
0x1C,0x3F,0x1C,0x1C,0x73,0xDC,0x1C,0xF9,0xDC,0x1D,0x9C,0xDC,0x1F,0x18,0x1C,0x1C,0x38,0x1C,0x1C,0x3E,0x1C,0x1C,0x73,0x9C,
0x1C,0xE1,0xDC,0x1D,0xC1,0xDC,0x1F,0x00,0xDC,0x1E,0x00,0x1C,0x1C,0x01,0xFC,0x1C,0x00,0x3C,0x18,0x00,0x30,0x00,0x00,0x00}
};
我目前把函数写成
void LCD_show_CH_STRING(u16 x, u16 y, u8 *CH, u8 num, u8 size)
{
u8 j,i,n;
u8 byte;
u8 temp;
u8 Index=0;
u8 px;
u8 *P1[4];
byte=size*size/8;
for(n=0;n<num;n++) //写第n个汉字
{ // P1[n]=CH[n];
for(j=0;j<size;j++) //第 J 行
{
for(i=0;i<(size/8);i++) //第 i 个字节
{
// temp=*((CH[n])+i);
// temp=CH[n];
for(px=0;px<8;px++) //第 px 个像素
{
delay_ms(1);
if(temp&0x80) LCD_DrawPoint(x+px+i*8+n*size,y+j); // 画点
temp<<=1;
}
}
}
}
}
调用函数我写成
LCD_show_CH_STRING(160, 160, (u8*)String_CH1, 4, 24);
上面注释掉的部分有错误,我参考网上的一些写法,但问题还是觉得形参这里调用二维数组有问题,或者调进函数后这个二维数组如何操作有问题。
我非常希望能在上面那个模板的情况下成功,但无能为力,编译报错,显示不出,等一系列问题。
我现在唯一能调用上面那个二维数组 连续写汉字的 办法就是
for(j=0;j<num;j++) //num是汉字个数
{
LCD_show_CH_WORD(x+Index,y,(u8*)String_CH1[j],size); // 调用单个汉字一维数组的函数包。
Index=Index+size+12; // Index可控制间距
}
但这样我写成一个函数包的话 形参 是没发直接写上一个二维数组的名字, 如果我要调用不同的二维数组汉字串的话,我得不停修改 函数里面的 二维数组名字,这不是我想要的。
这里有哪位专家能指点我一下,这个而维数组怎么才能很好的传递到形参里然后 在函数内部怎么写,才能顺利扫描每一个二维数组元素呢?谢谢家!!!
|