OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10612|回复: 11

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

[复制链接]

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2013-11-2 13:55:02 | 显示全部楼层 |阅读模式

 根据原子的程序修改。
使用都需要包含头文件
#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                

总结:
根据自己的需要添加汉字支持,只需要判断一下即可
在while(*p!=0)下面判断
if(*p<0x80)
{
...此处省略一万字
}
else
{
...此处省略一万字
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-11-2 13:59:44 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-11-2 14:29:26 | 显示全部楼层
不错,cool
回复 支持 反对

使用道具 举报

7

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2012-3-4
在线时间
69 小时
发表于 2013-11-4 20:03:52 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

高级会员

Rank: 4

积分
542
金钱
542
注册时间
2012-2-17
在线时间
121 小时
发表于 2013-11-4 20:42:31 | 显示全部楼层
感谢分享!
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-5-3
在线时间
4 小时
发表于 2014-5-15 23:40:59 | 显示全部楼层
留名标记   看起来不错哦
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-11-21 00:07:47 | 显示全部楼层
mark!好贴,最近正需要
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-5-16
在线时间
13 小时
发表于 2016-7-31 16:57:37 | 显示全部楼层
我想用ACD模块做一个电阻温度计,但就没法输出到LCD上去。想用printf来输出到LCD,好久都没有搞懂。
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-3-27
在线时间
104 小时
发表于 2016-7-31 18:20:11 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-11-26
在线时间
112 小时
发表于 2016-9-16 21:12:30 | 显示全部楼层
mark一下  以后用
回复 支持 反对

使用道具 举报

等邓 该用户已被删除
发表于 2017-4-8 18:45:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-4-6
在线时间
7 小时
发表于 2019-10-15 15:17:29 | 显示全部楼层

感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 19:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表