slavewr.c

来自「该程序是pic单片机程序」· C语言 代码 · 共 257 行

C
257
字号
#include <pic.h>
#include "slaveWR.h"

unsigned char Saddress,Scommand,Sdata,SendData,Scommand2;
persistent unsigned char TransData[15];

void  Slave_Transmit(unsigned char senddata)  //从机发送
{
   while(STAT_BF==1)
    {
     ;
    }  //判断Buffer状态
  
   while(WCOL==1)         //判断是否有冲突
      {
       WCOL=0;             //清Write Collision 
       }    
   SSPBUF=senddata;    //送入要转送的数据入Buffer
   
   CKP=1;               //释放时钟信号   

}
////////////////////////////////////////////////////////////
unsigned char Slave_Receive()
{
  unsigned char receivedata;
  while(SSPOV==1)     //判断是否有接收冲突
   {
     SSPOV=0;    
    }   
  
  receivedata=SSPBUF;  //取走缓冲里的数据,清缓存
  return(receivedata);

} 	
////////////////////////////////////////////////////////
unsigned char Read_INTERNAL_EEPROM(unsigned char EEPROM_Address)  //Read internal EEPROM of PIC16F873A
{
  unsigned char eepromdata;
  EEADR=EEPROM_Address;      //Get address 
  EEPGD=0;                   //Point to EEPROM data memory.
  RD=1;                      //Start Read Operation.
  eepromdata=EEDATA;         //Get data
  
  return(eepromdata);       //return the needing data.
}
////////////////////////////////////////////////////////////
void Write_INTERNAL_EEPROM(unsigned char EEPROM_Address,unsigned char EEPROM_Data)  //Write data into internal eeprom
{
  EEADR=EEPROM_Address; //Put address into Address Register
  EEDATA=EEPROM_Data;   //Put data into Data Register
  EEPGD=0;              //Select data EEPROM for Writing.
  WREN=1;               //Enable Write function.
  GIE=0;                //Disable All Interrupt.
  EECON2=0X55;          //Write Sequence control.
  EECON2=0XAA;  
  WR=1;                 //Start EEPROM Write operation.
  GIE=1;                //Enable Interrupt
  WREN=0;               //Write protect
  while(WR==1)          //Waiting for Writing completed.
  {
    ;
   }
 

}
///////////////////////////////////////////////////////////////////////
unsigned char Read_INTERNAL_EEPROM_MAIN(unsigned char EEPROM_Address)  //Read internal EEPROM of PIC16F873A
{
  unsigned char eepromdata;
  EEADR=EEPROM_Address;      //Get address 
  EEPGD=0;                   //Point to EEPROM data memory.
  RD=1;                      //Start Read Operation.
  eepromdata=EEDATA;         //Get data
  
  return(eepromdata);       //return the needing data.
}
////////////////////////////////////////////////////////////
void Write_INTERNAL_EEPROM_MAIN(unsigned char EEPROM_Address,unsigned char EEPROM_Data)  //Write data into internal eeprom
{
  EEADR=EEPROM_Address; //Put address into Address Register
  EEDATA=EEPROM_Data;   //Put data into Data Register
  EEPGD=0;              //Select data EEPROM for Writing.
  WREN=1;               //Enable Write function.
  GIE=0;                //Disable All Interrupt.
  EECON2=0X55;          //Write Sequence control.
  EECON2=0XAA;  
  WR=1;                 //Start EEPROM Write operation.
  GIE=1;                //Enable Interrupt
  WREN=0;               //Write protect
  while(WR==1)          //Waiting for Writing completed.
  {
    ;
   }
 

}


