⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print.c

📁 凌阳 Web服务器应用采用Microchip TCP / IP协议栈介绍
💻 C
字号:
#include <stdarg.h>
#define UARTBASE				0x88150000
	#define P_UARTDR				(unsigned int *)(UARTBASE+(0x00<<2))
	#define P_UARTRSR				(unsigned int *)(UARTBASE+(0x01<<2))
	#define P_UARTCR				(unsigned int *)(UARTBASE+(0x02<<2))
	#define P_UARTBUD				(unsigned int *)(UARTBASE+(0x03<<2))
	#define P_UARTFR				(unsigned int *)(UARTBASE+(0x04<<2))
	#define P_IRDACR				(unsigned int *)(UARTBASE+(0x08<<2))
	#define P_UARTBMR				(unsigned int *)(UARTBASE+(0x07<<2))
	#define P_TUBEDR				(unsigned int *)(UARTBASE + 0x7ffc)		
#define P_UART_CLK_CONF                     (volatile unsigned int *)0x8821005C

void print1(char*);
void print2(char x [],int type,unsigned int y);
void print3(char x [],int type,unsigned long y);
char* itoa(unsigned int a,int type);
char* itoa32(unsigned long a,int type);
int	psprintf(char *dest,const char *format,...);

#define CONVERT_SIGN				(1<<0)
#define CONVERT_LONG				(1<<1)
#define CONVERT_LONGLONG			(1<<2)
#define CONVERT_WIDTH				(1<<3)
#define CONVERT_LEADING_ZERO		(1<<4)
#define CONVERT_LEFT_ADJUST		(1<<5)
#define CONVERT_START				(1<<15)

void init_uart()
{
	*P_UART_CLK_CONF = 0x3;   // UART Clock Enable
	*P_UARTBUD=	0xe9; 		//115200
	*P_UARTCR=	0x1076; 		// 8bit, 1 stop, even parity,fifo enable
}

void print1(char* x)
{
	unsigned int p,a;
	int i;

	for(i=0;x[i]!='\0';i++)
	{
		//if(x[i]=='\n') x[i]='\n';
		*P_UARTDR=x[i];
		a=*P_UARTFR;
		p=0x0020&a;
		while(p!=0) 
		{
			a=*P_UARTFR;
			p=0x0020&a;
		}
	}
	a=*P_UARTFR;
	p=0x0008&a;
	while(p!=0) 
	{
			a=*P_UARTFR;
			p=0x0008&a;
	}

}

void print2(char x [],int type,unsigned int y)
{
	unsigned int p,a;
	int i;
	char *st;

	st=itoa(y,type);

	for(i=0;x[i]!='\0';i++)
	{
/* 		if(x[i]=='\n') {x[i]='\n';} */
		*P_UARTDR=x[i];
		a=*P_UARTFR;
		p=0x0020&a;
		while(p!=0) 
		{
			a=*P_UARTFR;
			p=0x0020&a;
		}
	}

	for(;*st!='\0';st++)
		{
		*P_UARTDR=*st;
		a=*P_UARTFR;
		p=0x0020&a;
		while(p!=0) 
		{
			a=*P_UARTFR;
			p=0x0020&a;
		}
	}

	*P_UARTDR='\n';
	a=*P_UARTFR;
	p=0x0008&a;
	while(p!=0) 
	{
		a=*P_UARTFR;
		p=0x0008&a;
	}
	///////////////////////////////
	*P_UARTDR='\r';
	a=*P_UARTFR;
	p=0x0008&a;
	while(p!=0) 
	{
			a=*P_UARTFR;
			p=0x0008&a;
	}

}

