PICレトロゲーム開発キット

 
PICレトロゲーム開発キット

PICレトロゲーム開発キット

■PICレトロゲーム開発キット

@PIC16F88と液晶ディスプレイ(LCD)を使い、レトロゲームを開発するためのキットです。

Aゲーム背景は、第二次世界大戦、あなたはイギリスの駆逐艦の船長となり、ドイツのUボードを撃沈するという内容のゲームです。

Bインベーダーゲーム世代の方は、懐かしいと思いますが、カタカナの「ユ」を潜水艦、「カーソル」を駆逐艦とみたて、液晶ディスプレイの大西洋を、「ドット」の機雷を投下してUボードを撃沈していきます。

C最近の技術革新はたいしたもので、昔ゲームセンターでやっていたゲームが、PICマイコンと液晶ディスプレイで作ることが出来るようになりました。

Dぜひ、昔やったゲームを自分の手で作ってみて下さい。

E本キットのPIC16F88は、すでにプログラムされているため、キットを完成させれば、ゲームを楽しむことが出来ますが、ぜひ貴方仕様に改造してみて下さいね。

F本キットのピン配置はPIC16F84Aと同じなので、PIC16F84Aの回路開発キットとしてもご利用頂けます。

Gゲームを楽しむだけでなく、
PIC16F88の開発キットとしても、ご利用いただけます。

H工作レベルの難易度がレベル5で、非常に難しいキットです。
そのままキットを作れば、液晶ディスプレイを制御して、ゲームを作る事ができます。
しかし、理解するとなると、PICとC言語の、開発環境や知識が必要です。


難易度5

¥4,40
0(税込)
DEN-L-044
全長 W70mm×D107mm×H40mm
(テイシン TB-3ケース)
【電子キット製】

お買い求めはこちらです。

 
電子キットの「液晶ディスプレイキット(DEN-L-043)」と比べて、ハード面は、マイコンがPIC16F88に変わり、プッシュスイッチが4つに増え、配線が増えています。
ソフト面(プログラム)は、PIC16F88のプログラム領域が増えているので、全く違う内容となっており、高度な内容になっています。
液晶ディスプレイになれたい方は、本キットではなく、姉妹品の「液晶ディスプレイキット{DEN−L−043)」をお買い求め下さい。
電源は9V(別売り)の乾電池です。

PIC16F88マイコンは、ICソケットが付いているので、取り外しが可能です。
開発環境がある方は、プログラムを変更しなおすことも可能です。

液晶ディスプレイは、16文字×2行で、バックライト付のため、暗いところでも視認性抜群です。
液晶ディスプレイだけでなく、音も鳴ります。
画面のコントラストは、半固定ボリュームを回して調節します。
基板はユニバーサル基板です。

PICレトロゲーム開発キット

緑:RB0 白:リセット オレンジ:RB1 青:RB2 に接続しました。


PICレトロゲーム開発キット

暗闇でもゲームが出来ます。




今回も読み応えのある説明書になってしまいました。


【ゲーム開発キット以外の用途】

本キットは、ゲーム開発以外にも、PICの開発キットとしても、ご利用いただけます。

今回は、潜水艦ゲームをつくりましたが、制御プログラムなどもプログラム開発できます。

本キットの姉妹品、液晶ディスプレイキット(DEN−L−043)のPIC16F84Aを、本キットに差し込んでも、ピン配置が全く同じため、同じように動きます。



【液晶ディスプレイ】

機械と人が、情報をやり取りする際に利用する液晶ディスプレイは、とても便利なインターフェイスです。

本キットの液晶ディスプレイは、「1 6文字×2行 白抜き文字」で、14個のピンを持ち、役割は次のとおりです。
 
