⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 简单Shell命令调试系统开发的程序
💻 C
字号:
/****************************************/
/* Copyright (c) 2004, 63研究所 苗龙    */
/* All rights reserved.                 */
/* 作    者:苗龙                       */
/****************************************/

/******************************************************************************/
/*                                                                            */
/*       SERIAL.C:  Interrupt Controlled Serial Interface for RTX-51 tiny     */
/*                                                                            */
/******************************************************************************/


#include <reg52.h>                    /* special function register 8052       */
#include <rtx51tny.h>                 /* RTX-51 tiny functions & defines      */
#include "serial.h"

#define  OLEN  8                      /* size of serial transmission buffer   */
unsigned char  ostart=0;                /* transmission buffer start index      */
unsigned char  oend=0;                  /* transmission buffer end index        */
char  outbuf[OLEN];          /* storage for transmission buffer      */
unsigned char  otask = 0xff;          /* task number of output task           */

#define  ILEN  8                      /* size of serial receiving buffer      */
unsigned char  istart=0;                /* receiving buffer start index         */
unsigned char  iend=0;                  /* receiving buffer end index           */
char  inbuf[ILEN];           /* storage for receiving buffer         */
unsigned char  itask = 0xff;          /* task number of output task           */


bit   sendfull=0;                       /* flag: marks transmit buffer full     */
bit   sendactive=0;                     /* flag: marks transmitter active       */


#define MaxLenStr       100     /*buf[MaxLenStr+1] for '\0'*/
#define	TABNum          4       //TAB键移动长度

/******************************************************************************/
/*       putbuf:  write a character to SBUF or transmission buffer            */
/******************************************************************************/
void putbuf (char c)  {
  if (!sendfull)  {                   /* transmit only if buffer not full     */
    if (!sendactive)  {  /* if transmitter not active:           */
      sendactive = 1;                 /* transfer the first character direct  */
      SBUF = c;                       /* to SBUF to start transmission        */
    }
    else  {                           /* otherwize:                           */
	  outbuf[ostart++ % OLEN] = c;
	  ostart=ostart% OLEN;
	if (((ostart+1)%OLEN)==oend)  sendfull = 1;
    }                               
  }
}


/******************************************************************************/
/*       putchar:  interrupt controlled putchar function                      */
/******************************************************************************/
char putchar (char c)  {

  while (sendfull)  {                 
    otask = os_running_task_id ();   
    os_wait (K_SIG, 0, 0);            
    otask = 0xff;                     
  }
  putbuf (c);                         /* send character                       */
  return (c);                         /* return character: ANSI requirement   */
}


/******************************************************************************/
/*       _getkey:  interrupt controlled _getkey                               */
/******************************************************************************/
char _getkey (void)  {
  char tmp;
  while  (iend == istart)  {
    itask = os_running_task_id ();    /* set input task number                */
    os_wait (K_SIG, 0, 0);            /* RTX-51 call: wait for signal         */
    itask = 0xff;                     /* clear input task number              */
  }
  tmp=inbuf[iend++% ILEN];
  iend=iend% ILEN;
  return (tmp);
}


/******************************************************************************/
/*       serial:  serial receiver / transmitter interrupt                     */
/******************************************************************************/
serial () interrupt 4 using 2  {     /* use registerbank 2 for interrupt      */
  unsigned char c;
  bit   start_trans = 0;

  if (RI)  {                         /* if receiver interrupt                 */
    c = SBUF;                        /* read character                        */
    RI = 0;                          /* clear interrupt request flag          */
		if(((istart+1)%ILEN)!=iend){
		  inbuf[istart++ % ILEN] = c;
		  istart=istart % ILEN;
        }
        if (itask != 0xFF) isr_send_signal (itask);
  }

  if (TI || start_trans)  { 
    TI = 0;                     
	  if(ostart!=oend){
		SBUF = outbuf[oend++ %OLEN]; 
		oend=oend%OLEN;
        sendfull = 0; 
        if (otask != 0xFF)  isr_send_signal (otask);
    }
    else sendactive = 0;            
  }

}
/******************************************************************************/
/*       serial_init: initialize serial interface                             */
/******************************************************************************/
void serial_init (void)  {
  SCON  = 0x50;                      /* mode 1: 8-bit UART, enable receiver   */
  TMOD |= 0x20;                      /* timer 1 mode 2: 8-Bit reload          */
  TH1   = 0xf4;                      /* reload value 2400 baud                */
  TR1   = 1;                         /* timer 1 run                           */
  ES    = 1;                         /* enable serial port interrupt          */
}


void PrintCh(unsigned char ch) //内部使用,不建议用户看到。
{
        if(ch>=0&&ch<=9) ch=ch+'0';
        else ch=ch+'A'-10;
        putchar(ch);
}

void insidePrintByte(unsigned char Byte) //内部使用,以十六进制格式显示1个字节数据
{
        unsigned char c;
        c=Byte;
        c=c>>4;        
        PrintCh(c);
        c=Byte;c=c&0x0F;PrintCh(c);        
}

void PrintByte(unsigned char Byte) //以十六进制格式显示1个字节数据
{
        //EA=0;        
        insidePrintByte(Byte);                
        //EA=1;
}

void insidePrintWord(unsigned int Word) //内部使用,以十六进制格式显示1个字数据
{	        
        insidePrintByte(Word>>8);
        insidePrintByte(Word&0xFF);                        
}

void PrintWord(unsigned int Word) //以十六进制格式显示1个字数据
{	
        //EA=0;
        insidePrintWord(Word);
        //EA=1;
}

void PrintLong(unsigned long LongWord) //以十六进制格式显示1个长字数据
{
        //EA=0;
        insidePrintWord(LongWord>>16);
        insidePrintWord(LongWord&0xFFFF);
        //EA=1;
}

void PrintStr(unsigned char *str) //显示字符串
{
        int i;
        unsigned char j;
        unsigned char ch;
	
        //EA=0;
        for(i=0;i<MaxLenStr;i++){
                ch=*(str+i);
                if(ch=='\0') break;
                else if(ch=='\n'){putchar(10);putchar(13);} 
                else if(ch=='\t'){
                        for(j=0;j<TABNum;j++)
                                putchar(' ');
                }
                else putchar(ch);
        }
        //EA=1;
}

void clrscr() //清屏
{        
        PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//25个回车换行清屏幕。
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -