第2回 メインプログラムについて

2回目の今回は、
メインの制御プログラム紹介です。

PIC16F1829にプログラムした内容で、
リール描画、スイッチ制御、スコア計算、抽選などを行っています。
※バグがあるかもしれません。

リール描画はリール配列をヘッダーファイルに格納して、
タイマーでカウントして随時更新しています。
リール配列はジャグラーを参考に作成しました。

//0:赤7,1:BAR,2:リプ,3:ぶどう,4:チェリー,5:ベル,6:ピエロ
const int hairetu[25][3]=
{
{3,3,6},//3//0
{2,4,5},//2//1
{3,6,2},//1//2
{5,2,3},//21//3
{0,0,0},//20//4
{2,3,1},//19//5
{3,4,5},//18//6
{2,2,2},//17//7
{3,5,3},//16//8
{1,3,6},//15//9
{4,4,5},//14//10
{3,2,2},//13//11
{2,1,3},//12//12
{3,3,6},//11//13
{0,4,5},//10//14
{6,2,2},//9//15
{3,5,3},//8//16
{2,3,6},//7//17
{3,4,5},//6//18
{4,2,2},//5//19
{1,1,3},//4//20
{3,3,6},//3//21
{2,4,5},//2//22
{3,6,2},//1//23
{5,2,3}//枠下用+1コマ//24
};

 

抽選はタイマーを利用していて、
0から確率分母までカウント(上の設定では128)していて、
レバーオンのタイミングが0のときBIG、
1のときREGという風に疑似的に乱数っぽく抽選しています。

↓全体のプログラムはコチラ↓

#include <xc.h>
#include <stdio.h>
#include "reel_up.h"
#include "reel_dw.h"
#include "hairetu.h"
#include "numup.h"
#include "numdw.h"
#include "medal_title.h"
#include "fugou.h"

#define _XTAL_FREQ 16000000

#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FOSC = INTOSC, FCMEN = OFF 
#pragma config MCLRE = ON, WDTE = OFF, CP = OFF, PWRTE = ON, CLKOUTEN = OFF
#pragma config PLLEN = OFF, WRT = OFF, STVREN = OFF, BORV = LO, LVP = OFF 

//******************************************************************************
void i2c_start();
void i2c_stop();
void i2c_write(unsigned char byte);
void oled_ini(void);
void oled_clr(void);

//***配列読み込み用***
unsigned int reel1;
unsigned int reel2;
unsigned int reel3;
//***リール図柄描画用***
unsigned int stop1u;
unsigned int stop2u;
unsigned int stop3u;
unsigned int stop1c;
unsigned int stop2c;
unsigned int stop3c;
unsigned int stop1d;
unsigned int stop2d;
unsigned int stop3d;
unsigned int stop1wu;
unsigned int stop2wu;
unsigned int stop3wu;
unsigned int stop1wd;
unsigned int stop2wd;
unsigned int stop3wd;
//***メダル枚数管理用格納庫***
unsigned int mstop1u;
unsigned int mstop2u;
unsigned int mstop3u;
unsigned int mstop1c;
unsigned int mstop2c;
unsigned int mstop3c;
unsigned int mstop1d;
unsigned int mstop2d;
unsigned int mstop3d;
//***スタート判定***
unsigned int start1;
unsigned int start2;
unsigned int start3;
//***タクトスイッチのチャタリング防止****
unsigned int prev;
//***メダル枚数描画用***
int medal;
unsigned int medal1;
unsigned int medal2;
unsigned int medal3;
unsigned int medal4;
//******
unsigned int replay;
unsigned int bel;
unsigned int budou;
unsigned int piero;
unsigned int cherry;
unsigned int big;
unsigned int reg;
unsigned int hazure;
//*****
unsigned int medalcount;//(0:許可,1:拒否)
unsigned int game_start;
unsigned int reel_stop1;
unsigned int reel_stop2;
unsigned int reel_stop3;
unsigned int rans;
unsigned int kekka;
unsigned int stock;
unsigned int peka;
unsigned int fan;
//******************************************************************************

