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

📄 tpublic.c

📁 电力变电站RTU监控软件(80C196NT单片机) 遥控
💻 C
📖 第 1 页 / 共 5 页
字号:
//
// File name =TPUBLIC.C
// 设计 何风涛

#include "class.h"
#include "classext.h"
#include"lcd.c"

int Tputc(int ComNo,char ch)  //向串行口发送字符
{
    struct TComStruct FARDATA	*Com;

    Com=ComHandle[ComNo];
    Task[ComNo].WaitControl |=01;
    disable();
    if(Com->Status==2)	 // Wait
    {
	(*Com->SendFunc)(ch);
	enable();
	return(0xff);
    };
    enable();
    if(Com->TxdBufLength >= 255)     return(0);
    *(Com->TxdBuf+Com->TxdBufFront++)=ch;
    disable();
    Com->TxdBufLength++;
    if(Com->TxdBufLength>=Com->TxdProWarn) Task[ComNo].WaitStatus &=0xFE;
    enable();
    return(0xff);
}

// 发送一个字符串到串行口缓冲区, ComNo为串行口号,*Sum指向需发送的字符的数目.
// *S指向需发送的字符缓冲区.
//返回值 ff,失败, *Sum返回的是本次实际发送字符的个数.
//每次最多可发送255个字符.
int  Tputs(int ComNo,unsigned char *Sum,char *S)
{
     unsigned char RealSum,End,i,ch,Sptr=0;
     struct TComStruct FARDATA	 *Com;

     Task[ComNo].WaitControl |=01;
     Com=ComHandle[ComNo];
     if(!*Sum) return(0xff);
     if((*Sum + Com->TxdBufLength) >= 255)
     {
	   RealSum=255-Com->TxdBufLength;
	   End=RealSum+Com->TxdBufFront;
	   for(i=Com->TxdBufFront;i!=End;i++) *(Com->TxdBuf+i)=S[Sptr++];
	   *Sum -=RealSum;
     }else
     {
	   RealSum=*Sum;
	   End=Com->TxdBufFront + *Sum ;
	   for(i=Com->TxdBufFront;i!=End;i++)*(Com->TxdBuf+i)=S[Sptr++];
	   *Sum=0;
     };
     Com->TxdBufFront=i;
     disable();
     Com->TxdBufLength +=RealSum;
     if(Com->TxdBufLength >= Com->TxdProWarn) Task[ComNo].WaitStatus &=0xFE;

     if(Com->Status==02) //Wait
     {
	  if(Com->TxdBufLength)
	  {
	     Com->TxdBufLength--;
	     ch=*(Com->TxdBuf+Com->TxdBufRear++);
	     (*Com->SendFunc)(ch);
	  };
     }
     enable();
     return(*Sum);
}
//从串行口接收缓冲区取一字符串,ComNo是串行口号,Sum是本次欲接收字符的数目,
// *s是为接收字符串而准备的缓冲区.
// 返回值,实际接收字符的数目.
int Tgets(int ComNo,int Sum,int *s)
{
    int i,j,Num;
    struct TComStruct FARDATA	*Com;

    Com=ComHandle[ComNo];
    disable();
    if(Com->RxdBufLength<Sum) Sum=Com->RxdBufLength;
    enable();
    for(i=0;i<Sum;i++)	*(s+i)=*(Com->RxdBuf+Com->RxdBufRear++);
    disable();
    Com->RxdBufLength -=Sum;
    if(Com->RxdBufLength<Com->RxdProWarn) Task[ComNo].WaitStatus &=0xfd;
    enable();
    return(Sum);
}

//  从串行口接收缓冲区取一字符,ComNo是串行口号,
//  返回值:低位,接收的字符,高位,00 接收正确,非0,出错.
int  Tgetc(int ComNo)
{
     struct TComStruct FARDATA	 *Com;
     int RetCode;

     Com=ComHandle[ComNo];
     if(Com->RxdBufLength==0)  return(0xff00);
     disable();
     Com->RxdBufLength--;
     RetCode=*(Com->RxdBuf+Com->RxdBufRear++);
     if(Com->RxdBufLength<Com->RxdProWarn) Task[ComNo].WaitStatus &=0xfd;
     enable();
     return(RetCode);
}


void outportb(register unsigned long portid, register unsigned char  value)
{
     asm  estb	 value,  [portid];
}
unsigned  char	inportb(register unsigned long portid)
{
     register unsigned char  value;
     asm  eldb	 value,  [portid];
     return(value);
}