ピン番号   内容
1番ピン VDD (5Vのプラス電源)
2番ピン VSS (0V)
3番ピン Vo (液晶のコントラストを調整します。)
4番ピン RS (レジスタ選択信号で、信号が、データか命令かを指定します。
ハイ:データ  ロー:命令)
5番ピン R/W リードライト信号
ハイ:読み込み(LCDからPICへ)  ロー:書き込み(PICからLCDへ)
6番ピン E (イネーブルシグナルで、ハイにすると信号をディスプレイにおくります。
パソコンのリターンキみたいなものです。)
7番ピン DB0(データ番号0で、ハイとローの2ビットです。)
8番ピン DB1(データ番号1で、ハイとローの2ビットです。)
9番ピン DB2(データ番号2で、ハイとローの2ビットです。)
10番ピン DB3(データ番号3で、ハイとローの2ビットです。)
11番ピン DB4(データ番号4で、ハイとローの2ビットです。)
12番ピン DB5(データ番号5で、ハイとローの2ビットです。)
13番ピン DB6(データ番号6で、ハイとローの2ビットです。)
14番ピン DB7(データ番号7で、ハイとローの2ビットです。)

本キットの液晶ディスプレイを利用するには、毎回、電源投入後、イニシャライズと言われる初期設定を行なってから利用します。

イニシャライズは、液晶ディスプレイがもっているピンそれぞれに、ハイもしくはロー状態にしてインストラクションと呼ばれる命令を作り、6番ピンのE(イネーブル)をハイにして、液晶ディスプレイに信号を送ります。

イニシャライズのやり方は、8ビットで行なうやり方と、4ビットで行なうやり方の2つがあります。

8ビットは、1 度に情報(DB0〜DB7)を液晶ディスプレイに送れる反面、PICなどのマイコンの端子(足)を、8個使います。

4ビットは、2度に情報(DB4〜DB7)を分けて、液晶ディスプレイに送るため、プログラムが長くなりますが、PICなどのマイコン端子が4個ですみます。

本キットでは、4ビットで作ります。


16文字 × 2行の
液晶ディスプレイです。
光るととても綺麗です。
液晶ディスプレイは取り外しできるように、
ピンヘッダを取り付けます。
     
 
ピンソケットは、基板に取り付けます。
 
半固定ボリュームを使い、
コントラストを調節して下さい。
     
裏面は、抵抗をつなぎ、さらにジャンパーさせて、
バックライトが光るようにします。
ブザーは、液晶ディスプレイの下に配置し、
土台としても利用してみました。

【ブレッドボードと液晶ディスプレイについて】

ピンヘッダを取り付けた液晶ディスプレイは、そのままではブレッドボードにはささらないので、工夫が必要です。

写真のように、10ラインに色分けされた線を用意し、10ラインを7ラインと3ラインに分けます。

これを2組用意します。

7ラインに分けた線を重ね合わせ14ラインにし、片方の先端をピンヘッダ、もう片方の先端をピンソケットにハンダ付けします。

ピンヘッダの先がバラけてしまうので、バラけないようにピンヘッダも横一列に並んだものを用意します。

このような、ブレッドボード用の線を用意すると、とても簡単にブレッドボードで、液晶ディスプレイの実験が出来るようになります。


このようなコードを作りました。

ブレッドボードに挿す側です。
熱収縮チューブで絶縁しています。

     
 
液晶ディスプレイ側です。
ピン番号が分かるように、考えて配線しています。
 
ブレッドボードに挿すとこんな感じです。



【工作について】

ユニバーサル基板のため、自由に部品を配置して、構わないのですが、写真のように配置すると、おさまりが良いです。

参考にして下さいね。


電源は、DC9Vの乾電池1個です。
ケースの中に、余裕ではいります。
この9Vは、5Vのプラス電源を
作るための源です。
レギュレターを使って、
9Vを5Vにしています。
この5Vを、PICマイコンや液晶
ディスプレイのプラス電源として使います。
     
 
PICマイコンを使用するため、配線が込み合います。
間違えないように、一つ一つ丁寧に配線して下さい。
 
ピンソケットも、PICマイコンからの
配線で、込み合います。


【使い方】

<ゲーム背景>

時は、第二次世界大戦の真っ只中、ドイツのUボートがイギリスの商船を、無差別に攻撃している頃です。

あなたはイギリス艦隊 駆逐艦の船長となり、大西洋のUボートを撃沈する指令をうけました。

どこに潜んでいるか分からないUボートを、機雷を投下して攻撃して下さい。

今、大西洋に戦いの火ぶたが切られました。

@

スイッチを入れると、
「センスイカン ハカイセヨ」
と、文字がでます。
RB2のボタンを押すと、スタート画面に移行します。

このRB2のボタンを押すまでの間、プログラムはループしていて、RB2が押されると同時に、乱数を発生させる種が生成されます。

この乱数の種は、センスイカンのいる場所(アドレス)の座標に使われますので、難しいですが、同じタイミングでRB2を押すと、センスイカンの場所が、いつも同じ場所にいることになります。



A

ゲームスタート画面は、左上にカーソル(船)が点滅しています。
縦2×横16=32マスの、大海原のどこかに、センスイカンが1機潜んでいます。
RB1とRB2を使い、センスイカンを撃沈して下さい。

RB2 : カーソル(船)が右に進みます。
RB1 : 機雷を投下します。

リセットキー :
   PICマイコンをリセットするので、
   最初からゲームが始まります。



B

例えば、RB1を押してみて下さい。
機雷を投下します。

センスイカンがいないと、ドット(点)だけが表示され、機雷投下が失敗したことになります。
さらにRB1を押すと、機雷をドンドン投下して、ドット(点)が増えていきます。

機雷は15発あり、撃ちつくすと、ゲームオーバーになり、センスイカンの位置を表示してくれます。

ゲームオーバー後は、RB2ボタンを押すと、再ゲームスタートになります。



C

もしも、センスイカンに機雷が当たると、「メイチュウ」もしくは「ゲキハ」の文字が表示されます。

「メイチュウ」の場合は、機雷が当たったのですが撃沈はできず、またどこかに逃げてしまったことになりますが、機雷は15発、補充され、ゲームの最初に戻ります。

「ゲキチン」の場合は、機雷が当たり、撃沈したことになり、グッドエンディングでゲームが終了します。

再度ゲームをする場合は、RB2ボタンを押すと、ゲームの最初に戻ります。



D

「ゲキハ」の場合は、機雷が当たり、撃沈したことになり、グッドエンディングでゲームが終了します。

再度ゲームをする場合は、RB2ボタンを押すと、ゲームの最初に戻ります。



( Youtubeの動画 47秒 )
動画は47秒ですが、実際はもっと楽しめます。



【プログラム】

  ← ピンソケット付なので、PIC16F88 マイコンは

  基板から取り外すことが出来ます。


本PICマイコンには、あらかじめプログラムが書き込まれているので、PICマイコンをいじる必要はありませんが、PICマイコンのプログラムを拡張される方は、次の事項を参考にして下さい。


マイコン開発ソフトは、「マイクロチップ社のMPLAB IDE v8.10(無料)」を利用しています。
尚、プロジェクトファイル名は、ファイル名だけでなくそのファイルを置くパスも、すべて半角英数字にしないと、動きません。
日本語のフォルダーに入れ、ファイル名を半角英数字では動きませんので、注意して下さいね。
(例 C:\モータ\motor\motor.mcp は、「モータ」が日本語のフォルダーなので動きません。)



delay関数を利用していますので、次の作業をしています。(パソコンのシステムは、Cフォルダーにあることとします。)
C:\Program Files\HI-TECH Software\PICC\LITE\9.60\samples\delayのdelay.cとdelay.hを、プロジェクトファイルと同じフォルダーにコピーする。
そしてコピーしたdelay.hの  #define XTAL_FREQ 4MHZ の4を10に変更。

ちなみに、使用したファイルをダウンロード(右クリックして、対象をファイルに保存)できるようにしておきました。
ダウンロード出来るファイルは、4を10に変更してあります。

delay.cファイルのダウンロードはこちらです。(delay.c)
delay.hファイルのダウンロードはこちらです。(delay.h)


PIC16F88マイコンには、次のC言語プログラムが書き込まれていますので、そのままコピーして利用することが出来ますが、マイコンへ書き込む機材によって、コンフィグの書き方が違うので、そのままソースをコピーして書き込んでも、上手く動作しないかもしれません。
その際は、HEXファイルをダウンロード(右クリックして、対象をファイルに保存)して、書き込んでみて下さい。

