用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