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

📄 tpublic.c

📁 电力变电站RTU监控软件(80C196NT单片机) 遥控
💻 C
📖 第 1 页 / 共 5 页
字号:

unsigned char CreateATask(unsigned char TaskNo,int MessageLimit,PVOID *Args,void  *TaskFunc,unsigned char UpTaskNo,unsigned char DownTaskNo)
{
    if(!Task[TaskNo].Use) // 该任务没有被占用
    {
	  Task[TaskNo].Use=0xff;
	  Task[TaskNo].WaitStatus=0;
	  Task[TaskNo].MailQueueLimit=MessageLimit;
	  Task[TaskNo].MailQueueLength=0;
	  if(MessageLimit!=0) Task[TaskNo].WaitControl=0x20; //禁止任务运行;
		  else	      Task[TaskNo].WaitControl=0x00;
	  Task[TaskNo].Args=Args;
	  Task[TaskNo].TaskFunc=(void(*)(PVOID	*))TaskFunc;
	  Task[TaskNo].UpTaskNo=UpTaskNo;
	  Task[TaskNo].DownTskNo=DownTaskNo;
	  return(0xff);   //成功
    };
    return  0;	     //任务号被占用
}

void outbyt(unsigned char dat)
{
    int  i;
    clrbit(&p6_dir,5);	 /* P6.5=SO=outport	  */
    for(i=0;i<8;i++)
    {
	clrbit(&p6_reg,4);	 /* P6.4=SCK  clr  SCK */
	if((dat & 0x80)==0)  clrbit(&p6_reg,5);
	      else	     setbit(&p6_reg,5);
	dat=dat*2;
	setbit(&p6_reg,4);	 /* P6.4=SCK  setb SCK */
    }
    setbit(&p6_reg,5);
}

unsigned char inbyt(void)
{
    unsigned char ch,p6value;
    int  i;
    setbit(&p6_reg,5);	 /* P6.5作为输入口必须先置 1  */
    setbit(&p6_dir,5);	 /* P6.5=SO=inport	 */
    ch=0;
    for(i=0;i<8;i++)
    {
	setbit(&p6_reg,4);	 /* P6.4=SCK  setb SCK */
	clrbit(&p6_reg,4);	 /* P6.4=SCK  clr  SCK */
	p6value=p6_pin;
	p6value=p6value & 0x20;
	switch(i)
	{
	  case	0x00:if(p6value!=0)  ch=ch | 0x80;
		     break;
	  case	0x01:if(p6value!=0)  ch=ch | 0x40;
		     break;
	  case	0x02:if(p6value!=0)  ch=ch | 0x20;
		     break;
	  case	0x03:if(p6value!=0)  ch=ch | 0x10;
		     break;
	  case	0x04:if(p6value!=0)  ch=ch | 0x08;
		     break;
	  case	0x05:if(p6value!=0)  ch=ch | 0x04;
		     break;
	  case	0x06:if(p6value!=0)  ch=ch | 0x02;
		     break;
	  case	0x07:if(p6value!=0)  ch=ch | 0x01;
		     break;
	}
    }
    return  ch;
}

void Wip_Poll(void)
{
    int  i;
    unsigned char ch;
    for(i=0;i<MAX_POLL;i++)
    {
       ch=Rdsr_Cmd();//读状态寄存器
       ch=ch & 0x01;
       if(ch==0) break;
    }
    clrbit(&p6_reg,7);	     /* P6.7=/WP  clrb /WP */
}

void Wren_Cmd(void)//写允许命令 SCK=P6.4  SO=SI=P6.5  CS=P6.6  WP=P6.7
{
     setbit(&p6_reg,7);       /* P6.7=/WP  setb /WP */
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(WREN_INST);       /* 设置写使能锁存器(允许写操作)*/
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
}


void Wrdi_Cmd(void)//禁止写操作 SCK=P6.4  SO=SI=P6.5  CS=P6.6  WP=P6.7
{
     setbit(&p6_reg,7);       /* P6.7=/WP  setb /WP */
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(WRDI_INST);       /* 复位写使能锁存器(允许写禁止)*/
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
}

void Wrsr_Cmd(void)//写状态寄存器 SCK=P6.4  SO=SI=P6.5	CS=P6.6  WP=P6.7
{
     setbit(&p6_reg,7);       /* P6.7=/WP  setb /WP */
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(WRSR_INST);       /* 写状态寄存器(块锁定位)*/
     outbyt(STATUS_REG);      /* 写状态寄存器(块锁定位)*/
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
     Wip_Poll();
}

