基于STM32,简单几步在LCD屏幕上实现 printf 打印函数。。。
stm32吧
全部回复
仅看楼主
level 10
pengzhenxx 楼主
大家学C语言时都用过 printf,printf很方便,很灵活,打印出一组完全不同的数据或字符串,很简单。
,
但在STM32学习时,楼主经常用到printf调试程序,但这是打印到串口的。也会在LCD上显示一些变量,传统的方法要么调用sprintf进行格式化,要么字符串+变量,分开输出,碰到浮点数格式化又比较麻烦,编程比较麻烦,而且很不灵活。于是楼主想有没有在屏幕上直接使用printf打印出多好,源码中并没有提供这样的函数,所以得自己封装了。。。
,
先来看传统C语言的printf函数,,它其实是调用了vprintf函数的,不过printf有个参数是 “...”,代表一个或很多个参数,这是C语言中的一个比较高级的技巧。。。
楼主自己写的my_printf函数也是可以实现完全一样的功能。。。
2017年01月06日 11点01分 1
level 10
pengzhenxx 楼主
2017年01月06日 11点01分 2
level 10
pengzhenxx 楼主
其实很简单,C语言中有个结构体,是专门处理 “...” 这个参数的,在stdarg.h头文件中,所以这样写,就能对多个不同的变量进行格式化,并输出到屏幕
#include <stdio.h>
#include <stdarg.h>
void my_printf(char *str, ...)
{
va_list pArgs; //处理后面的三个点
va_start(pArgs, str);
vprintf(str,pArgs);
va_end(pArgs);
}
void main()
{
float i = 3.14592;
int x = 100;
char y = 'A';
char s[] = "abcd!";
printf("定义了:i = %f x = %d y = %c s = %s\n",i,x,y,s);
my_printf("定义了:i = %f x = %d y = %c s = %s\n",i,x,y,s);
}
2017年01月06日 12点01分 3
level 10
pengzhenxx 楼主
同理,STM32中也可以这样处理,,下面代码是基于正点原子的基础函数封装的
,
//在x,y处显示字符串
//size = 字体大小。
//str = 格式:类似于printf中的格式
//... 就是printf最后面的参数,可以是很多
void LCD_Printf(u16 x, u16 y, u8 size, char *str, ...)
{
u16 tempx = x;
va_list pArgs; //处理后面的三个点
char *p;
p = mymalloc(SRAMIN,6*32); //申请内存,p存放申请后的首地址
va_start(pArgs, str);
vsnprintf(p,6*32,str,pArgs); //格式化成字符串,处理 ... 多参数,一定要用v printf
va_end(pArgs);
while(x <= lcddev.width) //清除显示区域
{
LCD_ShowChar(x,y,' ',size,0);
x = x + size/2;
}
x = tempx;
while(x <= lcddev.width && (*p) != 0) //显示格式化后的字符串
{
LCD_ShowChar(x,y,*p,size,1);
x = x + size/2;
p++;
}
myfree(SRAMIN,p); //释放申请的内存,不释放会造成内存泄漏,要避免
}
2017年01月06日 12点01分 5
level 10
pengzhenxx 楼主
LCD_Printf(2,2,24,"LCD Height:%d LCD Width:%d",lcddev.height,lcddev.width);
在屏幕的2,2坐标开始显示大小是24的字符串,并显示出屏幕的长和高。
,
格式化浮点数也是很方便的
2017年01月06日 12点01分 6
level 10
pengzhenxx 楼主
2017年01月06日 12点01分 8
level 9
谢谢楼主分享
2017年01月06日 17点01分 9
有些很简单,但不一定想得到。你有什么好的思路呢?
2017年01月07日 02点01分
level 15
为啥要搞那么复杂?直接重定义标准库的putchar()指向为LCD打印设备,就可以直接用标准printf()显示到LCD啦[滑稽]
2017年01月07日 05点01分 10
printf是打印到串口的,我可不想串口又不能用了
2017年01月07日 05点01分
而且那样处理更加复杂了
2017年01月07日 05点01分
@pengzhenxx 回复 pengzhenxx :可以用函数指针动态绑定,要用那个就切换一下,C语言就是要讲究灵活,别做别人已经完成的重复动作[滑稽]
2017年01月07日 05点01分
回复 我不是阿L :你不觉得这样编程很复杂吗?你要像这样想,C语言的任何一个函数都别调用了,那都是别人做过的...我这样写,不仅可以做printf也可以做其他函数的,这只是个编程思想而已
2017年01月07日 05点01分
level 11
是的
2017年01月07日 11点01分 11
level 1
2020年06月13日 12点06分 12
level 1
这么多错误怎么办
2020年06月13日 12点06分 13
1