/////////////////////////////////////////////////////////
void  SSP_Handle()
{  
   unsigned char S_temp;
    
  // for(times=0;times<150;times++) {};   //,times

   S_temp=SSPSTAT & 0X3D;  // "00111101" 屏蔽不用的位 in SSPSTAT
   
   if(Scommand2==0xF0)      //If master Write operation and master is writing data after writing command, Checking Writing data station
     {
       S_temp=0x31; 
       Scommand2=0x0F;      //clear station
      }


   switch(S_temp)
   {case 0x09:                //"00001001" Master Write operation,P=0,S=1, last byte was address,buffer is full.
         Saddress=SSPBUF;     //Get address and clear buffer.
          //PORTB=Saddress;      //***************B口显示数据***********************//
          break;
    case 0x29:                    //"00101001" Msater Write operation,last byte was data,S=1,P=0,buffer is full
         Scommand=Slave_Receive();  //Get data from bus
         if ((Scommand & 0x10)==0x10)  //Check Read bit,if send was true ,then let data into SendData.
         {   
          switch(Scommand)  //Different Address vs different data.
           { case 0x10: SendData=Read_INTERNAL_EEPROM(0x00);//Read Changing Signal bit
                        if (SendData != 0)
                         {
                            Write_INTERNAL_EEPROM(0x00,0x00);   //If SendData is not 0 ,then clear Changing Signal bit.
                          }
                         break;
             case 0x11: SendData=Read_INTERNAL_EEPROM(0x01);      break;//Bright
             case 0x12: SendData=Read_INTERNAL_EEPROM(0x02);      break;//Contrast 
             case 0x13: SendData=Read_INTERNAL_EEPROM(0x03);      break;//CCFL
             case 0x14: SendData=Read_INTERNAL_EEPROM(0x04);      break;//Auto Color
             case 0x15: SendData=Read_INTERNAL_EEPROM(0x05);      break;//R
             case 0x16: SendData=Read_INTERNAL_EEPROM(0x06);      break;//G
             case 0x17: SendData=Read_INTERNAL_EEPROM(0x07);      break;//B
             case 0x18: SendData=Read_INTERNAL_EEPROM(0x08);      break;//Sharpness
             case 0x19: SendData=Read_INTERNAL_EEPROM(0x09);      break;//Auto Config
             case 0x1A: SendData=Read_INTERNAL_EEPROM(0x0A);      break;//6500
             case 0x1B: SendData=Read_INTERNAL_EEPROM(0x0B);      break;//9600
             case 0x1C: SendData=Read_INTERNAL_EEPROM(0x0C);      break;//DPMS ON/OFF
             case 0x1D: SendData=Read_INTERNAL_EEPROM(0x0D);      break;//11000
             case 0x1E: SendData=Read_INTERNAL_EEPROM(0x0E);      break;//Save operation
             default:break;
            }//end of seitch
          }//end of if

        if ((Scommand & 0x10)==0)  //Check the Write bit.
           {  
             Scommand2=0xF0;  //set writing data station  signal
            } //end of if 
           
          break;
    case 0x31:               //"00110001" Master  Write operation,last byte was data,p=1,S=0,buffer is full
         Sdata=Slave_Receive();  //Get data from bus
         //PORTB=0XF0;
         if ((Scommand & 0x10)==0) //Check the Write bit.
          {
             switch(Scommand)  //If Read was true,then put data into relevant different Address.
              { case 0x00: Write_INTERNAL_EEPROM(0x00,Sdata);     break;
                case 0x01: Write_INTERNAL_EEPROM(0x01,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x02: Write_INTERNAL_EEPROM(0x02,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x03: Write_INTERNAL_EEPROM(0x03,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x04: Write_INTERNAL_EEPROM(0x04,Sdata);      break;
                case 0x05: Write_INTERNAL_EEPROM(0x05,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x06: Write_INTERNAL_EEPROM(0x06,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x07: Write_INTERNAL_EEPROM(0x07,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x08: Write_INTERNAL_EEPROM(0x08,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x09: Write_INTERNAL_EEPROM(0x09,Sdata);     break;
                case 0x0A: Write_INTERNAL_EEPROM(0x0A,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x0B: Write_INTERNAL_EEPROM(0x0B,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x0C: Write_INTERNAL_EEPROM(0x0C,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x0D: Write_INTERNAL_EEPROM(0x0D,Sdata);Write_INTERNAL_EEPROM(0x00,0x11);      break;
                case 0x0E: Write_INTERNAL_EEPROM(0x0E,Sdata);    break;
                default: break; 
               } //end of switch
             // Write_INTERNAL_EEPROM(0x00,0x11); //Changing signal bite
           }
         break;   
            
    case 0x0C:               //"00001100" Master Read operation,last byte was address,S=1,P=0,buffer is empty.
         //Saddress=SSPBUF;    //clear buffer
         // PORTB=SSPSTAT;
         Slave_Transmit(SendData); 
         break;     
    case 0x2C:               //"00101100" Master Read operation,last byte was data,S=1,P=0,buffer is empty.
         PORTB=SSPSTAT;
         Scommand=Slave_Receive(); //Receive the master command,and clear buffer.
         break;
        
    default:break;

    }

      






}


/*    case 0x29:                    //"00101001" Msater Write operation,last byte was data,S=1,P=0,buffer is full
         Scommand=Slave_Receive();  //Get data from bus
         if ((Scommand & 0x10)==0x10)  //Check Read bit,if send was true ,then let data into SendData.
         {
         switch(Scommand)  //Different Address vs different data.
           { case 0x10: SendData=TransData[0];//Read Changing Signal bit
                        if (SendData != 0)
                         {
                            TransData[0]=0;   //If SendData is not 0 ,then clear Changing Signal bit.
                          }
                         break;
             case 0x11: SendData=TransData[1];      break;//Bright
             case 0x12: SendData=TransData[2];      break;//Contrast 
             case 0x13: SendData=TransData[3];      break;//CCFL
             case 0x14: SendData=TransData[4];      break;//Auto Color
             case 0x15: SendData=TransData[5];      break;//R
             case 0x16: SendData=TransData[6];      break;//G
             case 0x17: SendData=TransData[7];      break;//B
             case 0x18: SendData=TransData[8];      break;//Sharpness
             case 0x19: SendData=TransData[9];      break;//Auto Config
             case 0x1A: SendData=TransData[10];      break;//6500
             case 0x1B: SendData=TransData[11];      break;//9600
             case 0x1C: SendData=TransData[12];      break;//DPMS ON/OFF
             default:break;
            }
          }
         break;  
    case 0x31:               //"00110001" Master  Write operation,last byte was data,p=1,S=0,buffer is full
         Sdata=Slave_Receive();  //Get data from bus
         PORTB=Sdata;
         if ((Scommand & 0x10)==0) //Check the Write bit.
          {
             switch(Scommand)  //If Read was true,then put data into relevant different Address.
              { case 0x01: TransData[1]=Sdata;     break;
                case 0x02: TransData[2]=Sdata;     break;
                case 0x03: TransData[3]=Sdata;     break;
                case 0x04: TransData[4]=Sdata;     break;
                case 0x05: TransData[5]=Sdata;     break;
                case 0x06: TransData[6]=Sdata;     break;
                case 0x07: TransData[7]=Sdata;     break;
                case 0x08: TransData[8]=Sdata;     break;
                case 0x09: TransData[9]=Sdata;     break;
                case 0x0A: TransData[10]=Sdata;     break;
                case 0x0B: TransData[11]=Sdata;     break;
                case 0x0C: TransData[12]=Sdata;     break;
                
                default:break;
              }
           }
         break; */    

⌨️ 快捷键说明

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