avr单片机串口实现printf(使用变参函数)
1./* 
2.* AVR串口实现printf函数 
3.编译器 avrstudio,avr-gcc 
4.使用硬件:avrmega16单片机 
5.*/ 
6.#include <stdarg.h> 
7.#include <stdlib.h>    
8.#include <avr/io.h> 
9.
10.typedef unsigned char uint8; 
11.static void usart_init(void
12.
13.UCSRA = 0x02;  /*倍速*/   
14.UCSRB = 0x18;  /*允许接收和发送*/   
15.UCSRC = 0x06;  /*8位数据*/   
16.UBRRH = 0x00;   
17.UBRRL = 103;   
18.
19.static void put_char(uint8 data) 
20.
21.if (data == '/r'
22.put_char(0x09); 
23.while ( !(UCSRA & (1<<UDRE)) )    // 不为空,等之 
24.
25.UDR = data; 
26.
27./* 
28.*/ 
29.static void myprintf(const char* fmt,...) 
30.
31.const char* s; 
32.int d; 
33.char buf[16]; 
34.va_list ap; 
35.va_start(ap,fmt);   // 将ap指向fmt(即可变参数的第一个?下一个?) 
36.while (*fmt) 
37.
38.if (*fmt != '%'
39.
40.put_char(*fmt++);   // 正常发送 
41.continue;     
42.
43.switch (*++fmt) // next % 
字符串转数组char44.
45.case 's'
46.s = va_arg(ap,const char*); // 将ap指向者转成char*型,并返回之 
47.for (; *s; s++) 
48.put_char(*s); 
49.break
50.case 'x'
51.d = va_arg(ap,int);     // 将ap指向者转成int型,并返回之 
52.itoa(d,buf,16);         // 将整型d以16进制转到buf中 
53.for (s = buf; *s; s++) 
54.put_char(*s); 
55.break
56.case 'd'
57.d = va_arg(ap,int); 
58.itoa(d,buf,10);         // 将整型d以10进制转到buf中 
59.for (s = buf; *s; s++) 
60.put_char(*s); 
61.break
62.default
63.put_char(*fmt); 
64.break
65.
66.fmt++; 
67.
68.va_end(ap); 
69.
70.int main(void
71.
72.usart_init();   // 初始化串口 
73.uint8 i = 100; 
74.uint8* s = "Word!"
75.while(1) 
76.
77.myprintf("/n/rHello %s/n/r0x%x = %d/n",s,i,i);   
78.
79.return 0; 
80.}   
上面这段代码是在网上的一个代码的修改,修改后直接适用于avr16单片机 ,编译环境是 avrstudio中的avr-gcc。
下面贴一个《c和指针》里的 求平均值的小程序
[cpp] view plaincopy?
1.#include <stdio.h> 
2.#include <stdarg.h> 
3.
4.float average(int n_value,...) 
5.
6.unsigned char i; 
7.float sum = 0; 
8.va_list var_arg; 
9.va_start(var_arg,n_value); 
10.for(i=0;i<n_value;i++) 
11.
12.sum+=va_arg(var_arg,int); 
13.
14.
15.va_end(var_arg); 
16.
17.return sum/n_value; 
18.
19.
20.
21.
22.int main() 
23.
24.float sum; 
25.sum=average(5,1,2,3,4,5); 
26.
27.printf("%f",sum); 
28.return 1; 
29.
30.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。