📄 spi.c
字号:
#include <p18f2480.h>
#include <delays.h>
char a,n;
char m[4];
char data;
void Interrupt_t0(void);
void initial()
{
INTCON=0x00; /* bit7-bit0:关总中断 */
INTCON2bits.INTEDG0 = 0;
TRISB=0x01;
ADCON1=0X0f; /* 设置数字输入输出口 */
// PIE1=0; /* PIE1 的中断不使能 */
// PIE2=0; /* PIE2 的中断不使能 */
// PIE3=0; /* PIE3 的中断不使能 */
}
void init_spi()
{
TRISA=0x00; //主控 TRISA=0x00;从机 TRISA=0x20
TRISC=0x10; //主控 TRISC=0x00;从机 TRISC=0x18
SSPSTAT=0x80; //主控SSPSTAT=0x00,80 ; 从机 SSPSTAT=0x00
SSPSTATbits.CKE=0; //
SSPCON1=0x22; //主控 SSPCON1=0x22,21,20 ,20最好;从机
PIR1bits.SSPIF=0; /* 清除SSPIF标志 */
}
void delayms(unsigned int t)
{
unsigned char i;
for(;t;t--)
for(i=0;i<200;i++);
}
char spi_rc()
{
char data;
do
{
;
}while(SSPSTATbits.BF==0); /* 等待SPI 发送完成 */
data = SSPBUF; /* 清SPI 发送完成标志 */
// n++;
// if(n==2) n=0;
return data;
}
void spi_send(char data)
{
SSPBUF = data;
do
{
;
}while(PIR1bits.SSPIF==0); /* 等待SPI 发送完成 */
PIR1bits.SSPIF=0; /* 清SPI 发送完成标志 */
a = SSPBUF;
// m[n++] = a;
// if(n==4) n=0;
}
#pragma code InterruptVectorHigh=0x08 //若为低优先级中断服务程序,0x08应改为0x18
void InterruptVectorHigh (void)
{
_asm
goto Interrupt_t0 //跳到中断程
_endasm
}
/*高优先级中断服务程序*/
#pragma code
#pragma interrupt Interrupt_t0
void Interrupt_t0(void)
{
//INT0 中断服务
if(INTCONbits.INT0IF==1) //若接收中断标志不为1,则为误操作,返回
{
INTCONbits.INT0IF=0; //清中断标志
spi_send(0x5a);
}
}
void main()
{
initial();
init_spi();
n = 0;
while(1)
{
// PORTBbits.RB0 = 1;
// if(PORTBbits.RB0==1)
// spi_send(0x5a);
// spi_send(0x5a);
Nop();
// delayms(500);
// m[0] = a;
// PORTA = a;
// spi_send(0x24);
// Nop();
// delayms(500);
// m[1] = a;
// PORTA = a;
// spi_send(0x88);
//Nop();
// delayms(500);
// m[2] = a;
// PORTA = a;
// spi_send(0x99);
Nop();
// delayms(500);
// m[3] = a;
// PORTA = a;
delayms(5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -