チーム1623(51/53)

課題名

計算ドリル

研究者名

Atsushi Fukuda
Hosono Kei

ゲーム内容

LCDディスプレイ上に表示される計算式を画面から文字が消える前に計算をする。
キーボードから答えを入力し、正解すれば「Clear」不正解または時間切れなら「Gameover」と表示される。

ソースコード

#include <m8c.h>
#include "PSoCAPI.h"    
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#pragma interrupt_handler myISR
int PW =125;
int SILENT =0,D=229,L=204,M=182;
int true=0;
int TC=0;

void myISR(void ){
  TC+=1;
   PWM16_1_WritePulseWidth(PW);
   if(true==1){
       if (TC==1)
           PWM16_1_WritePeriod(D);

      else if(TC == 3)
           PWM16_1_WritePeriod(L);

      else if (TC == 5)
           PWM16_1_WritePeriod(M);

      else if(TC == 11)
           PWM16_1_WritePeriod(L);

      else if(TC == 13)
           PWM16_1_WritePeriod(D);
   
       else if(TC == 15)
           PWM16_1_WritePeriod(SILENT);

      else if (TC == 17)
           PWM16_1_WritePeriod(D);

      else if(TC == 19)
           PWM16_1_WritePeriod(L);

      else if(TC == 21)
           PWM16_1_WritePeriod(M);

      else if(TC == 23)
           PWM16_1_WritePeriod(L);

      else if(TC == 25)
           PWM16_1_WritePeriod(D);

      else if(TC == 27)
           PWM16_1_WritePeriod(L);

      else if (TC == 35){
           PWM16_1_WritePeriod(SILENT);
           Timer16_1_Stop();
           TC=0;
           true = 0;
       }
   }
   else if (true==0){
       if (TC==1)
           PWM16_1_WritePeriod(D);
       if (TC==32){
           PWM16_1_WritePeriod(SILENT);
           Timer16_1_Stop();
           TC=0;
       }
   }
}
  
void main(void)  {
    int i=0;
   int x;
   int y;
   int s;
   long a = 100000,b;
   char *strPtr;                  
   char x1[10];
   char y1[10];
   char s1[10];    
   
   UART_CmdReset();                  
                                       
   UART_IntCntl(UART_ENABLE_RX_INT);   
   Counter8_WritePeriod(155);            
   Counter8_WriteCompareValue(77);  
   Counter8_Start();                          
     
   UART_Start(UART_PARITY_NONE);       
     
   M8C_EnableGInt ;                     
     
   UART_CPutString("\r\nInput the answer.\r\n");  

  srand(417);

      x=rand()%10;
   csprintf(x1,"%d",x);
   
   LCD_Start();
       y=rand()%10;
   csprintf(y1,"%d",y);
   LCD_Position(0,0);
   
   LCD_PrString(x1);
   
   if (rand()%4==0) {
       LCD_PrCString("+");
       s = x + y;
   }
   else if (rand()%4==1) {
       LCD_PrCString("-");
       s = x-y;
   }
   else if (rand()%4==2){
       LCD_PrCString("*");
       s=x*y;
   }
   else {
       LCD_PrCString("/");
       s=x/y;
   }
           
   LCD_PrString(y1);
   for (b = 0;b < a;b++){
   }
   if(b == a) {
       true=0;
       M8C_EnableGInt;
       PWM16_1_Start();
       Timer16_1_EnableInt();
       Timer16_1_Start();
   }
   LCD_Control(0x01);
           
   csprintf(s1,"%d",s);
   
    while(1) {

     if(UART_bCmdCheck()) {       
              if(strPtr = UART_szGetParam()) {      
               UART_CPutString("Answer =>");    
               UART_PutString(strPtr);   
               UART_CPutString("<\r\n");
           
           if (strcmp(strPtr,s1)==0){
               UART_CPutString("clear!\r\n");
               true=1;
               M8C_EnableGInt;
               PWM16_1_Start();
               Timer16_1_EnableInt();
               Timer16_1_Start();  
           } 
 
            else {
               UART_CPutString("Gameover\r\n");
               true=0;
               M8C_EnableGInt;
               PWM16_1_Start();
               Timer16_1_EnableInt();
               Timer16_1_Start();
           }
           }
        UART_CmdReset();
   }
   }
   }

ブロック図

exercise.png

考察

uart_1、timer_pwm2を組み合わせて作成した。
0~9の数字をrand()関数により2つ作成し、四則演算のどれかでランダムに計算されるようにして、その答えの値をキーボードから入力して答えがあっていれば音楽が流れて、パソコン上に「Clear」と表示され、間違えたり、LCDディスプレイ上に表示されている間に回答できなかった場合「Gameover」と表示されるようにした。また、rand()関数で得られる値が毎回同じ値になってしまうのでsrand()関数を呼びだしてシード値を設定しようとしたが上手くいかなかった。
計算する回数を増やしたり、桁数を上げたりすることで応用できる。

  • 最終更新:2016-06-14 15:44:17

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

認証パスワード