チーム1567

課題名

スロットゲーム

研究者名

Yuumi Matsuoka
Kouki Wada

概要・仕様

1から3までの数字がランダムに変化する数字をLCD上に3つ用意し、
スイッチボタンを押せば、一つ数字が止まる。
その3つの数字がそろえば、CONGURATULATION!とその下に表示され、
スピーカーから音楽が流れる。
また、そろった数字ごとに流れる音楽が違う仕様になっており、
1がそろった場合はキラキラ星、
2がそろった場合はカエルの歌、
3がそろった場合はドレミの歌が流れる。

使用機材

・PSoC基盤×1
・ジャンパー線×2
・MiniProg×1
・スピーカー×1

ソースコード

slot.png


#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

#pragma interrupt_handler myISR

#include <stdio.h>
#include <stdlib.h>

#define SW 0b00010000
#define DIVIDE 3

int PW = 125;
int SILENT=0,D=229,L=204,M=182,F=172,S=153,R=136,C=121,DD=115,LL=102,MM=91;
int TC=0;
int n=0;

void myISR(void){
TC += 1;
きらきら星
 if(n == 1){
       PWM16_1_WritePulseWidth(PW);
           if(TC==2)
       PWM16_1_WritePeriod(D);
           else if(TC==4)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==5)
       PWM16_1_WritePeriod(D);
           else if(TC==7)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==8)
       PWM16_1_WritePeriod(S);
           else if(TC==10)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==11)
       PWM16_1_WritePeriod(S);
           else if(TC==13)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==14)
       PWM16_1_WritePeriod(R);
           else if(TC==16)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==17)
       PWM16_1_WritePeriod(R);
           else if(TC==19)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==20)
       PWM16_1_WritePeriod(S);
           else if(TC==25)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==26)
       PWM16_1_WritePeriod(F);
           else if(TC==28)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==29)
       PWM16_1_WritePeriod(F);
           else if(TC==31)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==32)
       PWM16_1_WritePeriod(M);
           else if(TC==34)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==35)
       PWM16_1_WritePeriod(M);
           else if(TC==37)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==38)
       PWM16_1_WritePeriod(L);
           else if(TC==40)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==41)
       PWM16_1_WritePeriod(L);
           else if(TC==43)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==44)
       PWM16_1_WritePeriod(D);
           else if(TC==49)
       PWM16_1_WritePeriod(SILENT);
   }
       
カエルの歌
  else if (n == 2){
       PWM16_1_WritePulseWidth(PW);
           if(TC==2)
       PWM16_1_WritePeriod(D);
           else if(TC==4)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==5)
       PWM16_1_WritePeriod(L);
           else if(TC==7)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==8)
       PWM16_1_WritePeriod(M);
           else if(TC==10)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==11)
       PWM16_1_WritePeriod(F);
           else if(TC==13)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==14)
       PWM16_1_WritePeriod(M);
           else if(TC==16)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==17)
       PWM16_1_WritePeriod(L);
           else if(TC==19)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==20)
       PWM16_1_WritePeriod(D);
           else if(TC==25)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==26)
       PWM16_1_WritePeriod(M);
           else if(TC==28)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==29)
       PWM16_1_WritePeriod(F);
           else if(TC==31)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==32)
       PWM16_1_WritePeriod(S);
           else if(TC==34)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==35)
       PWM16_1_WritePeriod(R);
           else if(TC==37)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==38)
       PWM16_1_WritePeriod(S);
           else if(TC==40)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==41)
       PWM16_1_WritePeriod(F);
           else if(TC==43)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==44)
       PWM16_1_WritePeriod(M);
           else if(TC==49)
       PWM16_1_WritePeriod(SILENT);
   }

ドレミの歌
  else if(n == 3){
       PWM16_1_WritePulseWidth(PW);
           if(TC==2)
       PWM16_1_WritePeriod(D);
           else if(TC==5)
       PWM16_1_WritePeriod(L);
           else if(TC==6)
       PWM16_1_WritePeriod(M);
           else if(TC==8)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==9)
       PWM16_1_WritePeriod(D);
           else if(TC==10)
       PWM16_1_WritePeriod(M);
           else if(TC==12)
       PWM16_1_WritePeriod(D);
           else if(TC==14)
       PWM16_1_WritePeriod(M);
           else if(TC==17)
       PWM16_1_WritePeriod(SILENT);
           else if(TC==18)
       PWM16_1_WritePeriod(L);
           else if(TC==21)
       PWM16_1_WritePeriod(M);
           else if(TC==22)
       PWM16_1_WritePeriod(F);
           else if(TC==23)
       PWM16_1_WritePeriod(F);
           else if(TC==24)
       PWM16_1_WritePeriod(M);
           else if(TC==25)
       PWM16_1_WritePeriod(L);
           else if(TC==26)
       PWM16_1_WritePeriod(F);
           else if(TC==31)
       PWM16_1_WritePeriod(SILENT);
   }
}


