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 + -
显示快捷键?