我的是战舰开发板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循环

}