#include <xc.h>

#pragma config FOSC = INTOSC    // 内部クロックを使用
#pragma config WDTE = OFF       // ウォッチドッグタイマ
#pragma config PWRTE = OFF      // パワーアップタイマー
#pragma config MCLRE = ON       // MCLRピンの有効・無効
#pragma config CP = OFF         // コードプロテクト
#pragma config CPD = OFF        // メモリーの保護
#pragma config BOREN = ON       // 電圧降下監視
#pragma config CLKOUTEN = OFF   // CLKOUTの有効・無効
#pragma config IESO = OFF       // 外部クロックへの切り替え
#pragma config FCMEN = OFF      // 外部クロックの監視

#pragma config WRT = OFF        // 4KWのフラッシュメモリ自己書き込み保護
#pragma config PLLEN = ON       // 4xPLLを動作
#pragma config STVREN = OFF     // スタックエラー時のリセット
#pragma config LVP = OFF        // 低電圧プログラミング

#define _XTAL_FREQ 32000000     // スリープ処理のための周波数定義

#define LOW 0
#define HIGH 1

unsigned char return_data = 0, read_data;

void interrupt OnInterSpi()
{
    if (SSP1IF == HIGH){  // SPIデータがあるか
        SSP1IF = LOW;     // SPIデータをリセット
        
        read_data = SSP1BUF;      
        if(return_data == 0) return_data = 255; else return_data--;
        
        SSP1BUF = return_data;
    }
}

void main(void)
{
    OSCCON = 0b00110100;    // 内部クロック4Mhz(4xPLLにより32MHzで動作)
    
    ANSELA = 0b00000000;    // RAはすべてデジタル
    TRISA = 0b00000001;     // RA0を入力端子に
    PORTA = 0b00000000;     // RA初期化
 
    // SPIモードの設定と初期化
    ANSELB = 0b00000000;
    TRISB = 0b00010010;     // RB1(7/SDI1)とRB4(10/SCK1)は入力
    PORTB = 0b00000000;     // RB初期化
    
    SDO1SEL = 0;             // RB2をSDOピンに設定
    SSP1CON1 = 0b00100100;    // スレーブでSS使用
    SSP1STAT = 0b01000000;    // スレーブ, クロック位相はLOW
    
    SSP1IF = 0;  // SPIの割込みフラグを初期化する
    SSP1IE = 1;  // SPIの割込みを許可する
    PEIE = 1;   // 周辺装置割込みを許可する
    GIE = 1;   // 全割込み処理を許可する
    
    while(1) ;
}