打印
[应用方案]

SC92F732x系列printf函数构造

[复制链接]
927|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robertesth|  楼主 | 2023-10-15 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include "H/Function_Init.H" 
#include "stdio.h"
bit UartSendFlag = 0; //发送中断标志位
bit UartReceiveFlag = 0; //接收中断标志位

char putchar(char c)//重定向
{
        UartSendBit(c);
        return c;
}



/*****************************************************
*函数名称:void Uart0_Init(void)
*函数功能:Uart0中断初始化
*入口参数:void
*出口参数:void
*****************************************************/
void Uart0_Init(void)    //选择Timer1作为波特率信号发生器
{
        P1CON &= 0XF3;
        P1PH |= 0X0C;         //TX/RX为带上拉输入;
        P13 = 1;                 //TX初始高电平;
        SCON = 0X50;     //方式1,允许接收数据
        PCON |= 0X80;
        T2CON = 0x00;    //使用定时器1作UART时钟
        TMOD = 0X20;     //定时器1  8位自动重载
        TMCON = 0X02;    //定时器1   Fsys;
        TL1 = 217;               
        TH1 = 217;                 //UART 波特率24M情况下=38400;
        TR1 = 1;                 //启动Timer0
        EUART = 1;             //允许UART中断
        EA = 1;                     //开总中断
}

/*
void Uart0_Init(void)    //选择Timer2作为波特率信号发生器
{
        P1CON &= 0XF3;
        P1PH |= 0X0C;         //TX为强推输出,RX为带上拉输入;
        SCON  = 0X50;    //设置通信方式为模式一,允许接收
        PCON |= 0X80;
        TMCON |= 0X04;
        T2MOD = 0X00;
        T2CON = 0X30;
        RCAP2H = 0xFF;
        RCAP2L = 0xB2;
        TR2 = 1;
        EUART = 1;     //开启Uart0中断
        EA = 1;
}
*/

/*****************************************************
*函数名称:void UartInt(void) interrupt 4
*函数功能:Uart0中断服务函数
*入口参数:void
*出口参数:void
*****************************************************/
void UartInt(void) interrupt 4
{
        if(TI)
        {
                TI = 0;       
                UartSendFlag = 1;               
        }
        if(RI)
        {
                RI = 0;       
                UartReceiveFlag = 1;
        }       
}

/*****************************************************
*函数名称:void UartSendBit(unsigned char c)
*函数功能:Uart0中断服务函数
*入口参数:void
*出口参数:void
*****************************************************/
void UartSendBit(unsigned char c)
{
        SBUF = c;
        while(!UartSendFlag);
        UartSendFlag = 0;
}





#include "H/Function_Init.H"
#include "stdio.h"
/**************************************************************
说明:
1、Options for Target‘Target1’:BL51 Locate->Code Range:0x100,烧录选项请选择DISRST,复位脚作为普通IO使用;
2、改变TEST的定义,可以分别测试对应的功能;
3、注意:先在Function.H里面选择测试型号(SC92F7320无LCD/LED和PWM功能)
***************************************************************/
#define Test  5    //BTM:0 EXTI:1 Timer:2 LCD:3 PWM:4 Uart0:5 ADC:7 IAP:8

void main(void)
{
        IO_Init();
        WDTCON |= 0x10;                    //清看门狗
        Uart0_Init();
        while(1)
        {
                printf("Hello SC92F7321!\r\n");;
        }
        switch(Test)
        {
                case 0: BTM_Test();
                break;
                case 1: EXTI_Test();
                break;
                case 2: Timer_Test();
                break;
                case 3: LCD_Test();
                break;
                case 4: PWM_Test();
                break;
                case 5: //Uart0_Test();
                break;
                case 7: ADC_Test();
                break;
                case 8: IAP_Test(0x1fff,IapROM);   //操作ROM,对地址0x1fff进行读写测试
//                        IAP_Test(0x7f,IapEPPROM);   //操作EPPROM,对地址0x7f进行读写测试
                break;
                default:
                break;
        }
}


使用特权