char* itoa(unsigned int a,int type)
{
	/**** type : 10,16 dec ****/
	unsigned int v0,v1,v2,v3,v4;
	char st[32];
	long i,j,k,l,da[16];

	v0=0;
	if(type==0) 
	{// 16
		v1=a&0xf000;	v1=v1>>12;
		v2=a&0x0f00;	v2=v2>>8;
		v3=a&0x00f0;	v3=v3>>4;
		v4=a&0x000f;
		if(v1>=10)		v1=v1+7;
		if(v2>=10)		v2=v2+7;
		if(v3>=10)		v3=v3+7;
		if(v4>=10)		v4=v4+7;
	} 
	else if(type==1) 
	{ //10
		v0=a/10000;
		v1=(a-v0*10000)/1000;
		v2=(a-v0*10000-v1*1000)/100;
		v3=(a-v0*10000-v1*1000-v2*100)/10;
		v4=(a-v0*10000-v1*1000-v2*100-v3*10);
	} 
	else 
	{
		j=32768;k=a;
		for(i=15;i>=0;i--)
		{
			k=k-j;
			if(k<0)
			{
				da[i]=0;
				k=k+j;
			} 
			else if(k==0)
			{
				da[i]=1;
				for(l=(i-1);l>=0;l--) da[l]=0;
				break;
			}
			else 
				da[i]=1;
			j=j/2;
		}
	}
	
	if((type==0)||(type==1))
	{
	if( ((v0==0)&&(type==1)) | (type==0) ){
		if(v1==0){
			if(v2==0){
				if(v3==0){
					st[0]=v4+0x30;
					st[1]='\0';
				} else {
					st[0]=v3+0x30;
					st[1]=v4+0x30;
					st[2]='\0';
				}
			} else {
				st[0]=v2+0x30;
				st[1]=v3+0x30;
				st[2]=v4+0x30;
				st[3]='\0';
			}
		} else {
			st[0]=v1+0x30;
			st[1]=v2+0x30;
			st[2]=v3+0x30;
			st[3]=v4+0x30;
			st[4]='\0';
		}
	} else {
		st[0]=v0+0x30;
		st[1]=v1+0x30;
		st[2]=v2+0x30;
		st[3]=v3+0x30;
		st[4]=v4+0x30;
		st[5]='\0';
	}	
	} else {
	k=0;
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			st[k]=da[15-(i*4+j)]+0x30;
			k++;
			if((j==3)&&(i!=3)){
				st[k]='_';
				k++;
			}
		}
	}
	st[k]='\0';
	}
	return st;
}

void print3(char x [],int type,unsigned long y){
	unsigned int p,a;
	int i;
	char *st;

	st=itoa32(y,type);

	for(i=0;x[i]!='\0';i++){
		*P_UARTDR=x[i];
		a=*P_UARTFR;p=0x0020&a;
		while(p!=0) {
			a=*P_UARTFR;p=0x0020&a;
		}
	}

	for(;*st!='\0';st++){
		*P_UARTDR=*st;
		a=*P_UARTFR;p=0x0020&a;
		while(p!=0) {
			a=*P_UARTFR;p=0x0020&a;
		}
	}

	*P_UARTDR='\n';
	a=*P_UARTFR;p=0x0008&a;
	while(p!=0) {
			a=*P_UARTFR;p=0x0008&a;
	}

}

char* itoa32(unsigned long a,int type){
	unsigned int v1,v2,v3,v4;
	unsigned long h1,h2,h3,h4;
	char st[32];
	unsigned long b;

	if(type==0) {// 16
		b=a>>16;
		h1=b&0xf000;	h1=h1>>12;
		h2=b&0x0f00;	h2=h2>>8;
		h3=b&0x00f0;	h3=h3>>4;
		h4=b&0x000f;
		if(h1>=10)		h1=h1+7;
		if(h2>=10)		h2=h2+7;
		if(h3>=10)		h3=h3+7;
		if(h4>=10)		h4=h4+7;

		b=a&0xffff;
		v1=b&0xf000;	v1=v1>>12;
		v2=b&0x0f00;	v2=v2>>8;
		v3=b&0x00f0;	v3=v3>>4;
		v4=b&0x000f;
		if(v1>=10)		v1=v1+7;
		if(v2>=10)		v2=v2+7;
		if(v3>=10)		v3=v3+7;
		if(v4>=10)		v4=v4+7;
	
		st[0]=h1+0x30;
		st[1]=h2+0x30;
		st[2]=h3+0x30;
		st[3]=h4+0x30;
		st[4]=v1+0x30;
		st[5]=v2+0x30;
		st[6]=v3+0x30;
		st[7]=v4+0x30;
		st[8]='\0';
	}
	return st;
}

typedef union
{
	long long 	i64;
	int	i32;
	long long 	u64;
	int	u32;
} t_num;