void Wrsr_Clr(void)//写状态寄存器 SCK=P6.4  SO=SI=P6.5	CS=P6.6  WP=P6.7
{
     setbit(&p6_reg,7);       /* P6.7=/WP  setb /WP */
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(WRSR_INST);       /* 写状态寄存器(块锁定位)*/
     outbyt(0x30);	      /* 写状态寄存器(块锁定位)*/
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
     Wip_Poll();
}


unsigned char  Rdsr_Cmd(void)//读状态寄存器 SCK=P6.4  SO=SI=P6.5  CS=P6.6  WP=P6.7
{
     unsigned char  ch;
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(RDSR_INST);       /* 读状态寄存器	    */
     ch=inbyt();
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
     return  ch;
}

void Byte_Write(unsigned int adr,unsigned char dat)
{//写一个字节 SCK=P6.4	SO=SI=P6.5  CS=P6.6  WP=P6.7
     unsigned  char  ch;
     union WTEMP_ST  t;

     setbit(&p6_reg,7);       /* P6.7=/WP  setb /WP */
     t.Word=adr;
     ch=WRITE_INST;
     if(t.B.High>0)  ch=ch  | 0x08; /*	A8=1  */
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(ch);
     outbyt(t.B.Low);
     outbyt(dat);
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
     Wip_Poll();
}

unsigned char Byte_Read(unsigned int adr)
{//读一个字节 SCK=P6.4	SO=SI=P6.5  CS=P6.6  WP=P6.7
     unsigned  char  ch;
     union WTEMP_ST  t;

     t.Word=adr;
     ch=READ_INST;
     if(t.B.High>0)  ch=ch  | 0x08; /*	A8=1  */
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     outbyt(ch);
     outbyt(t.B.Low);
     ch=inbyt();
     clrbit(&p6_reg,4);       /* P6.4=SCK  clr	SCK */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
     return  ch;
}

void rst_wdog(void)
{
     clrbit(&p6_reg,6);       /* P6.6=CS   clr	CS  */
     setbit(&p6_reg,6);       /* P6.6=CS   setb CS  */
}

void wdog(void)
{
     watchdog=0x1e;
     watchdog=0xe1;
}

unsigned char init1821(void)
{
  unsigned char  ch,vb;
  int  i;
  vb=0;
  outportb(PSD_DIRECTION_A,	   0x00); /* inport */
  ch=inportb(PSD_DATAIN_A);
  ch=ch | 0x02;
  outportb(PSD_DIRECTION_A,	   0xff); /*outport */
  outportb(PSD_DATAOUT_A,	   ch);
  ch=ch &  0xfd;
  outportb(PSD_DATAOUT_A,	   ch);
  for(i=0;i<300;i++)
  {
    ch=0;
  }
  ch=ch | 0x02;
  outportb(PSD_DATAOUT_A,	   ch);
  outportb(PSD_DIRECTION_A,	   0x00); /* inport */
  for(i=0;i<200;i++)
  {
     ch=inportb(PSD_DATAIN_A);
     if((ch & 0x02)==0)
     {
       vb=0xff;
       break;
     }
  }
  return  vb;
}


void Send00(unsigned char ch)
{
     sbuf_tx=ch;
     ComHandle[2]->Status=1; //txd;
}

void Send01(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM01].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}

void Send02(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM02].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}
void Send03(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM03].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}
void Send04(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM04].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}
void Send05(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM05].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}
void Send06(char ch)

{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM06].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}
void Send07(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM07].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}
void Send08(char ch)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNoCOM08].DevPtr;//设备驱动表指针
     Com->Status=1; //txd;
}

void PauseSend(int TaskNo)
{
     Task[TaskNo].WaitControl &=0xfe;
}

void StopTxd(int TaskNo)  //暂停发送
{
     disable();
     Task[TaskNo].WaitControl &=0xfe;
     Task[TaskNo].WaitStatus &=0xfe;
     enable();
}

void ChangeProWarn(int TaskNo,char Txd,char ProWarnNum)
{
     struct TComStruct FARDATA *Com;
     Com=(struct TComStruct *)Task[TaskNo].DevPtr;//设备驱动表指针
     disable();
     if(Txd)
     {
	    Com->TxdProWarn=ProWarnNum;
	    if(Com->TxdBufLength >= ProWarnNum) Task[TaskNo].WaitStatus &=0xfe;
		else				Task[TaskNo].WaitStatus =0x01;
     }else
     {
	    Com->RxdProWarn=ProWarnNum;
	    if(Com->RxdBufLength < ProWarnNum)	Task[TaskNo].WaitStatus &=0xfd;
	       else				Task[TaskNo].WaitStatus =0x02;
     };
     enable();
}

void WatchDogCom00(struct TComStruct FARDATA *ComHandle)
{
//   struct TIEC101LinkStruct FARDATA *arg;
//   ResetTimer(TaskNoCOM00);
//   arg=(struct TIEC101LinkStruct FARDATA *)Task[Task[TaskNoCOM00].UpTaskNo].Args;
//   if(TaskStatus(TaskNoCOM00) & 0x02) IEC101LinkRx(arg);// Rx Task
//   if(TaskStatus(TaskNoCOM00) & 0x01) IEC101LinkTx(arg);// Tx Task

}

void DeviceCom00(struct TComStruct FARDATA *ComHandle)
{
     sp_baud=0x8208; /*  2400BPS		 */
     sp_con=0x09;    /*  模式一 		 */
     p2_reg  |=0xff;
     p2_dir  &=0xfe; /*  TXD输出		 */
     p2_mode |=0x03; /*  P2.0 P2.1为特殊功能方式 */
     ComHandle->TxdProWarn=1;
     ComHandle->RxdProWarn=1;
     ComHandle->ResetNum++;
//   int_mask1=int_mask1 | SRXD_INT_BIT | STXD_INT_BIT;
//   fft_reg[4]=0xaa;
}

void FARDATA *InitCom(unsigned char ComNo)
{
     struct TComStruct FARDATA *arg;
     int  i,j;
     arg=NULL;
     switch(ComNo)
     {
	case  0x00:i=TaskNoCOM00;
		  // j=TaskNoCOM00;
		   arg=(struct TComStruct FARDATA *)malloc(sizeof(struct  TComStruct));
//		   fft_reg[2]=0xaa;
		   if(arg!=NULL)
		   {
//		      fft_reg[3]=0xaa;
		      Task[i].DevPtr=(PVOID *)arg; //设备驱动表指针
		      Task[i].DeviceFunc=(void(*)(PVOID  *))DeviceCom00;
		      arg->SendFunc=Send00;
		      arg->Status=0x02;   //Wait
		      arg->TxdBufHead=0;
		      arg->TxdBufTail=0;
		      arg->TxdBufLength=0;
		      if(arg->TxdBuf) free(arg->TxdBuf);
		      arg->TxdBuf=(unsigned char FARDATA *)malloc(1200);
		      arg->TxdBufSize=256;
		      arg->TxdProWarn=1;
		      arg->RxdBufHead=0;
		      arg->RxdBufTail=0;
		      arg->RxdBufLength=0;
		      if(arg->RxdBuf)free(arg->RxdBuf);
		      arg->RxdBuf=(unsigned int FARDATA *)malloc(1200*(sizeof(int)));
		      arg->RxdBufSize=256;
		      arg->RxdProWarn=1;
		      arg->ResetNum=0;
		      Task[i].WaitControl |=0x03; //允许接收 //允许发送
		      CreateATask(i,10,(PVOID *)arg,WatchDogCom00,j,0xff);
		      SetTimer(i,0);
		   }
		   break;
	   default:arg=NULL;
		   break;
     }
     return (PVOID *)arg;
}

void FARDATA *CreateComProtocolTask(unsigned char TaskNo,unsigned char ProtocolType)
{
     void  FARDATA *arg;
     arg=NULL;
     switch(ProtocolType)
     {
	  case 00://arg=(void FARDATA *)InitIEC101Link(TaskNo);
		  //if(arg!=NULL)//IEC101Link链路层
		  //{
		  //   CreateATask(TaskNo+UPOffset,10,arg,IEC101Link,0xff,TaskNo);
		  //   SetTimer(TaskNo+UPOffset,0);
		  //   ChangeProWarn(TaskNo,1,1);
		  //   ChangeProWarn(TaskNo,0,1);
/*		     arg=(void FARDATA *)InitIEC101User(TaskNo);
		     if(arg!=NULL)//IEC101User用户层
		     {
			CreateATask(TaskNo+UPOffset+UPOffset,10,arg,IEC101User,0xff,TaskNo);
			SetTimer(TaskNo+UPOffset+UPOffset,0);
		     } */
//		  }
		  arg=NULL;
		  break;
	  default:arg=NULL;
		  break;
     }
     return arg;
}