//******************************************************************************
///割り込み初期設定///
void intrInit(){
    T1CON = 0b00100001;
    TMR1H =(55536 >> 8);
    TMR1L = (55536 & 0x00ff);
    TMR1IF = 0;//flag reset
    TMR1IE = 1;//timer1 on
    IOCAN4=1;//赤ボタン(中ストップ)
    IOCAN5=1;//白ボタン(レバー)
    IOCBN5=1;//青ボタン(左ストップ)
    IOCBN7=1;//緑ボタン(右ストップ)
    INTCONbits.IOCIE = 1;//ピン変化割り込み許可
    INTCONbits.PEIE = 1;//
    INTCONbits.GIE = 1;//全体割り込み許可
}

///割り込み動作///
//リール1周 0.78秒 1コマ 0.037秒
void __interrupt() isr(void){
volatile static int intr_counter;

GIE = 0;//割り込み禁止

//***レバーオン***
if(RA5==0 && start1==1 && start2==1 && start3==1 && prev==0){
    medalcount=1;//メダル計算拒否 
    reel_stop1=0;
    reel_stop2=0;
    reel_stop3=0;
    
    //★抽選★
    if(big==0 && reg==0){
    kekka=rans;
        //★抽選結果発表★
        if(kekka==0){
            big=1;
            peka=1;
        }else if(kekka==1){
            reg=1;
            peka=1;
        }
        //* *
    }
    
    start1=0;
    start2=0;
    start3=0;
    RC3=1;//BGM ON
    __delay_ms(160);//ボタンチャタリング防止
    prev=1;//処理終了フラグ
    RC3=0;//BGM OFF
}else{
    //処理終了フラグのリセット
    if(prev==1){
        prev=0;
    }
}
IOCAN5=0;
//******


//***左ストップ処理***
if(RB5==0 && reel_stop1==0){
    if(prev==0){
        start1=1;
        RC6=1;//BGM ON
        __delay_ms(160);//ボタンチャタリング防止
        RC6=0;//BGM OFF
        //当選時リール処理
        if(big==1 && stock==1){
            reel1=5;
        }else if(reg==1 && stock==1){
            reel1=10;
        } 
        //* *
        reel_stop1=1;
        prev=1;
    }
}else{
    //処理終了フラグのリセット
    if(prev==1){
        prev=0;
    }
}
IOCBN5=0;
//******

//***中ストップ処理***
if(RA4==0 && reel_stop2==0 && start1==1){
    if(prev==0){
        start2=1;
        RC6=1;//BGM_ON
        __delay_ms(160);//ボタンチャタリング防止
        RC6=0;//BGM_OFF
        //当選時リール処理
        if(big==1 && stock==1){
            reel2=5;
        }else if(reg==1 && stock==1){
            reel2=13;
        } 
        //* *
        reel_stop2=1;
        prev=1;
    }
}else{
    //処理終了フラグのリセット
    if(prev==1){
        prev=0;
    }
}
IOCAN4=0;
//******
        
//***右ストップ処理***
if(RB7==0 && reel_stop3==0 && start1==1 && start2==1){
    if(prev==0){
        start3=1;
        //***ガコッ♪***
        if((big==1 || reg==1)&&peka==1){
        RC7=1;//BGM_ON
        __delay_ms(160);//ボタンチャタリング防止
        RC7=0;//BGM_OFF   
        peka=0;
        }else if((big==1 || reg==1)&&fan==1){
        //***ファンファーレ♪***
        RC4=1;//BGM_ON
        __delay_ms(160);//ボタンチャタリング防止
        RC4=0;//BGM_OFF   
        fan=0;
        }else{
        //***通常停止音***
        RC6=1;//BGM_ON
        __delay_ms(160);//ボタンチャタリング防止
        RC6=0;//BGM_OFF
        }
        //当選時リール処理
        if(big==1 && stock==1){
            reel3=5;
            big=0;//フラグリセット
            stock=0;//フラグリセット
            RC2=0;
        }else if(reg==1 && stock==1){
            reel3=6;
            reg=0;//フラグリセット
            stock=0;//フラグリセット
            RC2=0;
        }else{
            //ボーナス非成立時は滑る
            if(big==0 && reg ==0 && reel3>=5 && reel3<=2){
                reel3=1;
            }
        } 
        //* *
        
        //***ペカッ♪***
        if(big==1 || reg==1){
            RC2=1;
        }
        //******
        
        medalcount=0;//メダル計算許可
        reel_stop3=1;
        prev=1;
    }
}else{
    //処理終了フラグのリセット
    if(prev==1){
        prev=0;
    }
}
IOCBN7=0;
//******

//***カウントアップ(リール回転)***
if(TMR1IF == 1){
    TMR1H = (55536>>8);
    TMR1L = (55536 & 0x00ff);
    //カウントアップ
    intr_counter++;
    
    if(intr_counter==1){
        rans++;
        //★★★★★確率設定★★★★★
        if(rans>=128){
            rans=0;
        }
    }
    
    //リール回転用
    if(intr_counter == 4){
        //左リールの処理
        if(start1==0){
        reel1--;
        }
        if(reel1<3){
            reel1=23;
        }
        //中リールの処理
        if(start2==0){
        reel2--;
        }
        if(reel2<3){
            reel2=23;
        }
        //右リールの処理
        if(start3==0){
        reel3--;
        }
        if(reel3<3){
            reel3=23;
        }         
        intr_counter = 0;
    }
    //******
//***割り込み終了処理***
TMR1IF =0;//タイマー1フラグリセット   
} 
GIE = 1;
}
//******
//******************************************************************************