static const char radix_table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static char *__ltoa16__(char *dest, t_num * X, unsigned conversion, int width)
{
	int     size = 0;
	char   *src, *src2;
	char    c;

	/* check long */
	if(conversion & CONVERT_LONGLONG)
	{
		long long  num = X->u64;

		/* generating bytes. */
		src = dest;
		do
		{
			int     frac;

			frac = (int)(num & 0x0f);
			num = num >> 4;
			src2 = dest;
			*dest++ = radix_table[frac];
			size++;
		} while(num);
	}
	else
	{
		unsigned int   num = X->u32;

		/* generating bytes. */
		src = dest;
		do
		{
			int     frac;

			frac = (int)(num & 0x0f);
			num = num >> 4;
			src2 = dest;
			*dest++ = radix_table[frac];
			size++;
		} while(num);
	}

	/* Now fill leadings (or trailing) ZEROs or SPACEs */
	c = (conversion & CONVERT_LEADING_ZERO) ? '0' : ' ';
	while(width > size)
	{
		src2 = dest;
		*dest++ = c;
		size++;
	}

	/* reverse bytes */
	while(src < src2)
	{
		c = *src2;
		*src2 = *src;
		*src = c;
		src++;
		src2--;
	}
	return dest;
}


static char *__ltoa__(char *dest,t_num *X,unsigned base,int conversion,int width)
{
	int     size = 0;
	char   *src, *src2;
	char    c;

	/* check long */
	if(conversion & CONVERT_LONGLONG)
	{
		long long  num = X->u64;

		/* conversion sign */
		if(conversion & CONVERT_SIGN)
		{
			if(((long long) num) < 0)
			{
				num = (unsigned long long) (-(long long) num);
				*dest++ = '-';
				size++;
			}
		}
		/* generating bytes. */
		src = dest;
		do
		{
			int     frac;

			frac = num % base;
			num = num / base;
			src2 = dest;
			*dest++ = radix_table[frac];
			size++;
		} while(num);
	}
	else
	{
		unsigned int   num = X->u32;

		/* conversion sign */
		if(conversion & CONVERT_SIGN)
		{
			if(((int) num) < 0)
			{
				num = (unsigned int ) (-(int) num);
				*dest++ = '-';
				size++;
			}
		}
		/* generating bytes. */
		src = dest;
		do
		{
			int     frac;

			frac = num % base;
			num = num / base;
			src2 = dest;
			*dest++ = radix_table[frac];
			size++;
		} while(num);
	}

	/* Now fill leadings (or trailing) ZEROs or SPACEs */
	c =
		((conversion & (CONVERT_LEADING_ZERO | CONVERT_LEFT_ADJUST)) ==
		 CONVERT_LEADING_ZERO) ? '0' : ' ';
	while(width > size)
	{
		if((conversion & CONVERT_LEFT_ADJUST) == 0)
			src2 = dest;
		*dest++ = c;
		size++;
	}

	/* reverse bytes */
	while(src < src2)
	{
		c = *src2;
		*src2 = *src;
		*src = c;
		src++;
		src2--;
	}
	return dest;
}


int  psprintf(char *dest,const char *format,...)
{
	va_list ap;
	int     width = 0;
	unsigned conversion = 0;

	va_start(ap, format);

	while(1)
	{
		int     c = *format++;

		*dest = c;
		if(c == '\0')
			break;
		if(conversion & CONVERT_START)
		{
			if(c >= '0' && c <= '9')
			{
				if(width == 0 && c == '0')
				{
					conversion |= CONVERT_LEADING_ZERO;
				}
				else
				{
					conversion |= CONVERT_WIDTH;
					width = width * 10 + (c - '0');
				}
			}
			else if(c == 'l')
			{
				if(conversion & CONVERT_LONG)
					conversion |= CONVERT_LONGLONG;
				conversion |= CONVERT_LONG;
			}
			else if(c == '-')
			{
				conversion =
					(conversion & (~CONVERT_LEADING_ZERO)) | CONVERT_LEFT_ADJUST;
			}
			else
			{
				t_num   X;

				if(conversion & CONVERT_LONGLONG)
					X.u64 = va_arg(ap, unsigned long long);
				else
					X.u32 = va_arg(ap, unsigned int );
				switch (c)
				{
					case 'd':
						dest = __ltoa__(dest, &X, 10, conversion, width);
						break;
					case 'u':
						dest = __ltoa__(dest, &X, 10, conversion, width);
						break;
					case 'x':
						dest = __ltoa16__(dest, &X, conversion, width);
						break;
					case 's':
					{
						char   *src = (char *)(X.u32);

						while(*src)
							*dest++ = *src++;
						break;
					}
					case 'c':
						*dest++ = (char)X.u32;
						break;
				}
				/* reset conversion */
				conversion = 0;
			}
		}
		else if(c == '%')
		{
			conversion = CONVERT_START;
			width = 0;
		}
		else
		{
			dest++;
		}
	}

	va_end(ap);
	
	return 0;
}
void USARTPut(char* x)
{
    print1(x);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -