打印
[GUI]

LCD屏幕上实现 printf 打印函数

[复制链接]
2889|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2022-12-6 22:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//在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); //释放申请的内存,不释放会造成内存泄漏,要避免
}


使用特权

评论回复
沙发
51xlf|  楼主 | 2022-12-6 22:53 | 只看该作者
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
#define CMD_BUFFER_LEN 200
void lcdprintf (u16 x,u16 y,char *fmt, ...)
{
    char buffer[CMD_BUFFER_LEN+1]; // CMD_BUFFER_LEN自己定义
    u8 i = 0;
    va_list arg_ptr;
    va_start(arg_ptr, fmt);
    vsnprintf(buffer, CMD_BUFFER_LEN+1, fmt,arg_ptr);
    while ((i < CMD_BUFFER_LEN) && buffer[i])
    {
        LCD_ShowChar(x+=8,y,buffer[i++],16,0);   
    }
    va_end(arg_ptr);
}


使用特权

评论回复
板凳
MessageRing| | 2022-12-7 16:10 | 只看该作者
这个可不可以用keil提供的微库?

使用特权

评论回复
地板
10299823| | 2024-6-5 11:11 | 只看该作者
int fputc(int ch, FILE *f)
{
    // 这里应该是将字符ch发送到LCD显示的代码
    // 例如,如果你有一个名为LCD_PutChar的函数,可以这样调用:
    LCD_PutChar(ch);
    return ch;
}

使用特权

评论回复
5
uptown| | 2024-6-5 12:31 | 只看该作者
编写一个类似于标准C库中printf函数的函数,用于在LCD屏幕上显示格式化的字符串。这个函数需要解析格式化字符串,并调用字符显示函数将字符逐个显示在LCD屏幕上。

使用特权

评论回复
6
phoenixwhite| | 2024-6-5 14:36 | 只看该作者
printf 函数通常将输出发送到标准输出

使用特权

评论回复
7
juliestephen| | 2024-6-5 20:32 | 只看该作者

void LCD_Printf(uint8_t x, uint8_t y, const char *format, ...) {
    char buffer[128]; // 用于存储格式化字符串的缓冲区
    va_list args; // 用于处理可变参数的变量

    // 解析格式化字符串,将结果存储在缓冲区中
    va_start(args, format);
    vsnprintf(buffer, sizeof(buffer), format, args);
    va_end(args);

    // 设置LCD屏幕的光标位置
    LCD_SetCursor(x, y);

    // 逐个显示缓冲区中的字符
    for (int i = 0; buffer[i] != '\0'; i++) {
        LCD_WriteChar(buffer[i]);
    }
}

使用特权

评论回复
8
lzbf| | 2024-6-7 08:05 | 只看该作者
设计一个适配层函数,该函数接受一个格式字符串和一个参数列表,类似于C标准库中的printf函数。在这个函数内部,解析格式字符串,调用之前的画字符函数逐字符地将内容绘制到LCD上。

使用特权

评论回复
9
houjiakai| | 2024-6-7 12:35 | 只看该作者
在实现了fputc函数之后,你可以通过重定向stdout到fputc来实现printf函数的输出重定向。这样,当你调用printf函数时,它将通过你实现的fputc函数将输出显示在LCD屏幕上。

使用特权

评论回复
10
sdlls| | 2024-6-7 18:03 | 只看该作者
大多数LCD厂商或第三方开发者会提供相应的驱动库来简化开发过程。这些库通常包括了初始化LCD、画点、画线、显示字符等基本功能。

使用特权

评论回复
11
maqianqu| | 2024-6-8 12:01 | 只看该作者
重定向标准输出(stdout)到 LCD 显示器。

使用特权

评论回复
12
deliahouse887| | 2024-6-8 17:58 | 只看该作者
基于LCD驱动库,实现基本的画点函数,然后利用字符库中的点阵数据,编写函数将每个字符绘制到LCD上。

使用特权

评论回复
13
uytyu| | 2024-6-9 14:18 | 只看该作者
如果LCD的刷新率不高或者处理器性能有限,可能需要优化打印函数的效率。例如,通过减少不必要的屏幕刷新,或者优化字符串解析过程,提高打印速度。

使用特权

评论回复
14
hearstnorman323| | 2024-6-10 17:15 | 只看该作者
#include <stdio.h>

// 假设LCD_WriteChar是用于向LCD写入单个字符的函数
extern void LCD_WriteChar(char c);

// 重写fputc函数,将字符输出到LCD
int fputc(int ch, FILE *f) {
    LCD_WriteChar((char)ch);  // 将字符写入LCD
    return ch;  // 返回写入的字符
}

// 主函数或其他位置调用printf,输出将显示在LCD上
int main() {
    // 初始化LCD屏幕
    LCD_Init();

    // 使用printf输出到LCD
    printf("Hello, LCD!\n");

    // 其他代码...

    return 0;
}

使用特权

评论回复
15
gouguoccc| | 2024-6-10 17:36 | 只看该作者
其实就是把printf的实现接口改为LCD的写接口函数。

使用特权

评论回复
16
everyrobin| | 2024-6-11 14:25 | 只看该作者
在C语言中,您可以使用标准的printf函数,但是它不直接支持在LCD上打印。因此,您需要自己实现一个printf函数,它将格式化的字符串转换为可以由LCD驱动程序处理的数据。

使用特权

评论回复
17
pl202| | 2024-6-11 18:09 | 只看该作者
实现了自定义输出函数,你就可以像平常一样使用 printf 函数了。任何发送到 printf 的文本都将被重定向到你的 LCD 显示器。

使用特权

评论回复
18
mollylawrence| | 2024-6-11 22:13 | 只看该作者
由于printf函数依赖于fputc函数来输出字符,你需要重新实现fputc函数,使其能够将字符发送到LCD屏幕上。这通常涉及到将字符转换为LCD可以显示的形式,并将其写入LCD的显存中。

使用特权

评论回复
19
daichaodai| | 2024-6-12 07:55 | 只看该作者
把printf函数的字符输出函数改为LCD的写函数就可以了

使用特权

评论回复
20
uytyu| | 2024-6-12 14:16 | 只看该作者
需要一个完整的LCD驱动程序,该程序能够初始化LCD、设置光标位置,并实现类似LCD_PutChar这样的函数来在指定位置显示字符。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

535

主题

9633

帖子

23

粉丝