自作パチスロに挑む! ジャグラー編 第2回
第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;
}
その他、画像描画用にヘッダーファイをいくつか格納していますが、
長くなりすぎるので割愛。
画像データ作成の方法が知りたい方は、
以前の記事を参考にしていただければと思います。
次回は音楽ファイルの作成について書こうと思います。
コメントを残す