typedef char *va_list;
我先在知道想要在51單片機使用printf有兩種辦法,一種是用庫自己的printf,一種是寫自己的printf,不過都很簡單,我先介紹一下庫的printf吧。
1、首先添加頭文件#include
2、配置一下串口,但是在串口初始化的時候TI必須為1,否則無法發送。
3、也可以使用中斷接收,但是不要再中斷里有TI=0;這條語句,否則也發送不成功。
就這么簡單,你就可以使用printf(“”,x,x,x)了,嘎嘎!
#include
#include
#define FOSC 11059200L//系統時鐘頻率
#define BAUD 9600 //串口波特率
void USART_Init();
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void main()
{
unsigned int a=99;//定義的數不能是char 或者 unsigned char
char table[]="abc";
char *abc=table;
USART_Init();
Delay100us();
while(1)
{
printf("%d %c %x %s",a,(char)a,a,table);//必須(char)a強制轉換一下
Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();Delay100us();
}
}
void USART_Init(void)
{
AUXR=0x40;//定時器1的速度是傳統的8051的12倍 不分頻 不可以位尋址
TMOD=0x00;//設置定時器1為16位自動重裝寄存器 不可以位尋址
SCON=0x50;//設置為8位波特率可變 并允許串口接收使能
PCON=0x00;//用定時器1模式0時于PCON無關了
TL1=(65536-(FOSC/4/BAUD));
TH1=(65536-(FOSC/4/BAUD))>>8;
TI=1;//用系統自帶的printf函數,TI必須等于1,否則無法發送,不能
TR1=1;//使能定時器1
ES=1; //串口中斷使能
EA=1; //全局中斷使能
}
void Uart() interrupt 4 using 1
{
static unsigned char RI_date=0;
if(RI)//接收成功RI置位
{
RI_date=SBUF;
RI=0;
}
if(TI)//發送成功TI置位
{
//TI=0;//用系統的printf的時候,如果又用到中斷的話,那么這句話就得屏蔽,否則無法發送
}
}
還有一種就是自己寫printf。
void sendstring(unsigned char *string)//這個是字符串發送函數
{
while(*string!='\0') //判斷是否到字符串的尾端
{
sendbyte(*string);
string++;
}
}
void uart_printf(char *fmt,...)//這個是我們的printf函數
{
va_list ap;//typedef char *va_list; va_list是char型的指針
char xdata string[1024];//訪問外部RAM 兩字節對齊
va_start(ap,fmt);//這個函數的功能是,找到第一個可變形參的地址,并把地址賦給ap
vsprintf(string,fmt,ap);//其實這個函數才是核心函數,沒研究。。。
sendstring(string);//這個函數就是發送字符串函數,通過上一個函數,就把該提取的東西都提取了
va_end(ap);//結束函數
}
如果不懂得就參考網址:
http://blog.csdn.net/googlemi/article/details/8988567#1536434-tsina-1-80220-66a1f5d8f89e9ad52626f6f40fdeadaa
http://blog.csdn.net/googlemi/article/details/8988567#1536434-tsina-1-98185-66a1f5d8f89e9ad52626f6f40fdeadaa
http://blog.csdn.net/googlemi/article/details/8996605#1536434-tsina-1-96011-66a1f5d8f89e9ad52626f6f40fdeadaa
只要是支持printf的語言,那么如果片子的棧是向上生長的,函數的形參入棧的方向是從左向右,如果片子的棧是向下生長的,那么函數的形參是從右向左。