IO 模拟 Uart Printf 函数

用IO延时模拟Uart数据,printf 函数

IO 模拟 Uart Printf 函数

目前 8M情况能支持到 38400

 

 

#include "printf.h"


/********************************************************************
Function:
INPUT   :
OUTPUT  :
NOTE    :调用函数周期,通常需要根据MCU 修改
		:这里面有指令周期固定调试为4us
		:系统CLK =0.5us *4 = 2us
********************************************************************/
void fun_delay()// 1us
{	
// call 2个机器周
//	mov     a, AH  //
//	mov     ra, a  //2个机器周
//	_L3:
//	sdz     ra   // 4个机器周期 2*10 = 11
//	jmp     _L3  2+1 =3 *0.5 
//	ret
	unsigned char i;//这个变量只能命名为I 编译会进行优化
	i = (THE_DELAY_TIME-4)/2;
	do{
		i--;
		asm("nop"); //
	} 	
	while(i!=0);//2
}

/********************************************************************
Function:
INPUT   :
OUTPUT  :
NOTE    :
********************************************************************/
void put_Char(unsigned char data)
{
	unsigned char i;
	SET_UART_PIN_OUT();
	// 0xaa
	//开始信号
	UART_PIN_OUT_LOW();
	fun_delay();
	// 传送字符
	for(i=0;i<8;i++)
	{
		
		if(data&0x01)
		{
			UART_PIN_OUT_HIHG();	
		}
		else
		{
			UART_PIN_OUT_LOW();	
		}
		fun_delay();
		data=data>>1;
	}
	//结束幸好
	UART_PIN_OUT_HIHG();
	fun_delay();
}


/********************************************************************
Function:
INPUT   :
OUTPUT  :
NOTE    :
********************************************************************/
void printf(char *Char_Data,volatile unsigned long temp)
{
	unsigned char data_Flag,data_H_Is_None_Zero,data_base,inteProtect; // 可以
	inteProtect = ISR_RESITER;
	ISR_RESITER = 0;
	data_Flag = 0;
	while(*Char_Data != '\0')
	{
		//当前字符是%d 表示数据输出

		if(*Char_Data=='%')
		{
		
			Char_Data++;
			if(*Char_Data=='d')
			{
				data_Flag = 1;	//发送数据	
				data_base =10;
			}
			if(*Char_Data=='x')
			{
				data_Flag = 1;
				data_base = 16;
			}
			Char_Data++;
		}	
		if(data_Flag)//
		{
			data_Flag = 0;//
			data_H_Is_None_Zero = 0;
			//数据转字符
		volatile	unsigned char i;
		volatile 	unsigned char Data_buf[12];
			for (i = 0; i < 10; i++)
			{
				Data_buf[10-i] = temp % data_base;
				temp /= data_base;
			}	
			for(i=0;i<11;i++) 
			{
				if(Data_buf[i]!=0)
				{
					data_H_Is_None_Zero = 1;
				}
				if(i==10)
				{	
					if(Data_buf[10]==0)
					{
						data_H_Is_None_Zero = 1;
					}
				}
				if(data_H_Is_None_Zero)
				{
					if(Data_buf[i]>9)
					{
						put_Char(Data_buf[i]+55); 	
					}
					else
					{
						put_Char(Data_buf[i]+48); //开始打印数据 如果分解完成都是直接输出0
					}
					
				}		
			}

		}
		else
		{
			
			put_Char(*Char_Data);
			Char_Data++;
		}
	}
	ISR_RESITER=inteProtect;
}
#ifndef _PRINFTF_H
#define  _PRINFTF_H

//字符串长度限制为 10

//#define long unsigned (SYS_CLK)  80000000 // 特别注意 部分编译器只支持16位
//#define UART_BOUND 9600 // 建议用这个波特率。提高兼容性 104 us
// #define UART_BOUND 19200 //  52 支持
//#define UART_BOUND 38400  //  25 支持
//#define UART_BOUND 57600  //  20 时间太短,不支持
// 注意指令周期和系统周期不不一定一样 在设配fun_delay函数特别注意
// 合泰是四个时钟周期为一个指令周期 

#define UART_PIN _pa5
#define SET_UART_PIN_OUT() { _pac5 = 0;}
#define UART_PIN_OUT_HIHG() { UART_PIN=1;}
#define UART_PIN_OUT_LOW()  {UART_PIN=0;}



#define ISR_RESITER     _emi 

#define THE_DELAY_TIME 25

void fun_delay();
void put_Char(unsigned char data);
void printf(char *Char_Data,unsigned long temp);

// V1.0.0
#endif
















 

上一篇:K210实战三-串口收发实验


下一篇:ZYNQ EMIO UART使用