void CreateComTask(void)
{
     void  FARDATA *argx,*argy;
     int   i;
     for(i=0;i<MAXCOMNUM;i++) /* 串行通信规约配置表 */
     {
	 if(ComConfig[i].Use!=0)
	 {
	    argx=CreateComProtocolTask(i,ComConfig[i].Com);
	    if(argx!=NULL)
	    {
	       argy=InitCom(i);
	       if(argy==NULL)
	       {
//		  fft_reg[0]=0xaa;
		  free(argx);
//		  Task[i+UPOffset].Use=0;
	       }else
	       {
//		  fft_reg[1]=0xaa;
		  (*(Task[i].DeviceFunc))(Task[i].DevPtr);
	       }
	    }
	 }
     }
}


unsigned char flash_boot_write_with_poll(unsigned int addr,unsigned int data)
{
	register unsigned int portid;
	register unsigned int	value;

	unsigned char done;
	unsigned int error;
	unsigned char err;
	unsigned int poll;

	done = FALSE;
	err = FALSE;
	portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
	value=0xAAAA;
	asm    st  value,  [portid];

	portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
	value=0x5555;
	asm    st  value,  [portid];

	portid=FLASH_COMMON_BOOT_XAAA; // write 0xA0 command to program
	value=0xA0A0;
	asm    st  value,  [portid];
	portid=addr;
	value=data;
	asm    st  value,  [portid];  // write word to flash
	data = data & NVM_DATA_POLL;		// get bit DQ7 of original data word

	do					// now use data polling method to verify successful write
	{
		asm    ld  value,  [portid];
		poll=value;			// Read the location that was just programmed
		error= poll & NVM_ERROR;	// save timeout error bit
		poll = poll & NVM_DATA_POLL;	// get poll bit of the word read from flash
		if (data == poll) done = TRUE;	// compare data polling bit
		else if (error ==  NVM_ERROR )	// check for timeout error
			err = TRUE;		// indicate timeout error occurred
		rst_wdog();
	}while((done == FALSE) && (err == FALSE));

	if (err == TRUE)			// make sure timeout error and data poll didn't
	{
		asm    ld  value,  [portid];   // Read location in flash again
		poll=value;
		poll = poll & NVM_DATA_POLL;	// get poll bit of  word just read from flash
		if (data==poll) done = TRUE;	// compare poll bit

		portid=FLASH_COMMON_BOOT_X554;
		value=0xf0f0;
		asm    st  value,  [portid];  // reset the flash array (short reset instruction)
	}
	yktest[31]++;
	return(done);	      // a successful flash write returns 1, timeout error returns 0
}

unsigned char flash_boot_erase_sector(unsigned int sector_erase_address)
{
	unsigned char done;
	unsigned int poll;
	unsigned int error;
	unsigned char err;

	register unsigned int portid;
	register unsigned int	value;

	done = FALSE;
	err = FALSE;
	portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
	value=0xAAAA;
	asm    st  value,  [portid];
	portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
	value=0x5555;
	asm    st  value,  [portid];
	portid=FLASH_COMMON_BOOT_XAAA; // write 0x80 command to erase entire chip
	value=0x8080;
	asm    st  value,  [portid];
	value=0xAAAA;
	asm    st  value,  [portid];  // continue unlock sequence
	portid=FLASH_COMMON_BOOT_X554; // continue unlock sequence
	value=0x5555;
	asm    st  value,  [portid];

	portid=sector_erase_address;
	value=0x3030;		       // write 0x30 command to one  sector erase command
	asm    st  value,  [portid];

	do  // now use data polling method to verify successful erase
	{
	       asm    ld  value,  [portid];
	       poll=value;	       // read flash status from any address
	       error = poll & NVM_ERROR;	       // save timeout error bit
	       poll = poll & NVM_DATA_POLL;	       // get poll bit of the word read from flash

⌨️ 快捷键说明

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