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小时内删除。
发表评论