HEXファイルのダウンロードはこちらです。(picgame03.hex)



PIC16F88は、CONFIGが複雑です。
お持ちの開発ソフトによって、調整して下さい。
私のもっている開発ソフトはバージョンが古いので、次のようになっています。

__CONFIG(HS & WDTDIS & PWRTDIS & LVPDIS & BOREN & DEBUGDIS & UNPROTECT & MCLREN);

バージョンが新しい場合は、同じメーカーの、MPLABを使っていても、記載方法が違いますので、注意して下さい。



PIC16F88は、端子をアナログとデジタルともに使えます。
最初は、アナログに設定されているので、プログラムの最初に、

ANSEL = 0b00000000; //AD変換0ピンから6ピンはデジタルで使用

のように記載して、デジタル出力にしておいて下さい。


センスイカンの場所(アドレス)は、乱数で決めています。
C言語で、乱数字を得る方法は、#include <stdlib.h>と #include <stdio.h>を使って、現在の時刻(TIME)を乱数の種として使うやり方が一般的です。
しかし、PICマイコンで現在の時刻を得ようとしても、どうしても上手く得る事ができなかったため、オープニングムービー後(センスイカン ハカイセヨを表示後)、ボタン待ちにして、その間にC言語でループさせて、ボタンを押した際に、そのループ回数を種として利用しました。
プログラムでは、次の部分となります。

while(RB2==0){
seed = seed + 1;
srand(seed);
ransuuzi7 = rand()%2;
ransuuzi4 = rand()%2;
ransuuzi3 = rand()%2;
ransuuzi2 = rand()%2;
ransuuzi1 = rand()%2;
}


また場所(アドレス)は二進法のため、乱数を2で割って、その余りを使いました。
例 0と1を得るための計算方法
 1÷2=0 余り1
 2÷2=1 余り0
 3÷2=1 余り1
 4÷2=2 余り0
 5÷2=2 余り1
 6÷2=3 余り0
この余りが0と1なので、これを使っています。

そのため、同じタイミングでボタンを押されると、同じ場所にセンスイカンがいることになります。(人間技では不可能ですが。)



DDRAMのアドレスカウンタの読み込みは、PICを読み込みモード TRISB = 0b11111111;  にし、Wはハイレベルでなければ読み込めません。
読み込んだ後は、わすれずに出力 TRISB = 0b00000000; に戻し、Wもローレベルにして下さい。
このタイミングが悪いと、思うようにプログラムが動きませんので注意が必要です。
特に4ビットモードの場合は、1回目と2回目の信号の間に、この作業はいりませんの、注意して下さい。
2回目の信号を送った後に、戻せば十分です。

液晶からの読み込みは、即座に読み込める訳ではないようなので、Flag1を使って、完全に読み込めるまで待っています。

プログラムでは、次の部分です。

/* DDRAMのアドレスカウンタ 読み込みのための関数。 */
void yomikomi(void){

RS = 0 , W = 1 ,E = 1;
TRISB = 0b11111111; /* 入力 */
DelayUs(255);

do{DelayUs(255);
if(RB7==1){Flag1=1;}else{Flag1=0;

if(DB6 == 0){k7 = 0;}else{k7 = 1;}
if(DB5 == 0){k6 = 0;}else{k6 = 1;}
if(DB4 == 0){k5 = 0;}else{k5 = 1;}
DelayUs(255);

E = 0;
DelayUs(255);

E = 1;
DelayUs(255);

if(DB7 == 0){k4 = 0;}else{k4 = 1;}
if(DB6 == 0){k3 = 0;}else{k3 = 1;}
if(DB5 == 0){k2 = 0;}else{k2 = 1;}
if(DB4 == 0){k1 = 0;}else{k1 = 1;}
DelayUs(255);

E = 0;
DelayUs(255);

}
}while(Flag1 != 0);

TRISB = 0b00000000; /* 出力 */
W=0;

}/* 関数yomikomiの終わり。 */

尚、本プログラムでは、DDRAMと読み込み定数は、次のとおりです。

例 DDRAMアドレス  1000011
   k7 k6 k5 k4 k3 k2 k1 の順番に設定してあるので、
   k7=1 k6=0 k5=0 k4=0 k3=0 k2=1 k1=1


