我的是战舰开发板stm32f103,屏幕是320*480的,正点原子提供的驱动显示函数如下:
//显示字符串
//x,y:起点坐标
//width,height:区域大小
//size:字体大小
//*p:字符串起始地址
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
//显示数字,高位为0,则不显示
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
这两个函数实际并不好用,因为,显示字符串以像素为显示坐标,显得很难把控;显示数字时候还得给出数字长度,也显得不智能。
我改进后的函数对应如下,支持自动翻页等,非常易于使用:
/* 默认24号字体,即12*24的字体,320*480的屏幕,每行最多可显示26个字符,最多显示20行,
会自动换行,超出屏幕才会无法显示,所以很好用
columnIndex:0-12
rowIndex:0-19
*/
void LCDshowString_my(int columnIndex,int rowIndex,unsigned char* str)
{
int i=0;
int a,b,c;
int maxColumn;
int maxRow;
int sizeFont = 24; //这里可以自己设置默认字体大小
maxColumn = lcddev.width/(sizeFont/2);
maxRow = lcddev.height/sizeFont;
while( (*str)!='\0' )
{
a=i+columnIndex; //第几个字符了
b=a%maxColumn*sizeFont/2; //这里面好像是字体24,实际上仅仅占12的宽度罢了,即24的字体是12*24的,并不是正方形
c=rowIndex*sizeFont + a/maxColumn*sizeFont;
LCD_ShowChar(b, c,*str,sizeFont,0);
str++;
i++;
}
}
/* 默认24*24号字体,320*480的屏幕,每行最多可显示26个数字,最多显示20行
最大显示10个数字
*/
void LCDshowNum_my(int columnIndex,int rowIndex,unsigned int num)
{
char str[10];
sprintf(str,"%d",num);
LCDshowString_my(columnIndex,rowIndex,str);
}
/* 默认24*24号字体,320*480的屏幕,每行最多可显示26个数字,最多显示20行
打印会显示出本次打印序号,内容,示例:
0->hello world
1->nihao
2->haha
每次打印都是从新的一行开始打印的,打印完一个屏幕会循环从头继续打印
把屏幕包装成一个简单版只能打印字符串的串口打印方式,这个函数配合sprintf函数,是最方便使用的,调试利器
*/
void LCDprintf(unsigned char* str)
{
static int nLine = 0;
static int allLine = 0;
char strAllLine[3];
int n = 0;
int sizeFont = 24; //这里可以自己设置默认字体大小
int maxColumn = lcddev.width/(sizeFont/2);
int maxRow = lcddev.height/sizeFont;
unsigned char* p = str;
while(*p != '\0')
{
n++;
p++;
}
sprintf(strAllLine,"%d",allLine);
n += 2;
LCDshowString_my(nLine,0,strAllLine); //打印序号
LCDshowString_my(nLine,2,"->"); //打印指示箭头
n += 2;
LCDshowString_my(nLine,4,str); //打印内容
nLine += n/maxColumn + 1;
nLine %= maxRow; //使得屏幕循环打印显示
allLine += 1;
allLine %= 100; //打印序号只能0-99循环
}