robertesth 发表于 2023-10-15 13:30

SC92F732x系列printf函数构造


#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;   //定时器18位自动重载
        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 Test5    //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>。

jkl21 发表于 2023-10-27 21:49

单片机的printf函数构造与Keil编译器类似,但需要使用C语言编写。

sanfuzi 发表于 2023-10-27 22:19

printf函数返回一个整数,表示成功输出的字符数量。在遇到非法格式化说明符或缓冲区满时,函数返回-1。

dspmana 发表于 2023-10-27 22:49

printf函数通过串口通信实现输出。

albertaabbot 发表于 2023-10-27 23:19

printf函数是基于Keil C编译器的一个标准C库函数,用于实现格式化输出。

biechedan 发表于 2023-10-27 23:49

单片机中,由于存储空间的限制,printf函数的输出结果通常需要经过格式化处理才能输出

hudi008 发表于 2023-10-28 00:18

定义了一个名为printf的函数,它接受一个字符串参数。

ccook11 发表于 2023-10-28 00:48

通过调用标准库中的itoa、sprintf等函数将数据转换为字符串

rosemoore 发表于 2023-10-28 01:18

单片机中,没有内置的printf函数。

averyleigh 发表于 2023-10-28 01:48

printf("The number is %d\n", num); return 0; } 在上面的代码中,使用 printf() 函数将整数变量 num 的值插入到字符串中

saservice 发表于 2023-10-28 02:18

void printf(char *fmt, ...) {
    unsigned char i;
    va_list argptr;
    char buffer;

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

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

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

robincotton 发表于 2023-10-28 02:47

赛元单片机SC92F732x系列printf函数构造

sheflynn 发表于 2023-10-28 03:17

void print(char *str) {
    while (*str != '\0') {
      // 发送一个字符到串口
      SBUF = *str++;
      while (TI == 0);
      TI = 0;
    }
}

uptown 发表于 2023-10-28 07:01

使用SBUF = c来发送一个字符,使用while (!TI); TI = 0;来等待发送完成。对于字符串,你可以使用循环来逐个发送字符。

eefas 发表于 2023-10-28 07:31

需要使用TI和SBUF等特殊寄存器来实现串口通信。

yangjiaxu 发表于 2023-10-30 09:17

51内核的打印函数不就直接调用串口打印就行么,还需要所谓的重定向?

udaidfa002 发表于 2023-11-2 09:25

这个函数还是很不错的。
页: [1] 2 3 4
查看完整版本: SC92F732x系列printf函数构造