//******************************************************************************
void main(void)
{
TRISA = 0b00110000;//4:SW,5:SW
TRISB = 0b11110000;//4:SDA,5:SW,6:SCL,7:SW
TRISC = 0b00000000;
OPTION_REG=0b00000000;
WPUA = 0b00110000;
WPUB = 0b11110000;
WPUC = 0b00000000;
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
ANSELA = 0b00000000;
ANSELB = 0b00000000;
ANSELC = 0b00000000;
OSCCON = 0b01111100;//16MHz
SSP1CON1 = 0b00101000;
SSP1STAT = 0b10000000;
SSP1ADD = 0b00100111;
//****************************************
start1=1;
start2=1;
start3=1;
reel_stop1=1;
reel_stop2=1;
reel_stop3=1;
//****************************************
intrInit();
oled_ini();
oled_clr();
//****************************************
reel1=5;//5コマ目からスタート
reel2=5;//5コマ目からスタート
reel3=5;//5コマ目からスタート
//****************************************
medalcount=1;//赤7揃いからスタートするので計算拒否
rans=0;//乱数0セット
big=0;
reg=0;
peka=0;
fan=0;
unsigned int k;
//******************************************************************************

//******************************************************************************
//初期スコア設定
medal=0;
medal1=0;
medal2=0;
medal3=0;
medal4=0;
//******************************************************************************
//***メダルタイトル描画***
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x00); // Control byte Co=0, D/C#=0
i2c_write(0xA7); //
i2c_write(0x20); // Set memory addressing mode
i2c_write(0x00); // Horizontal addressing mode
i2c_write(0x21); // Set column address
i2c_write(0x00); // Column start address 0//設定は0
i2c_write(0x23); // Column end address 127d//設定は35
i2c_write(0x22); // Set page address
i2c_write(0x02); // Page start address 0
i2c_write(0x03); // Page end address 7d
i2c_stop();
//*start image draw*//
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x40); // Control byte Co=0, D/C#=1
//***メダルタイトル描画***
for(k=0; k<72; k++)
i2c_write(title[k]);
//******************************************************************************

