天桥陨石分享 http://blog.sciencenet.cn/u/chrujun 让地球物理仪器飞起来

博文

巧改putchar函数,实现单片机下多形式输出

已有 9762 次阅读 2010-9-29 16:13 |个人分类:地球物理及仪器|系统分类:科研笔记| C语言, 单片机, putchar

  最近看学生编的单片机C程序,发现多个地方出现类似的下面两行:

    len=sprintf(sdata,"@:%c %02u-%02u-%02u %02u:%02u:%02urn", DataBuf[0],
   (unsigned int)DataBuf[4]+2000,(unsigned int)DataBuf[5],(unsigned int)DataBuf[6],
   (unsigned int)DataBuf[7],(unsigned int)DataBuf[8],(unsigned int)DataBuf[9]);
   for(i=0;i<len;i++) UART0_OP(sdata[i]);

   第一行生成一个字符串,第二行将字符串通过单片机串口1输出。UART0_OP函数如下:

  void  UART0_OP (unsigned char opdata){
 unsigned char outputdata;
    outputdata=opdata;
   ES0=0;
      EA=0;
   SBUF0=outputdata;
      while(TI0==0);
      TI0=0;
      ES0=1;
   EA=1;}

  其实,可以把UART0_OP修改成putchar()函数,之后可以用printf等函数直接输出。在单片机编译器的LIB目录下,原有的putchar()函数内容如下:

 

/*
 * putchar (full version):  expands 'n' into CR LF and handles
 *                          XON/XOFF (Ctrl+S/Ctrl+Q) protocol
 */
char putchar (char c)  {

  if (c == 'n')  {
    if (RI)  {
      if (SBUF == XOFF)  {
        do  {
          RI = 0;
          while (!RI);
        }
        while (SBUF != XON);
        RI = 0;
      }
    }
    while (!TI);
    TI = 0;
    SBUF = 0x0d;                         /* output CR  */
  }
  if (RI)  {
    if (SBUF == XOFF)  {
      do  {
        RI = 0;
        while (!RI);
      }
      while (SBUF != XON);
      RI = 0;
    }
  }
  while (!TI);
  TI = 0;
  return (SBUF = c);
}

 

#if 0         // comment out versions below

/*
 * putchar (basic version): expands 'n' into CR LF
 */
char putchar (char c)  {
  if (c == 'n')  {
    while (!TI);
    TI = 0;
    SBUF = 0x0d;                         /* output CR  */
  }
  while (!TI);
  TI = 0;
  return (SBUF = c);
}


/*
 * putchar (mini version): outputs charcter only
 */
char putchar (char c)  {
  while (!TI);
  TI = 0;
  return (SBUF = c);
}

#endif

这个函数有3个版本,最后一个函数是最简单的,我进行了如下修改:

 /*
 * putchar (mini version): outputs charcter only
 */
char putchar (char c)  {
     ES0=0;
      EA=0;
   SBUF0=c;
      while(TI0==0);
      TI0=0;
      ES0=1;
   EA=1;
   return c;
}

 然后把其它两个函数设置成不编译模式。将这个函数加入工程文件后,

 前面一段程序可以作如下修改:

 printf("@:%c %02u-%02u-%02u %02u:%02u:%02urn", DataBuf[0],
   (unsigned int)DataBuf[4]+2000,(unsigned int)DataBuf[5],(unsigned int)DataBuf[6],
   (unsigned int)DataBuf[7],(unsigned int)DataBuf[8],(unsigned int)DataBuf[9]);

也就是说,修改和加入putchar()函数后,我们可以用printf, puts等函数实现输出。

   事实上,只要修改LIB下的getkey, 和putchar函数,让这两个函数实现单个字符的输入和输出,我们就可以用丰富的标准I/O函数实现字符串的输入和输出,而不用去编写专门的字符串输入和输出函数。

  对学生编写的程序进行全面修改后,编译后的代码少了10%以上,对字符的输出也更加方便和灵活了,也去掉了专门的数组sdata.

 

 



https://blog.sciencenet.cn/blog-39626-368189.html

上一篇:C8051单片机C语言程序设计的几个深层次问题及解决方法
下一篇:将PC窗口菜单程序移植到单片机 问题与解决方案
收藏 IP: .*| 热度|

2 吕喆 李志俊

发表评论 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-23 12:53

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部