Board logo

标题: Printf重定向到LCD的两种方法 [打印本页]

作者: yuyang911220    时间: 2016-9-19 11:22     标题: Printf重定向到LCD的两种方法

根据原子的程序修改。
使用都需要包含头文件
#include <stdio.h>
#include <stdarg.h>

方法1:不支持坐标输入,起始默认坐标为0,0,类似于串口助手. 但满屏后自动清屏,从坐标(0,0)开始。

函数定义如下
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
static uint16_t x = 0, y = 0;
  if(ch == '\n')    //换行
  {
    x = 0;
    y += 16;
    return ch;
  }
  if(x > LCD_W - 8)  //LCD_W是宏定义, 该值为240
  {
    x = 0;           //x置零
    y += 16;         //y移至下一行
  }
  if(y > LCD_H - 16)  //LCD_H是宏定义, 该值是320
  {
  y=0;
  LCD_Clear(BLUE); //直接清屏 重头开始  
  }
  LCD_ShowChar(x, y, ch,16, 1); //打印字符ch
  x += 8;                   //跳转到下一个位置, 是否越界有上面函数判断
  return ch;
}
使用示例:
int main()
{
.........//此处省略一万字
LCD_Init();
POINT_COLOR=YELLOW;  //默认设置一种画笔色   
LCD_Clear(BLUE);//默认设置一个清屏颜色 与上面蓝色处一致
    while(1)
    {
    printf("printf:cnt=%d\nEnter\n",cnt);
    }
}
输出如下:
printf:cnt=1
Enter         
   

方法2:支持坐标自定义,定义如下
void LCD_printf(u16 x,u16 y,const char *format, ...)
{
  char tmp[25];
  va_list arg;
  va_start(arg, format);
  vsprintf(tmp,format,arg);
  va_end(arg);
  LCD_ShowString(x,y,(const u8*)tmp);
}
修改
原子程序的LCD_ShowString为:
void LCD_ShowString(u16 x,u16 y,const u8 *p)
{  
u16 x1;
x1=x;
    while(*p!='\0')
    {   
        if(x>MAX_CHAR_POSX){x=x1;}
        if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);}
    if(*p=='\n')
    {
     y+=16;
     x=x1;
    }
    else
    {
      LCD_ShowChar(x,y,*p,16,0);
      x+=8;
    }
        p++;
    }  
}
使用示例:
int main()
{
.........//此处省略一万字
LCD_Init();
POINT_COLOR=YELLOW;  //默认设置一种画笔色   
LCD_Clear(BLUE);//默认设置一个清屏颜色 与上面蓝色处一致
    while(1)
    {
    printf("LCD_printf:cnt=%d\nEnter\n",cnt);
    }
}
输出如下:
LCD_printf:cnt=1
Enter               





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0