搜索
您的当前位置:首页正文

PIC16F877ASPI通信C程序

来源:哗拓教育


#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;jfor (k=246;k>0;k--)NOP();

}

void READ(void)

{

RC2=0; //片选信号,低电平有效

B=SPI_WRITE(0b00000011); //写读取数据指令

B=SPI_WRITE(0b00000100); //写读取数据地址

B=SPI_WRITE(0); //发空数据,为了读取数据

RC2=1; //完成读写操作

DELAY(1);

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top