チーム1625(55/57)
課題名
年末ジャンボ宝くじ2015シミュレーター
研究者名
Yu Matsushima
Yuta Yamada
概要
年末ジャンボ宝くじ2015の結果に基づいたシミュレーター。
自分のくじの番号、当選状況はTera_Term上に表示する。
1等~6等、前後賞、組違い賞がある。
乱数で番号を設定し、結果と見比べる。
当選すると当選金額がTera_Termに表示され、ファンファーレが鳴る。
使用機材
PSoC基盤
ジャンパ線2本
スピーカー
PSoCMiniProg
シリアル通信ケーブル
回路図
クリックで拡大。
ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include <stdlib.h>
#include <stdio.h>
#pragma interrupt_handler myISR
int PW=125;
int SILENT =0,D=229,L=204,M=182,F=172,S=153,R=136,C=121,DD=115;
int TC=0;
void myISR(void)
{
TC += 1; PWM16_1_WritePulseWidth(PW); if(TC == 1) PWM16_1_WritePeriod(R); else if (TC == 3) PWM16_1_WritePeriod(SILENT); else if(TC == 4) PWM16_1_WritePeriod(R); else if (TC == 5) PWM16_1_WritePeriod(SILENT); else if (TC == 6) PWM16_1_WritePeriod(R); else if (TC == 7) PWM16_1_WritePeriod(SILENT); else if(TC == 8) PWM16_1_WritePeriod(R); else if (TC == 12) PWM16_1_WritePeriod(SILENT); else if(TC == 13) PWM16_1_WritePeriod(C); else if (TC == 17) PWM16_1_WritePeriod(R); else if(TC == 21) PWM16_1_WritePeriod(C); else if(TC == 25) PWM16_1_WritePeriod(R); else if (TC == 28) PWM16_1_WritePeriod(SILENT); else if (TC == 29) PWM16_1_WritePeriod(R); else if (TC == 30) PWM16_1_WritePeriod(SILENT); else if (TC == 31) PWM16_1_WritePeriod(R); else if (TC == 32) PWM16_1_WritePeriod(SILENT); else if (TC == 33) PWM16_1_WritePeriod(R); else if (TC == 37) PWM16_1_WritePeriod(SILENT);
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. char *strPtr; int k, n1, n2, i; char *stk; char *stn1; char *stn2; 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("年末ジャンボシミュレーター(2015) \r\n"); UART_CPutString("当選番号 \r\n"); UART_CPutString("1等:86組 106608番(7億円) \r\n"); UART_CPutString("2等:~5組 152324番(1000万円) \r\n"); UART_CPutString("3等:~~組 181461番(100万円) \r\n"); UART_CPutString("4等:~~組 ~~0607番(5万円) \r\n"); UART_CPutString("5等:~~組 ~~~~68番(3000円) \r\n"); UART_CPutString("6等:~~組 ~~~~~9番(300円) \r\n"); UART_CPutString("前後賞:86組 106607、106609番(1.5億円) \r\n"); UART_CPutString("組違い賞:~~組106608番(10万円) \r\n"); UART_CPutString("\r\n"); i = rand(); while(1) { if(UART_bCmdCheck()) { if(strPtr = UART_szGetParam()) { srand(i); k = rand()%100+1; n1 = rand()%10000+10000; n2 = rand()%10; csprintf(stk, "%d", k); UART_CPutString("あなたのくじの組:"); UART_PutString(stk); UART_CPutString("\r\n"); UART_CPutString("あなたのくじの番号:"); csprintf(stn1, "%d", n1); UART_PutString(stn1); csprintf(stn2, "%d", n2); UART_PutString(stn2); UART_CPutString("\r\n"); if(k==86 && n1==10660 && n2==8){ UART_CPutString("1等:7億円当選!!!!!"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(k%10==5 && n1==15232 && n2==4){ UART_CPutString("2等:1000万円当選!!!"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(n1==18146 && n2==1){ UART_CPutString("3等:100万円当選!"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(n1%1000==67 && n2==6){ UART_CPutString("4等:5万円当選"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(n1%10==6 && n2==8){ UART_CPutString("5等:3000円当選"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(n2==9){ UART_CPutString("6等:300円当選"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(n1==10660 && n2==8){ UART_CPutString("組違い賞:10万円当選"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if((k==86 && n1==10660 && n2==7) | | (k==86 && n1==10660 && n2==9)){ UART_CPutString("前後賞:1.5億円当選!!!!"); M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else UART_CPutString("はずれ~~~"); UART_CPutString("\r\n\r\n"); i++; } UART_CmdReset(); } }
}
考察
参考にしたラボ
uart_1
timer_pwm2
組は1~100までの整数、番号は6ケタの整数である。
番号を一つの乱数でうまく生成・表示させることができなかったので、上5ケタと下1ケタを分けて生成し、表示させることとした。
乱数を生成する際、Time関数を使いたかったのだが、time.hをincludeしても使うことができなかった。
time.hの中を見てみたところ、何も書いていなかったので、ここを自分で書けば使えたと考えられる。
他にいい乱数の生成法が浮かばず、結局疑似的な乱数となってしまい、実行し直すと最初からまた同じパターンが始まってしまう。
time関数を使える状況にする、あるいはtime関数を使わないいい乱数のシードを思いつけば、完全に乱数での抽選が行えたはずである。
また、まれに原因不明の文字化けも起こってしまう。
- 最終更新:2016-06-14 15:53:24