新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2015-1-30
- 在线时间
- 0 小时
|
5金钱
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;
u16 colortemp=POINT_COLOR;
//设置窗口
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
for(t=0;t<size;t++)
{
if(size==12)temp=asc2_1206[num][t]; //调用1206字体
else temp=asc2_1608[num][t]; //调用1608字体
for(t1=0;t1<8;t1++)
{
if(temp&0x80)POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
temp<<=1;
y++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
}
}else//叠加方式
{
for(t=0;t<size;t++)
{
if(size==12)temp=asc2_1206[num][t]; //调用1206字体
else temp=asc2_1608[num][t]; //调用1608字体
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_DrawPoint(x,y);
temp<<=1;
y++;
if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
}
}
POINT_COLOR=colortemp;
}
这个函数的作用是在LCD指定的位置显示一个字符,各参数的含义在最顶端均作了相关解释。
对于for(t1=0;t1<8;t1++)这一句刚开始不知道8是怎么来的,后来勉强理解为是因为temp这个参数是8位的,但是对temp这个参数的作用不是很了解。以下是我自己的一点猜测,不知道正确与否,请各位好心人解答。
1、函数最外层循环是size,而size代表的是字体的大小,根据《STM32开发指南》上的介绍12号字体占用的屏幕像素点的大小为12*6(英文字符),16号字体占用的屏幕像素点的大小为16*8(英文字符)。于是猜测字号大小为size的英文字符占用的像素点的行数为size行,所以猜测最外层for循环为单个字符显示的行循环控制层,又因为字符宽度为size/2,于是认为控制字符显示时,还应有列循环,如此才能通过设置在size*size/2的像素点区域内显示一个完整的字符。恰好外层循环里还有一层for循环:for(t1=0;ti<8;ti++),于是猜测这应该是控制列循环的语句,恰好temp参数在这层循环参与了运算,所以猜测temp应该与列有关,但是列循环的循环次数应该是size/2才对,但是我试了一下发现不对,证明我的想法是错的!那么temp就是是什么?其作用又是什么?
2、程序里面又这么一句代码:if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了,还有这么一句代码:if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了,我认为第一句代码打错了应该是:if(x>=lcddev.height){POINT_COLOR=colortemp;return;}才对,不是各位怎么看?
3、最后几句代码:POINT_COLOR=colortemp; 不知其作用是什么,感觉要不要都无所谓,而且我其将其屏蔽后程序也能正常运行,请各路大神解惑!
|
最佳答案
查看完整内容[请看2#楼]
1,temp就是一个临时变量,用于将字符点阵依次输出给LCD的像素点。字符取模方式是:从上到下,从左到右,所以每个字符点阵库的第一个字节,都是最高位是字符最左上角的点(设为:x,y),那么次高位就是(x,y+1),依次循环,直到完成一列输出。然后x+1.继续循环。
2,你可以改成这样。
3,就是恢复POINT_COLOR的颜色。你可以去掉试试,就知道要不要的效果了。
|