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

📄 rs485.c

📁 输出视频的字符的软件
💻 C
字号:
/*------------------------------------------------*/
/*
串口通讯程序,分与分机通讯程序和与管理机通讯程序,
Rs_int是中断程序, 负责对通讯的接收、发送
Message_treat是主要的针对通讯以后的处理程序
*/
/*----------------------------------------------------*/
#include "defineh.h"
#include "sbitdef.h"
#include "Rs485.h"
/*----------------------------------------------------*/
extern void Count_Flash_Offset(void);

extern void Clr_Display(void);
extern void disp_detail(void);
extern void disp_main(void);
extern void No_Message_Guide(void);
extern void Inqire_Frame(void);
extern void disp_color(uchar row);
extern void init_timer2(void);
extern void init_timer0();
extern void clr_timer2();
extern void delay();

void answer_comm();
/*---------------------------------------*/
void delays60ms()
{
  uchar data j;
  uint data i;
  for(j=0;j<3;j++)
  for(i=0;i<=4000;i++);
}

/*-----------------------------------------*/
void Clr_Rx()
{	  
	Rx_bit=0;//no received a valid frame
	Rx_count=0;//count for  bytes
	Rx_sum=0; //a frame check_sum

}
/*----------------------------------------*/
void txstart()
{
 mRs485G=send;
 Tx_bit=transiting;
 Tx_count=0;
 SBUF=SENDSTART;
 Tx_sum=SENDSTART;
}
/*----------------------------------------*/
void  save_homemessage()
{
	if(*(info_buffer+1)==ALLINFO)
	   {
       lounumH=0;
       lounumL=0;
	   infonumber=*(info_buffer+5);
	   }
     else
       {	   
       lounumH=*(info_buffer+3);
       lounumL=*(info_buffer+4);
	   infonumber=*(info_buffer+5);
	   }

}
/*----------------------------------------------------*/
/*         Dec_Cem Rountine

DESCRIPTION:this rountine used to transfer a data from 10进制to 16进制
*/
/*-----------------------------------------------------*/
uchar Dec_Cem(uchar dec_data)
{
          uchar data i,k;

	      i=dec_data;
	      k=dec_data;
	      i=i>>4;
	      i=i&0x0f;

	      k=k&0x0f;
	      k=i&0x0a+k;
	      return(k);
}
/*-------------------------------------------*/
/*			   确认命令的实际意义
Description: 一共有几种方式:节能型没有下翻,03智能没有取消
             返回数据0x0f 代表下翻, 0xf0代表上翻
			 返回数据0xaa 代表取消,0x55代表确认
			 0X00代表命令无效
*/
/*-------------------------------------------*/
uchar check_page_command()
{
	  
      if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==NEXTMSN))
       {
      	Clr_Rx();
        return (pagedown);     //MEAN PAGE DOWN
        }

	 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==UPMSN))
        {
	    Clr_Rx();
	    return( pageup);    //MEAN  PAGE UP
        }

	 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==CANCELMSN))
        {
	    Clr_Rx();
	    return( cancel);    //MEAN  cancel
        }

	 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==DELMSN))
        {
	    Clr_Rx();
	    return( delete);    //MEAN  cancel
		}

	 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==CONFIRMMSN))
        {
	    Clr_Rx();
	    return( confirm);    //MEAN  PAGE UP
        }

	 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==EXTEXIT))
        {
	    Clr_Rx();
	    return( exit);    //MEAN  PAGE UP
        }
     else
     	{
	 Clr_Rx();
     return( 0x00);
     	}
	 
}
/*------------------------------------------*/
/*          进入信息处理周期
描述:
             进入前带来有关楼层信息:号码,户内形式,
             进入后,通过纪录信息的情况变量 self_bigoffset,self_smalloffset; pub_bigoffset,pub_smalloffset;
             以及wink_offset
*/
/*---------------------------------------------*/
void message_treat()                /*返回应答*/
{
    uchar data  i;
     
	 answer_comm();
	 
	 read_block=0x1000*(0X20*(Dec_Cem(lounumH)+Dec_Cem(lounumL-1)/0x10)+Dec_Cem(lounumL-1)%0x10); //房号<33..读编号x0x10,读信息初识地址x1000
     address_pointer=read_block;
	 Count_Flash_Offset();

	 self_newscount=offset_biggest;	      //现在offset_biggest记录的是信息数量
	 self_smalloffset=offset_smallest;   //现在已经修改,offset_smallest记录的是最小的位置
     self_bigoffset=offset_biggestplace;

     read_block=0x00000000;
	 Count_Flash_Offset();
	 pub_newscount=offset_biggest;	    //现在offset_biggest记录的是信息数量
	 pub_smalloffset=offset_smallest;  //现在已经修改,offset_smallest记录的是最小的位置
     pub_bigoffset=offset_biggestplace;
		
	 wink_offset=self_newscount+pub_newscount;
	 Clr_Display();

	 if(wink_offset==0)
	 	{
	     No_Message_Guide();
		}
     else
		{
		 disp_detail();
		 }

	 CNTRL=TRUE; //USED TO RELAY
     init_timer2();
		
   while((timeout2<0x3e8)&&EnWork_bit)    //lookup message for 30s or home-user close,finished a cycle
   	{
	 if(Rx_bit)
		{
         i=check_page_command();
		}

	  if(((self_newscount+pub_newscount)==0)&&(i==exit)) //NO MESSAGE,if push the spec key ,out the operation
	    {
         EnWork_bit=FALSE;
		 i=0;
	     }

		else if((i==pagedown)&&((self_newscount+pub_newscount)!=0)) 
		{
		  if(wink_offset!=0)
				{
			        wink_offset--;
					if((self_newscount+pub_newscount-wink_offset)%rowcharacter==0)  //换页
					{
					Clr_Display();
                    disp_detail();
					disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
					}
					else
					{
			         disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
				    }
				}
				else			 //到达最后,等待退出到上一层
				{
				   Inqire_Frame();
				   i=0;
				   while((timeout2<0x3e8)&&(i!=pagedown)&&((i!=cancel)&&(kindBYTE==1)))
				      {
					   if(Rx_bit)
					      {
						   i=check_page_command();
						   }
					   }
					Clr_Display();
					wink_offset=self_newscount+pub_newscount;
					disp_detail();
					disp_color(0);
				}
		i=0;
		}
		
		else if((i==pageup)&&(self_newscount+pub_newscount!=0))
		{
		        if(wink_offset==(self_newscount+pub_newscount))            //top of the detail
				{
                 EnWork_bit=0;
				 }
			else
				{
				 wink_offset++;
				if((self_newscount+pub_newscount-wink_offset)%rowcharacter==0)  //换页
					   {
						Clr_Display();
                        disp_detail();
						disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
					    }
					else
					    {
			             disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
					    }
				}
		i=0;
		}
			
		else if((i==exit)&&(self_newscount+pub_newscount!=0))
		{
         EnWork_bit=FALSE;
		 i=0;
		}
		
		else if((i==confirm)&&(self_newscount+pub_newscount!=0))
		{
			Clr_Display();
            disp_main();
			i=0;
			while ((timeout2<0x3e8)&&(i!=pagedown)&&(i!=cancel))
				{
				if(Rx_bit)
					{
				       i=check_page_command();
					if(((i==cancel)&&(kindBYTE))||(i==pagedown))
						{
				         Clr_Display();
				         Inqire_Frame();
						}
					}
				}
			   i=0;
			   while ((timeout2<0x3e8)&&(i!=confirm)&&(i!=pageup))
			    {			   
				   if(Rx_bit)
				   	{
				     i=check_page_command();
					 Clr_Display();
					 disp_detail();
				   	}
                 }
		i=0;
	 	}
//------------------------------------------------------------------
		else
		{
		i=0;
		}
   	}
	CNTRL=FALSE;		 //USED TO RELAY
	clr_timer2();

	Enwork_bit=0;
	Clr_Display();
}
/*-----------------------------------------*/
void answer_comm()                        /*主机发数据到分机,填好数据,检测是否空闲,发出*/
{
  
  uchar data m;

	 Tx_buffer[0]=MSNCMMD;
     Tx_sum=Tx_sum+Tx_buffer[0];
	   	
       if(kindBYTE)
       {
   	    Tx_buffer[1]=0xf0;
       }
	 else
	 {
	 Tx_buffer[1]=0x00;
	 }
	 Tx_sum=Tx_sum+Tx_buffer[1];
	 
   	Tx_buffer[2]=lounumH;
	 Tx_sum=Tx_sum+Tx_buffer[2];
	 
  	Tx_buffer[3]=lounumL;
	 Tx_sum=Tx_sum+Tx_buffer[3];

	Tx_buffer[4]=myaddr;
	 Tx_sum=Tx_sum+Tx_buffer[4];
	 
	Tx_buffer[5]=valid;
	 Tx_sum=Tx_sum+Tx_buffer[5];

        for(m=6;m<11;m++)
        	{
        	Tx_buffer[m]=0;
        	}

	if(Rxrun_bit)
	{
	 delays60ms();
	 }
       txstart();
	 delays60ms();
}
/*-------------------------------------------*/
/*


*/
/*-------------------------------------------*/
void  RS_int() interrupt 4
{

 unsigned char data Rxdata=0;
 if(RI)
   {
    RI=0;
    Rxdata=SBUF;

    if(Rx_count==0)
        {
		   init_timer0();
           if((Rxdata==SENDSTART)||(Rxdata==RESEIVESTART))
           {
           *info_buffer=Rxdata;
           Rx_count++;
           Rx_sum=Rxdata;
	       Rxrun_bit=1;
            }
         }

     else if((Rx_count==0x07)&&(Rx_sum==Rxdata))
         {
        	if(*info_buffer==RESEIVESTART)
                {
         	   Rx_bit=1;
		       Rxrun_bit=0;
			   TR0=0;	    //not used T0 timer
                 }
          }

    else if((Rx_count==15)&&(Rx_sum==Rxdata))
        {
         	if(*info_buffer==SENDSTART)
                {
         	   Rx_bit=1;
		       Rxrun_bit=0;
			   TR0=0;	    //not used T0 timer
                 }
         }

         else if(Rx_count>15)
          {
          if((Rx_count==(*(info_buffer+5)+6))&&(Rx_sum==Rxdata)&&(*info_buffer==SENDSTART))
             {
              Rx_bit=1;
	          Rxrun_bit=0;
			  TR0=0;	    //not used T0 timer
              }
           else if(Rx_count<(*(info_buffer+5)+6))
              {
               *(info_buffer+Rx_count)=Rxdata;
               Rx_count++;
               Rx_sum+=Rxdata;
              }
			else
			  {
			  if(!Rx_bit)
			     {
			      Clr_Rx();
			      }
			  }
           }

          else
           {
            *(info_buffer+Rx_count)=Rxdata;
            Rx_count++;
            Rx_sum+=Rxdata;
            }
     }

 if(TI)
    {
      TI=0;
	    if(Tx_count<14)
         	{
         	SBUF=Tx_buffer[Tx_count];
          	Tx_sum=Tx_buffer[Tx_count]+Tx_sum;
          	Tx_count++;
         	}

       else if(Tx_count==14)
         	{
          	SBUF=Tx_sum;
          	Tx_count++;
         	}
       else
         	{
          	Tx_bit=0;
            mRs485G=1;
            Tx_count=0;
         	}
	}
}



//这是备用功能,作为删除信息时候的功能
/*
		else if(i==delete)
		{
			Clr_Display();
            Inqire_Frame();
			i=0;
			while ((timeout2<0x2ee)&&(i!=confirm)&&(i!=cancel))
				{
                 if(Rxrun_bit)
                    {
                     init_timer0();
                     }
				if(Rx_bit)
					{
				    i=check_page_command();
					if(((i==cancel)&&(kindBYTE))||(i==pagedown))
						{
				         Clr_Display();
				         Inqire_Frame();
						}
					}
				}
			   i=0;
			   while((timeout2<0x2ee)&&(i!=confirm)&&(i!=pageup))
			      {		   
				   if(Rx_bit)
				   	   {
				        i=check_page_command();
					    Clr_Display();
					    disp_detail();
				   	    }
                   }
	    i=0;
	 	}
*/

⌨️ 快捷键说明

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