void outport(register unsigned long portid, register unsigned int   value)
{
     asm  est	 value,  [portid];
}


unsigned char bittstb(unsigned char FARDATA *pch, int n)
{
     register unsigned long portid;
     register unsigned char  value,ch;

     portid=(unsigned long)pch;
     ch=0;
     switch(n)
     {
	   case 0x00:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 0,    BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x01:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 1,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x02:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 2,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x03:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 3,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x04:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 4,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x05:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 5,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x06:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 6,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x07:asm
		     {
			 eldb	value,	[portid];
			 bbc	value,	 7,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x08:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 0,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x09:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 1,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x0a:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 2,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x0b:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 3,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x0c:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 4,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x0d:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 5,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x0e:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 6,	 BTEND;
			 negb	ch;
		     }
		     break;
	   case 0x0f:asm
		     {
			 eldb	value,	 1[portid];
			 bbc	value,	 7,	 BTEND;
			 negb	ch;
		     }
		     break;
	  default:   break;
     }
BTEND:return  ch;
}


void setbit(volatile unsigned char near *p,register unsigned char value)
{
     register unsigned long  eadr;
     eadr=(unsigned long)p;
     switch(value)
     {
	  case 0x00:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x01;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x01:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x02;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x02:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x04;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x03:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x08;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x04:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x10;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x05:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x20;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x06:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x40;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x07:asm
		    {	  eldb value,  [eadr];
			  orb  value,  #0x80;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x08:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x01;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x09:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x02;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0A:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x04;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0B:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x08;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0C:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x10;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0D:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x20;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0E:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x40;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0F:asm
		    {	  eldb value, 1[eadr];
			  orb  value,  #0x80;
			  estb value, 1[eadr];
		    }
		    break;
	  default:  break;
     }
}

void clrbit(volatile unsigned char near *p,register unsigned char value)
{
     register unsigned long  eadr;
     eadr=(unsigned long)p;
     switch(value)
     {
	  case 0x00:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xFE;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x01:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xFD;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x02:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xFB;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x03:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xF7;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x04:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xEF;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x05:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xDF;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x06:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0xBF;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x07:asm
		    {	  eldb value,  [eadr];
			  andb value,  #0x7F;
			  estb value,  [eadr];
		    }
		    break;
	  case 0x08:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xFE;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x09:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xFD;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0A:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xFB;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0B:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xF7;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0C:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xEF;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0D:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xDF;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0E:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0xBF;
			  estb value, 1[eadr];
		    }
		    break;
	  case 0x0F:asm
		    {	  eldb value, 1[eadr];
			  andb value,  #0x7F;
			  estb value, 1[eadr];
		    }
		    break;
	  default:  break;
     }
}

void SetTimer(char TaskNo,unsigned int Time)
{  //------设置内部定时器间隔
     disable();
     Task[TaskNo].TimerLimit=Time;
     Task[TaskNo].TimerCount=Time;
     Task[TaskNo].WaitStatus &=0x7f;
     if(Time!=0)				 //if not '0'
     {
	      Task[TaskNo].WaitControl |=0x80;	 // Enable timer mode
     }else    Task[TaskNo].WaitControl &=0x07f;  // Close  timer mode
     enable();
}

void Wait(char TaskNo,unsigned int WaitTime)
{
 disable();
 Task[TaskNo].WaitControl |=0x40;
 Task[TaskNo].OverWaitCount=WaitTime;
 enable();
}

void   receive_enable(char TaskNo)
{
 disable();
 Task[TaskNo].WaitControl |=0x12;
 enable();
}

void   trans_enable(char TaskNo)
{
 disable();
 Task[TaskNo].WaitControl |=0x01;
 enable();
}

void ResetWait(char TaskNo)
{
 disable();
 Task[TaskNo].WaitControl &=0xbf;
 Task[TaskNo].WaitStatus &=0xbf;
 enable();
}

void ResetTaskReset(char TaskNo)
{
 disable();
 Task[TaskNo].ResetNum=0;  //复位次数
 enable();
}

void ResetTimer(char TaskNo)
{
 disable();
 Task[TaskNo].WaitStatus &=0x07f;
 enable();
}

unsigned char TaskStatus(int TaskNo)
{
 return(Task[TaskNo].WaitStatus);
}

⌨️ 快捷键说明

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