📄 print.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 + -