[应用方案] SC92F732x系列printf函数构造

[复制链接]
 楼主| robertesth 发表于 2023-10-15 13:30 | 显示全部楼层 |阅读模式

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

  5. char putchar(char c)//重定向
  6. {
  7.         UartSendBit(c);
  8.         return c;
  9. }



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

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

  49. /*****************************************************
  50. *函数名称:void UartInt(void) interrupt 4
  51. *函数功能:Uart0中断服务函数
  52. *入口参数:void
  53. *出口参数:void
  54. *****************************************************/
  55. void UartInt(void) interrupt 4
  56. {
  57.         if(TI)
  58.         {
  59.                 TI = 0;       
  60.                 UartSendFlag = 1;               
  61.         }
  62.         if(RI)
  63.         {
  64.                 RI = 0;       
  65.                 UartReceiveFlag = 1;
  66.         }       
  67. }

  68. /*****************************************************
  69. *函数名称:void UartSendBit(unsigned char c)
  70. *函数功能:Uart0中断服务函数
  71. *入口参数:void
  72. *出口参数:void
  73. *****************************************************/
  74. void UartSendBit(unsigned char c)
  75. {
  76.         SBUF = c;
  77.         while(!UartSendFlag);
  78.         UartSendFlag = 0;
  79. }





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

  10. void main(void)
  11. {
  12.         IO_Init();
  13.         WDTCON |= 0x10;                    //清看门狗
  14.         Uart0_Init();
  15.         while(1)
  16.         {
  17.                 printf("Hello SC92F7321!\r\n");;
  18.         }
  19.         switch(Test)
  20.         {
  21.                 case 0: BTM_Test();
  22.                 break;
  23.                 case 1: EXTI_Test();
  24.                 break;
  25.                 case 2: Timer_Test();
  26.                 break;
  27.                 case 3: LCD_Test();
  28.                 break;
  29.                 case 4: PWM_Test();
  30.                 break;
  31.                 case 5: //Uart0_Test();
  32.                 break;
  33.                 case 7: ADC_Test();
  34.                 break;
  35.                 case 8: IAP_Test(0x1fff,IapROM);   //操作ROM,对地址0x1fff进行读写测试
  36. //                        IAP_Test(0x7f,IapEPPROM);   //操作EPPROM,对地址0x7f进行读写测试
  37.                 break;
  38.                 default:
  39.                 break;
  40.         }
  41. }


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[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) {
    // 在这里添加你的发送字符串的代码
}
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 | 显示全部楼层
这个函数还是很不错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

1393

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

49

主题

1393

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部