while(1){    
//******************************************************************************
//配列を参照して図柄選択
//***枠上***
stop1wu=hairetu[reel1-3][0];
stop2wu=hairetu[reel2-3][1];
stop3wu=hairetu[reel3-3][2];
//***上段***
stop1u=hairetu[reel1-2][0];
stop2u=hairetu[reel2-2][1];
stop3u=hairetu[reel3-2][2]; 
//***中段***
stop1c=hairetu[reel1-1][0];
stop2c=hairetu[reel2-1][1];
stop3c=hairetu[reel3-1][2];
//***下段***
stop1d=hairetu[reel1][0];
stop2d=hairetu[reel2][1];
stop3d=hairetu[reel3][2]; 
//***枠下***
stop1wd=hairetu[reel1+1][0];
stop2wd=hairetu[reel2+1][1];
stop3wd=hairetu[reel3+1][2];     
//*********************
//メダル枚数管理用格納庫
if(medalcount==0){
//***上段***
mstop1u=hairetu[reel1-2][0];
mstop2u=hairetu[reel2-2][1];
mstop3u=hairetu[reel3-2][2]; 
//***中段***
mstop1c=hairetu[reel1-1][0];
mstop2c=hairetu[reel2-1][1];
mstop3c=hairetu[reel3-1][2];
//***下段***
mstop1d=hairetu[reel1][0];
mstop2d=hairetu[reel2][1];
mstop3d=hairetu[reel3][2];
}
//******************************************************************************

//******************************************************************************
//***ボーナス成立時、次ゲームで強制揃い***
if(big==1 && medalcount==0 || reg==1 && medalcount==0){
    //***成立ゲームで揃った場合はフラグリセット***
    if(mstop1u == mstop2u && mstop1u == mstop3u){
        if(mstop1u==0){//赤7
            big=0;
            stock=0;
            RC2=0;
        }else if(mstop1u==1){//BAR
            reg=0;
            stock=0;
            RC2=0;
        }
    }else if(mstop1c == mstop2c && mstop1c == mstop3c){
        if(mstop1c==0){//赤7
            big=0;
            stock=0;
            RC2=0;
        }else if(mstop1c==1){//BAR
            reg=0;
            stock=0;
            RC2=0;
        }
    }else if(mstop1d == mstop2d && mstop1d == mstop3d){
        if(mstop1d==0){//赤7
            big=0;
            stock=0;
            RC2=0;
        }else if(mstop1d==1){//BAR
            reg=0;
            stock=0;
            RC2=0;
        }
    }else if(mstop1d == mstop2c && mstop1d == mstop3u){ 
        if(mstop1d==0){//赤7
            big=0;
            stock=0;
            RC2=0;
        }else if(mstop1d==1){//BAR
            reg=0;
            stock=0;
            RC2=0;
        }
    }else if(mstop1u == mstop2c && mstop1u == mstop3d){ 
        if(mstop1u==0){//赤7
            big=0;
            stock=0;
            RC2=0;
        }else if(mstop1u==1){//BAR
            reg=0;
            stock=0;
            RC2=0;
        }
    }else{
        //成立ゲームで図柄が揃わなかったら強制フラグ
        stock=1;
        fan=1;
    }  
}
//******************************************************************************

//******************************************************************************
//***メダル枚数計算***
if(medalcount==0){//リール停止時のみ動作
    if(mstop1u == mstop2u && mstop1u == mstop3u){
        if(mstop1u==0){//赤7
            medal=medal+300;
        }else if(mstop1u==1){//BAR
            medal=medal+100;
        }else if(mstop1u==2){//リプ
            replay=1;
        }else if(mstop1u==3){//ぶどう
            medal=medal+8;
        }else if(mstop1u==5){//ベル
            medal=medal+12;
        }else if(mstop1u==6){//ピエロ
            medal=medal+15;
        }
    }else if(mstop1c == mstop2c && mstop1c == mstop3c){
        if(mstop1c == 0){//赤7
            medal=medal+300;
        }else if(mstop1c==1){//BAR
            medal=medal+100;
        }else if(mstop1c==2){//リプ
            replay=1;
        }else if(mstop1c==3){//ぶどう
            medal=medal+8;
        }else if(mstop1c==5){//ベル
            medal=medal+12;
        }else if(mstop1c==6){//ピエロ
            medal=medal+15;
        }        
    }else if(mstop1d == mstop2d && mstop1d == mstop3d){
        if(mstop1d==0){//赤7
            medal=medal+300;
        }else if(mstop1d==1){//BAR
            medal=medal+100;
        }else if(mstop1d==2){//リプ
            replay=1;
        }else if(mstop1d==3){//ぶどう
            medal=medal+8;
        }else if(mstop1d==5){//ベル
            medal=medal+12;
        }else if(mstop1d==6){//ピエロ
            medal=medal+15;
        }   
    }else if(mstop1d == mstop2c && mstop1d == mstop3u){ 
        if(mstop1d==0){//赤7
            medal=medal+300;
        }else if(mstop1d==1){//BAR
            medal=medal+100;
        }else if(mstop1d==2){//リプ
            replay=1;
        }else if(mstop1d==3){//ぶどう
            medal=medal+8;
        }else if(mstop1d==5){//ベル
            medal=medal+12;
        }else if(mstop1d==6){//ピエロ
            medal=medal+15;
        }  
    }else if(mstop1u == mstop2c && mstop1u == mstop3d){ 
        if(mstop1u==0){//赤7
            medal=medal+300;
        }else if(mstop1u==1){//BAR
            medal=medal+100;
        }else if(mstop1u==2){//リプ
            replay=1;
        }else if(mstop1u==3){//ぶどう
            medal=medal+8;
        }else if(mstop1u==5){//ベル
            medal=medal+12;
        }else if(mstop1u==6){//ピエロ
            medal=medal+15;
        }
    }else{
        if(mstop1u==4 || mstop1c==4 || mstop1d==4){
            medal=medal+2;   
        }else{
            medal=medal-3;
        }
    }  

    //***メダル分割***
    medal1=abs(medal)/1000;
    medal2=abs(medal)/100-medal1*10;
    medal3=abs(medal)/10-(medal1*100+medal2*10);
    medal4=abs(medal)-(medal1*1000+medal2*100+medal3*10);
    //******
    }

    //***符号描画***
    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x00); // Control byte Co=0, D/C#=0
    i2c_write(0xA7); //
    i2c_write(0x20); // Set memory addressing mode
    i2c_write(0x00); // Horizontal addressing mode
    i2c_write(0x21); // Set column address
    i2c_write(0x00); // Column start address 0//設定は0
    i2c_write(0x06); // Column end address 127d//設定は6
    i2c_write(0x22); // Set page address
    i2c_write(0x04); // Page start address 0
    i2c_write(0x05); // Page end address 7d
    i2c_stop();
    //*start image draw*//
    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x40); // Control byte Co=0, D/C#=1

    //***符号描画***
    if(medal>=0){
    for(k=0; k<14; k++)
    i2c_write(fugou[k][0]);
    }else{
    for(k=0; k<14; k++)
    i2c_write(fugou[k][1]);
    }
    i2c_stop();
    //******************************************************************************

    //***メダル枚数描画***
    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x00); // Control byte Co=0, D/C#=0
    i2c_write(0xA7); //
    i2c_write(0x20); // Set memory addressing mode
    i2c_write(0x00); // Horizontal addressing mode
    i2c_write(0x21); // Set column address
    i2c_write(0x07); // Column start address 0//設定は7
    i2c_write(0x2A); // Column end address 127d//設定は42
    i2c_write(0x22); // Set page address
    i2c_write(0x04); // Page start address 0
    i2c_write(0x05); // Page end address 7d
    i2c_stop();
    //*start image draw*//
    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x40); // Control byte Co=0, D/C#=1

    //***メダル枚数描画***
    for(k=0; k<9; k++)
    i2c_write(numup[k][medal1]);
    for(k=0; k<9; k++)
    i2c_write(numup[k][medal2]);
    for(k=0; k<9; k++)
    i2c_write(numup[k][medal3]);
    for(k=0; k<9; k++)
    i2c_write(numup[k][medal4]);
    for(k=0; k<9; k++)
    //
    i2c_write(numdw[k][medal1]);
    for(k=0; k<9; k++)
    i2c_write(numdw[k][medal2]);
    for(k=0; k<9; k++)
    i2c_write(numdw[k][medal3]);
    for(k=0; k<9; k++)
    i2c_write(numdw[k][medal4]);
    i2c_stop();
    medalcount=1;//メダル枚数計算拒否
    //******************************************************************************