C言語ソースは、この下からコピーしてご利用下さい。

//PIC16F88
#include <pic.h>
#include "delay.h"
#include <stdlib.h>
#include <stdio.h>

 

__CONFIG(HS & WDTDIS & PWRTDIS & LVPDIS & BOREN & DEBUGDIS & UNPROTECT & MCLREN);

#define RS RA1
#define E RA0
#define DB4 RB4
#define DB5 RB5
#define DB6 RB6
#define DB7 RB7
#define W RA2

int c;
int k1;
int k2;
int k3;
int k4;
int k5;
int k6;
int k7;
int Flag1;
int ransuuzi1;
int ransuuzi2;
int ransuuzi3;
int ransuuzi4;
int ransuuzi7;
int seed;
int tama;

/* DDRAMのアドレスカウンタ 読み込みのための関数。 */
void yomikomi(void){

RS = 0 , W = 1 ,E = 1;
TRISB = 0b11111111; /* 入力 */
DelayUs(255);

do{DelayUs(255);
if(RB7==1){Flag1=1;}else{Flag1=0;

if(DB6 == 0){k7 = 0;}else{k7 = 1;}
if(DB5 == 0){k6 = 0;}else{k6 = 1;}
if(DB4 == 0){k5 = 0;}else{k5 = 1;}
DelayUs(255);

E = 0;
DelayUs(255);

E = 1;
DelayUs(255);

if(DB7 == 0){k4 = 0;}else{k4 = 1;}
if(DB6 == 0){k3 = 0;}else{k3 = 1;}
if(DB5 == 0){k2 = 0;}else{k2 = 1;}
if(DB4 == 0){k1 = 0;}else{k1 = 1;}
DelayUs(255);

E = 0;
DelayUs(255);

}
}while(Flag1 != 0);

TRISB = 0b00000000; /* 出力 */
W=0;

}/* 関数yomikomiの終わり。 */

/* ------------------ここからLCDの初期設定。------------------------- */
void main(void){

ANSEL = 0b00000000; //AD変換0ピンから6ピンはデジタルで使用
PORTA = 0; /* ポートAは全てロー */
TRISA = 0b00000000; /* 0は出力 1は入力 */
PORTB = 0; /* ポートBは全てロー */
TRISB = 0b00000000; /* 0は出力 1は入力 */

/* 15ms以上待つ */
DelayMs(100);

/* ファンクションセット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1 ;
E = 1;
DelayMs(1);
E = 0;

/* 4.1ms以上待つ */
DelayMs(10);

/* ファンクションセット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;

/* 100μs以上待つ */
DelayMs(1);

/* インターフェースデータ長8ビット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* インターフェースデータ長4ビット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* インターフェースデータ長4ビット、2行、文字形式を5×7ドットマトリクスに設定。ここから4ビット動作。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* 表示オフ */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* 表示オン */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* エントリーモード カーソル右に移動。表示全体はシフトしない。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* 初期設定後 */

/* 表示をONし、カーソルをOFFさせます。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* -------------------オープニング画面-------------------- */

/* 1行目中央にDDRAMアドレス設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RB3 = 1;DelayMs(15);RB3 = 0;RB3 = 1;DelayMs(15);RB3 = 0;
DelayMs(30);
RB3 = 1;DelayMs(15);RB3 = 0;RB3 = 1;DelayMs(15);RB3 = 0;

while(RB2==0){
seed = seed + 1;
srand(seed);
ransuuzi7 = rand()%2;
ransuuzi4 = rand()%2;
ransuuzi3 = rand()%2;
ransuuzi2 = rand()%2;
ransuuzi1 = rand()%2;
}
DelayMs(125);
PORTB = 0; /* ポートBは全てロー */
DelayMs(1);

/* 表示クリア。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* 1行目の先頭(DDRAMのアドレスは0)にアドレスを設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

//四角が流れるオープニング
int a;
for(a=0;a<2;a++){

int b;
for(b=0;b<16;b++){
/* DDRAM書き込み文字例「四角」を書き込みます。 */
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* 音を出す。 */
RB3 = 1;
DelayMs(1);
RB3 = 0;
DelayMs(1);
}

