#include // 注意 RB0要接下拉电阻 __CONFIG(0x3F39); void CSH(void); //初始化子程序 void DELAY(unsigned int n);//函数声明 char SPI_WRITE(char R); //SPI发送函数 void WRITE(char number); //SPI写函数 void READ(void); //SPI接收函数 void interrupt ISR(void); //按键中断程序 int b=0; bit ERROR; //标志位 char B; char number;//存放PORTD的数,全局变量 void main(void) { CSH(); //初始化 number=0x0D; while(1) { if(b==1) //若按键,则进行读写操作 { WRITE(number); //发送数据 // RB5=1; DELAY(1); ERROR=0; //错误标志位清零 READ(); //读取数据 if(B!=number) {ERROR=1;}; DELAY(1); // RB6=1; if(ERROR==1) {RB4=1;} b=0; PORTD=number; } } } //初始化程序 void CSH(void) //如果接受与发送的数据不相等,则发生错误 //若发生错误,灯亮 //D口显示发送的数据 { OPTION_REG=0b01000000; INTCON=0b10010000;//中断初始化关++++++++ TRISB=1; //RB0口为输入关++++++++++++ TRISC=0b00010001;//C口SDO为输出SDI为输入,SCK为输出,RC1输出RC0输入开 TRISD=0; //D口全为输出 PORTD=0; SSPEN=1; //相应的引脚为一般的I/O口 CKP=1; //空闲时钟为高电平 SMP=1; //在数据信号的末端采样 CKE=1; //下降沿发送数据 SSPCON+=0b0001; //主控模式,时钟为fosc/16 } char SPI_WRITE(char R ) { char BUF; SSPBUF=R; //要发的数写入SSPBUF寄存器 while(BF==0);//等待发送完毕 BUF=SSPBUF; return(BUF); } void WRITE(char number) { char A; RC2=0; //片选信号,低电平有效 SPI_WRITE(0b00000110); //允许写入 RC2=1; //完成写使能 RC2=0; //片选信号,低电平有效 A=SPI_WRITE(0b00000010); //写指令 A=SPI_WRITE(0b00000100); //写数据的地址 A=SPI_WRITE(number); //发送数据 RC2=1; //完成写操作 DELAY(5); } void interrupt ISR(void) { char a;int k; if(INTF==1) { for (k=1024;k>0;k--)NOP();//DELAY(30);//防抖动 INTF=0; //清标志位 b=1; } } //延时(n)ms void DELAY(unsigned int n) {unsigned int j; char k; for (j=0;j } void READ(void) { RC2=0; //片选信号,低电平有效 B=SPI_WRITE(0b00000011); //写读取数据指令 B=SPI_WRITE(0b00000100); //写读取数据地址 B=SPI_WRITE(0); //发空数据,为了读取数据 RC2=1; //完成读写操作 DELAY(1); } 因篇幅问题不能全部显示,请点此查看更多更全内容