//******************************************************************************
//***左リール描画***
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x00); // Control byte Co=0, D/C#=0
i2c_write(0xA7); //
i2c_write(0x20); // Set memory addressing mode
i2c_write(0x00); // Horizontal addressing mode
i2c_write(0x21); // Set column address
i2c_write(0x32); // Column start address 0//設定は50
i2c_write(0x46); // Column end address 127d//設定は70
i2c_write(0x22); // Set page address
i2c_write(0x00); // Page start address 0
i2c_write(0x07); // Page end address 7d
i2c_stop();
//*start image draw*//
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x40); // Control byte Co=0, D/C#=1
//***左リール・枠上***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop1wu]);
//***左リール・上段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop1u]);   
//***左リール・上段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop1u]);  
//***左リール・中段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop1c]);   
//***左リール・中段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop1c]);   
//***左リール・下段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop1d]);  
//***左リール・下段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop1d]);  
//***左リール・枠下***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop1wd]);   
//******
i2c_stop;
//******************************************************************************
//***中リール描画***
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x00); // Control byte Co=0, D/C#=0
i2c_write(0xA7); //
i2c_write(0x20); // Set memory addressing mode
i2c_write(0x00); // Horizontal addressing mode
i2c_write(0x21); // Set column address
i2c_write(0x4D); // Column start address 0//設定は77
i2c_write(0x61); // Column end address 127d//設定は97
i2c_write(0x22); // Set page address
i2c_write(0x00); // Page start address 0
i2c_write(0x07); // Page end address 7d
i2c_stop();
//*start image draw*//
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x40); // Control byte Co=0, D/C#=1
//***中リール・枠上***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop2wu]);    
//***中リール・上段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop2u]);  
//***中リール・上段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop2u]);  
//***中リール・中段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop2c]);  
//***中リール・中段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop2c]);  
//***中リール・下段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop2d]);  
//***中リール・下段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop2d]);   
//***中リール・枠下***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop2wd]);   
//******
i2c_stop;
//******************************************************************************
//***右リール描画***
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x00); // Control byte Co=0, D/C#=0
i2c_write(0xA7); //
i2c_write(0x20); // Set memory addressing mode
i2c_write(0x00); // Horizontal addressing mode
i2c_write(0x21); // Set column address
i2c_write(0x68); // Column start address 0//設定は104
i2c_write(0x7C); // Column end address 127d//設定は124
i2c_write(0x22); // Set page address
i2c_write(0x00); // Page start address 0
i2c_write(0x07); // Page end address 7d
i2c_stop();
//*start image draw*//
i2c_start();
i2c_write(0x78); // OLED slave address
i2c_write(0x40); // Control byte Co=0, D/C#=1
//***右リール・枠上***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop3wu]);
//***右リール・上段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop3u]);   
//***右リール・上段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop3u]);
//***右リール・中段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop3c]);   
//***右リール・中段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop3c]);
//***右リール・下段1***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop3d]);   
//***右リール・下段2***
for(k=0; k<21; k++)
i2c_write(reeldw[k][stop3d]);
//***右リール・枠下***
for(k=0; k<21; k++)
i2c_write(reelup[k][stop3wd]);
//******
i2c_stop();
//****************************************************************************** 
}//while動作
}// main
//****************************************************************************** 

