【单片机】重写打印函数printf

#include <reg52.h>
#include <stdio.h>
#include <stdarg.h>					//调用打印函数的一些声明
typedef unsigned char 	uchar;		//重命名,方便写
typedef unsigned short  uint;
bit 	busy;						//串口发送完成标志
xdata char string[100];				//存放重定向的临时字符串,声明为全局是怕栈溢出
//xdata为相对于RAM的外部存储器,因为100个单元,RAM中data内存不够,所以存放到xdata
void init(void);					//参数初始化
void SendData(uchar);				//串口发送字符
void SendString(uchar*);			//串口发送字符串
void Print(char *fmt,...);			//重新编写打印函数

void init()
{
	TMOD  = 0x20;					//定时器1 工作方式1
	TH1   = 0xfd;			 		//定时器1作为串口波特率发生器,8位计数器,波特率9600,SMOD=0不加倍,
	TL1   = 0xfd;					//根据公式算的初始值为253即0xfd
	SM0   = 1;						//串行工作方式1
	SM1   = 1;						//同上
	TR1   = 1;						//启动定时器1
	REN	  = 1;						//允许串行口接收数据
	EA    = 1;						//开总中断
	ES    = 1;						//开串行口中断
}

void main()
{
	int a=10;
	float b=3.14;
	char* s="Manager!\n";
	init();
	Print("Hello %s",s);
	Print("a=%d b=%.3f\n",a,b);
	while(1)
	{
		
	}
}

void Ser_uart() interrupt 4
{
	uchar temp;
	if(RI)							//接收中断标志位
	{
		RI = 0;						//清除接收中断标志位
		temp = SBUF;				//获取串口缓冲寄存器的值
	}
	
	if(TI)							//发送中断标志位
	{
		TI = 0;
		busy = 0;					//发送完成标志
	}
}

void SendData(uchar dat)			//串口发送字符
{
	while(busy);					//等待上一次数据发送完成
	busy = 1;
	SBUF = dat;						//发送当前数据
}

void SendString(uchar *str)			//串口发送字符串
{
	while(*str)
	{
		SendData(*str++);
	}
}

void Print(char *fmt,...)           //许多函数存放在stdarg.h中
{
    char * ap;                		//typedef char *va_list; va_list是char型的指针
    va_start(ap,fmt);        		//这个函数的功能是,找到第一个可变形参的地址,并把地址赋给ap
    vsprintf(string,fmt,ap);		//将fmt和ap格式化字符串,存放到string
    SendString(string);    			//这个函数就是发送字符串函数,通过上一个函数,就把该提取的东西都提取了
    va_end(ap);                		//结束函数
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值