完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
/*
* AVR串口实现printf函数 编译器 avrstudio,avr-gcc 使用硬件:avrmega16单片机 */ #include #include #include typedef unsigned char uint8; static void usart_init(void) { UCSRA = 0x02; /*倍速*/ UCSRB = 0x18; /*容许接收和发送*/ UCSRC = 0x06; /*8位数据*/ UBRRH = 0x00; UBRRL = 103; } static void put_char(uint8 data) { if (data == '/r') put_char(0x09); while ( !(UCSRA & (1< UDR = data; } /* */ static void myprintf(const char* fmt,...) { const char* s; int d; char buf[16]; va_list ap; va_start(ap,fmt); // 将ap指向fmt(便可变参数的第一个?下一个?) while (*fmt) { if (*fmt != '%') { put_char(*fmt++); // 正常发送 continue; } switch (*++fmt) // next % { case 's': s = va_arg(ap,const char*); // 将ap指向者转成char*型,并返回之 for (; *s; s++) put_char(*s); break; case 'x': d = va_arg(ap,int); // 将ap指向者转成int型,并返回之 itoa(d,buf,16); // 将整型d以16进制转到buf中 for (s = buf; *s; s++) put_char(*s); break; case 'd': d = va_arg(ap,int); itoa(d,buf,10); // 将整型d以10进制转到buf中 for (s = buf; *s; s++) put_char(*s); break; default: put_char(*fmt); break; } fmt++; } va_end(ap); } int main(void) { usart_init(); // 初始化串口 uint8 i = 100; uint8* s = "Word!"; while(1) { myprintf("/n/rHello %s/n/r0x%x = %d/n",s,i,i); } return 0; } 上面这段代码是在网上的一个代码的修改,修改后直接适用于avr16单片机 ,编译环境是 avrstudio中的avr-gcc。函数 下面贴一个《c和指针》里的 求平均值的小程序ui #include #include float average(int n_value,...) { unsigned char i; float sum = 0; va_list var_arg; va_start(var_arg,n_value); for(i=0;i sum+=va_arg(var_arg,int); } va_end(var_arg); return sum/n_value; } int main() { float sum; sum=average(5,1,2,3,4,5); printf("%f",sum); return 1; } |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1085浏览 2评论
700浏览 1评论
453浏览 0评论
194浏览 0评论
332浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 21:30 , Processed in 1.212671 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号