评论回复
沙发
chenjun89| | 2023-10-16 23:34 | 只看该作者
主要就是重定向putchar函数

使用特权

评论回复
板凳
uptown| | 2023-10-27 21:05 | 只看该作者
printf是一个变参函数。              

使用特权

评论回复
地板
bartonalfred| | 2023-10-27 21:19 | 只看该作者
在使用printf函数之前,需要包含相应的头文件,即#include <stdio.h>。

使用特权

评论回复
5
jkl21| | 2023-10-27 21:49 | 只看该作者
单片机的printf函数构造与Keil编译器类似,但需要使用C语言编写。

使用特权

评论回复
6
sanfuzi| | 2023-10-27 22:19 | 只看该作者
printf函数返回一个整数,表示成功输出的字符数量。在遇到非法格式化说明符或缓冲区满时,函数返回-1。

使用特权

评论回复
7
dspmana| | 2023-10-27 22:49 | 只看该作者
printf函数通过串口通信实现输出。

使用特权

评论回复
8
albertaabbot| | 2023-10-27 23:19 | 只看该作者
printf函数是基于Keil C编译器的一个标准C库函数,用于实现格式化输出。

使用特权

评论回复
9
biechedan| | 2023-10-27 23:49 | 只看该作者
单片机中,由于存储空间的限制,printf函数的输出结果通常需要经过格式化处理才能输出

使用特权

评论回复
10
hudi008| | 2023-10-28 00:18 | 只看该作者
定义了一个名为printf的函数,它接受一个字符串参数。

使用特权

评论回复
11
ccook11| | 2023-10-28 00:48 | 只看该作者
通过调用标准库中的itoa、sprintf等函数将数据转换为字符串

使用特权

评论回复
12
rosemoore| | 2023-10-28 01:18 | 只看该作者
单片机中,没有内置的printf函数。

使用特权

评论回复
13
averyleigh| | 2023-10-28 01:48 | 只看该作者
printf("The number is %d\n", num); return 0; } 在上面的代码中,使用 printf() 函数将整数变量 num 的值插入到字符串中

使用特权

评论回复
14
saservice| | 2023-10-28 02:18 | 只看该作者
void printf(char *fmt, ...) {
    unsigned char i;
    va_list argptr;
    char buffer[8];

    va_start(argptr, fmt);
    for (i = 0; i < strlen(fmt); i++) {
        if (fmt[i] == '%') {
            int len = vsprintf(buffer, &fmt[i + 1], argptr);
            send_string(buffer, len);
            i += (strlen(buffer) - 1);
        } else {
            send_char(fmt[i]);
        }
    }
    va_end(argptr);
}

void send_char(char c) {
    // 在这里添加你的发送字符的代码
}

void send_string(char *s, int length) {
    // 在这里添加你的发送字符串的代码
}

使用特权

评论回复
15
robincotton| | 2023-10-28 02:47 | 只看该作者
赛元单片机SC92F732x系列printf函数构造

使用特权

评论回复
16
sheflynn| | 2023-10-28 03:17 | 只看该作者
void print(char *str) {
    while (*str != '\0') {
        // 发送一个字符到串口
        SBUF = *str++;
        while (TI == 0);
        TI = 0;
    }
}

使用特权

评论回复
17
uptown| | 2023-10-28 07:01 | 只看该作者
使用SBUF = c来发送一个字符,使用while (!TI); TI = 0;来等待发送完成。对于字符串,你可以使用循环来逐个发送字符。

使用特权

评论回复
18
eefas| | 2023-10-28 07:31 | 只看该作者
需要使用TI和SBUF等特殊寄存器来实现串口通信。

使用特权

评论回复
19
yangjiaxu| | 2023-10-30 09:17 | 只看该作者
51内核的打印函数不就直接调用串口打印就行么,还需要所谓的重定向?

使用特权

评论回复
20
udaidfa002| | 2023-11-2 09:25 | 只看该作者
这个函数还是很不错的。

使用特权

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

本版积分规则

22

主题

986

帖子

0

粉丝