//******************************************************************************
void oled_ini(void)
{
    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x00); // Control byte Co=0, D/C#=0
    i2c_write(0x8D); // Set charge pump
    i2c_write(0x14); // Enable charge pump
    i2c_write(0x81);
    i2c_write(0x0F);
    i2c_write(0xAF); // Display ON
    i2c_stop();
}
//******************************************************************************

//******************************************************************************
void oled_clr(void)
{
    unsigned int i;

    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x00); // Control byte Co=0, D/C#=0
   i2c_write(0x20); // Set memory addressing mode
    i2c_write(0x00); // Horizontal addressing mode
    i2c_write(0x21); // Set column address
    i2c_write(0x00); // Column start address 0
    i2c_write(0x7F); // Column end address 127d
    i2c_write(0x22); // Set page address
    i2c_write(0x00); // Page start address 0
    i2c_write(0x07); // Page end address 7d
    i2c_stop();

    i2c_start();
    i2c_write(0x78); // OLED slave address
    i2c_write(0x40); // Control byte Co=0, D/C#=1

    for(i=0; i<1024; i++) // 128culomn * 8page
    i2c_write(0xFF); // filled with 0 (OLED clear)

    i2c_stop();

}
//******************************************************************************

//******************************************************************************
void i2c_start()
{
    SSP1CON2bits.SEN = 1;
    while(SSP1CON2bits.SEN);
}
//******************************************************************************

//******************************************************************************
void i2c_stop()
{
    SSP1CON2bits.PEN = 1;
    while(SSP1CON2bits.PEN);
}
//******************************************************************************

//******************************************************************************
void i2c_write(unsigned char byte)
{
    PIR1bits.SSP1IF = 0;
    SSP1BUF = byte;
    while(!PIR1bits.SSP1IF);
    SSP1CON1bits.CKP = 1;
}

 

その他、画像描画用にヘッダーファイをいくつか格納していますが、
長くなりすぎるので割愛。

画像データ作成の方法が知りたい方は、
以前の記事を参考にしていただければと思います。
 

次回は音楽ファイルの作成について書こうと思います。

 

<関連記事>
・第1回 準備するもの
・第2回 スロットマシン メインプログラムについて
・第3回 音楽再生について