陈儒军
巧改putchar函数,实现单片机下多形式输出
2010-9-29 16:13
阅读:9536
标签: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://wap.sciencenet.cn/blog-39626-368189.html?mobile=1

收藏

分享到:

当前推荐数:2
推荐人:
推荐到博客首页
网友评论1 条评论
确定删除指定的回复吗?
确定删除本博文吗?