Printf重定向到LCD的两种方法...

2019-08-22 15:23发布

 根据原子的程序修改。
使用都需要包含头文件
#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 == ' ')    //换行
  {
    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;  //默认设置一种画笔 {MOD}    
LCD_Clear(BLUE);//默认设置一个清屏颜 {MOD} 与上面蓝 {MOD}处一致
    while(1)
    {
    printf("printf:cnt=%d Enter ",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!='')
    {            if(x>MAX_CHAR_POSX){x=x1;}
        if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);}
    if(*p==' ')
    {
     y+=16;
     x=x1;
    }
    else
    {
      LCD_ShowChar(x,y,*p,16,0);
      x+=8;
    }
        p++;     } 
}
使用示例:
int main()
{
.........//此处省略一万字
LCD_Init();
POINT_COLOR=YELLOW;  //默认设置一种画笔 {MOD}    
LCD_Clear(BLUE);//默认设置一个清屏颜 {MOD} 与上面蓝 {MOD}处一致
    while(1)
    {
    printf("LCD_printf:cnt=%d Enter ",cnt);
    }
}
输出如下:
LCD_printf:cnt=1
Enter                

总结:
根据自己的需要添加汉字支持,只需要判断一下即可
在while(*p!=0)下面判断
if(*p<0x80)
{
...此处省略一万字
}
else
{
...此处省略一万字
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。