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;
}
}
主要就是重定向putchar函数 printf是一个变参函数。 在使用printf函数之前,需要包含相应的头文件,即#include <stdio.h>。 单片机的printf函数构造与Keil编译器类似,但需要使用C语言编写。 printf函数返回一个整数,表示成功输出的字符数量。在遇到非法格式化说明符或缓冲区满时,函数返回-1。 printf函数通过串口通信实现输出。 printf函数是基于Keil C编译器的一个标准C库函数,用于实现格式化输出。 单片机中,由于存储空间的限制,printf函数的输出结果通常需要经过格式化处理才能输出 定义了一个名为printf的函数,它接受一个字符串参数。 通过调用标准库中的itoa、sprintf等函数将数据转换为字符串 单片机中,没有内置的printf函数。 printf("The number is %d\n", num); return 0; } 在上面的代码中,使用 printf() 函数将整数变量 num 的值插入到字符串中 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) {
// 在这里添加你的发送字符串的代码
} 赛元单片机SC92F732x系列printf函数构造 void print(char *str) {
while (*str != '\0') {
// 发送一个字符到串口
SBUF = *str++;
while (TI == 0);
TI = 0;
}
} 使用SBUF = c来发送一个字符,使用while (!TI); TI = 0;来等待发送完成。对于字符串,你可以使用循环来逐个发送字符。 需要使用TI和SBUF等特殊寄存器来实现串口通信。 51内核的打印函数不就直接调用串口打印就行么,还需要所谓的重定向? 这个函数还是很不错的。