音楽が流れるかの確認用の関数
void slot_test(void){

//int sl[3] = {1,1,1};
 //int sl[3] = {2,2,2};
 int sl[3]={3,3,3};
  char str0[5],str1[5],str2[5];
  
  M8C_EnableGInt;
  Timer16_1_EnableInt();
  LCD_1_Start();
  PWM16_1_Start();
  
  
  PRT1DR &= (~SW);
  
  csprintf(str0,"%d",sl[0]);
  csprintf(str1,"%d",sl[1]);
  csprintf(str2,"%d",sl[2]);
  
  LCD_1_PrString(str0);
  LCD_1_PrCString(" ");
  LCD_1_PrString(str1);
  LCD_1_PrCString(" ");
  LCD_1_PrString(str2);
  
  while(1){
      if(PRT1DR && SW)
          break;
  }
  if(sl[0] == 1 && sl[1] == 1 && sl[2] == 1){
      //割り込み、音鳴らす,LCD    
       n = 1;
      Timer16_1_Start();
      LCD_1_Position(1,0);
      LCD_1_PrCString("CONGURATULATION!");
      while(1){};   
  }
  
  if(sl[0] == 2 && sl[1] == 2 && sl[2] == 2){
      //割り込み、音鳴らす,LCD 
       n=2;
      Timer16_1_Start();
      LCD_1_Position(1,0);
      LCD_1_PrCString("CONGURATULATION!");
      while(1){};
  }
  
  if(sl[0] == 3 && sl[1] == 3 && sl[2] == 3){
      //割り込み、音鳴らす,LCD    
       n=3;
      Timer16_1_Start();
      LCD_1_Position(1,0);
      LCD_1_PrCString("CONGURATULATION!");
      while(1){};   
  }
}

void slot(void){

int sl[3];
  int flag = 0,tcc = 0,flag_2 = 0;
  char str0[5],str1[5],str2[5];
  
  M8C_EnableGInt;
  Timer16_1_EnableInt();
  LCD_1_Start();
  PWM16_1_Start();

  
  PRT1DR &= (~SW);
  
  while(1){
      LCD_1_Start();
  
      tcc = 0;
  
      sl[0] = rand() % DIVIDE +1;
      sl[1] = rand() % DIVIDE +1;
      sl[2] = rand() % DIVIDE +1;
      

    
      csprintf(str0,"%d",sl[0]);
      csprintf(str1,"%d",sl[1]);
      csprintf(str2,"%d",sl[2]);
      
      LCD_1_PrString(str0);
      LCD_1_PrCString(" ");
      LCD_1_PrString(str1);
      LCD_1_PrCString(" ");
      LCD_1_PrString(str2);
      
      while(tcc < 10000){
           tcc ++;
          
           if(PRT1DR & SW){
                  flag = 1;
                  break;
           }
      }
      
      if(flag == 1)
          break;
  }

while(1){
      LCD_1_Start();
      
      tcc = 0;
      
  
      
      sl[1] = rand() % DIVIDE +1;
      sl[2] = rand() % DIVIDE +1;
      
      csprintf(str1,"%d",sl[1]);
      csprintf(str2,"%d",sl[2]);
      
      LCD_1_PrString(str0);
      LCD_1_PrCString(" ");
      LCD_1_PrString(str1);
      LCD_1_PrCString(" ");
      LCD_1_PrString(str2);
      
      if(PRT1DR == 0b00000000)
          flag = 0;
      
      
      
      while(tcc < 10000){
          tcc ++;
          
          if(PRT1DR && SW && flag == 0){
          flag_2 = 1;
          break;
          }
          
      }
      
      if(flag_2 == 1)
          break;
  }        
  
  
  while(1){
      LCD_1_Start();
      
      tcc = 0;
  
      sl[2] = rand() % DIVIDE +1;
      
      csprintf(str2,"%d",sl[2]);
      
      LCD_1_PrString(str0);
      LCD_1_PrCString(" ");
      LCD_1_PrString(str1);
      LCD_1_PrCString(" ");
      LCD_1_PrString(str2);
      
      if(PRT1DR == 0b00000000)
          flag_2 = 0;
      
      while(tcc < 10000){
          tcc ++;
          
          if(PRT1DR && SW && flag_2 == 0){
          flag = 1;
          break;
          }
          
      }
      if(flag == 1)
          break;
  }
  
  if(sl[0] == 1 && sl[1] == 1 && sl[2] == 1){
      //割り込み、音鳴らす,LCD    
      n = 1;
      Timer16_1_Start();
      LCD_1_Position(1,0);
      LCD_1_PrCString("CONGURATULATION!");
      while(1){};
  }
  
  if(sl[0] == 2 && sl[1] == 2 && sl[2] == 2){
      //割り込み、音鳴らす,LCD    
      n = 2;
      Timer16_1_Start();
      LCD_1_Position(1,0);
      LCD_1_PrCString("CONGURATULATION!");
      while(1){};
  }
  
  if(sl[0] == 3 && sl[1] == 3 && sl[2] == 3){
      //割り込み、音鳴らす,LCD    
      n = 3;
      Timer16_1_Start();
      LCD_1_Position(1,0);
      LCD_1_PrCString("CONGURATULATION!");
      while(1){};
  }
}

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   slot();
   //slot_test();
   while(1){};
}

考察

153Bのソースコードを参照し、そろった際の音楽の追加、LCDの表示などを拡張
した。
今回初めはボタンを3つに増やし、それぞれ数字を別々に止めれるようにしたかっ
たが、時間の都合上できなかった。おそらく、シリアル通信を使うことで、キー
ボード入力にでき、ボタンを増やせるかと考えられる。
また、今回私たちが作ったソースコードでは、数字のランダムが1から3の時だけ、
数字がそろった際音楽が流れるが、ランダムの数字を増やしても音楽がそれぞれ
別に流れるようにすればさらに良いかと思われる。

  • 最終更新:2015-12-22 16:02:16

このWIKIを編集するにはパスワード入力が必要です

認証パスワード