/* 2行目の先頭(DDRAMのアドレスは16進法で40,2進法で1000000)にアドレスを設定。 */
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

}

/* 表示クリア。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* -------------------ゲームスタート-------------------- */

/* 表示をONし、カーソルをON、ブリンクON。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

tama = 0;

while(1){

yomikomi();

if(RB2==1){
/* カーソルを動かす。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

for(a=0;a<1;a++){
RB3 = 1;DelayMs(3);RB3 = 0;RB3 = 1;DelayMs(3);RB3 = 0;DelayMs(3);
}

PORTB = 0; /* ポートBは全てロー */
DelayMs(30);

yomikomi();

if(k7==0&&k6==0&&k5==1&&k4==0&&k3==0&&k2==0&&k1==0){
/* 2行目の先頭アドレスに設定。 */
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
}

if(k7==1&&k6==0&&k5==1&&k4==0&&k3==0&&k2==0&&k1==0){
/* 1行目の先頭アドレスに設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

}

}

//--------------潜水艦メイチュウ判定-----------------------
if(RB1==1){
if(k7==ransuuzi7 && k6==0 && k5==0 && k4==ransuuzi4 && k3==ransuuzi3 && k2==ransuuzi2 && k1==ransuuzi1){

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(10);

//メイチュウ音
for(a=0;a<12;a++){
RB3 = 1;DelayMs(30);RB3 = 0;RB3 = 1;DelayMs(30);RB3 = 0;
DelayMs(30);

/* 表示クリア。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

/* 1行目中央にDDRAMアドレス設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

//GOODエンディング-------------------------
if(ransuuzi1==1){

/* 1行目中央にDDRAMアドレス設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

//ゲキハ
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

DelayMs(150);

/* 2行目中央にDDRAMアドレス設定。 */
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

//ニンムカンリョ
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

for(a=0;a<6;a++){
RB3 = 1;DelayMs(15);RB3 = 0;RB3 = 1;DelayMs(15);RB3 = 0;DelayMs(15);
}
DelayMs(255);
DelayMs(255);

while(RB2==0){}
PORTB = 0; /* ポートBは全てロー */
tama = 0;
return;
}

//メイチュウ
if(tama>=0 && tama<=15){
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 0 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
DelayMs(150);
tama = 0;
return;
}

}

}else{
tama = tama +1;
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

yomikomi();

for(a=0;a<3;a++){
RB3 = 1;DelayMs(8);RB3 = 0;RB3 = 1;DelayMs(8);RB3 = 0;DelayMs(8);
}

PORTB = 0; /* ポートBは全てロー */
DelayMs(3);

//--------------GAMEOVERの画面へ-----------------------
if(tama==15){
for(a=0;a<50;a++){
RB3 = 1;DelayMs(1);RB3 = 0;RB3 = 1;DelayMs(1);RB3 = 0;
DelayMs(1);
}

RS = 0 , DB7 = 1 , DB6=ransuuzi7 , DB5=0 , DB4=0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7=ransuuzi4 , DB6=ransuuzi3 , DB5=ransuuzi2 , DB4=ransuuzi1;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);

RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1 , E = 1;
DelayMs(1) , E = 0 , DelayMs(1);

RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);

while(RB2==0){}
DelayMs(125);
PORTB = 0; /* ポートBは全てロー */
tama = 0;
return;

};

if(k7==0&&k6==0&&k5==1&&k4==0&&k3==0&&k2==0&&k1==0){
/* 2行目の先頭アドレスに設定。 */
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
}

if(k7==1&&k6==0&&k5==1&&k4==0&&k3==0&&k2==0&&k1==0){
/* 1行目の先頭アドレスに設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
}

}
}

};

 

}/* mainの終わり。 */


 
 

 
 

 
Contents are copyright (c) 2009 MASAKATSU BABA All rights reserved.
This site is best viewed with Internet Exploerer 4.0, Netscape Navigator 4.0 or later
ホームページに関するご意見・ご要望はこちらまで .
 





  1. 無料アクセス解析