Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- #include <MsTimer2.h>
- int pin_LCD_DATA[8] = {A8,A9,A10,A11,A12,A13,A14,A15};
- int pin_LCD_CTRL[3] = {A5,A6,A7};
- LiquidCrystal lcd(A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15);
- int sw[6] = {22,24,26,28,30}; // Switch
- int joy_sw = 48; //Joystick Switch
- const int joy_x = A3; //JoyStick X_AXIS
- const int joy_y = A4; //joyStic Y_AXIS
- const int piezo = 2;
- int pin_FND_DATA[8] = {23, 25, 27, 29, 31, 33, 35, 37};
- int pin_FND_SELECT[6] = {39, 41, 43, 45, 47, 49};
- uint8_t FND_data[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x6F,0x77, 0x7C, 0x39, 0x5E, 0x79, 0x1};
- uint8_t data_Cipher[6] = {0,72,137,0,0,0};
- void setup() {
- int i;
- lcd.begin(16,2);
- pinMode(sw,INPUT_PULLUP);
- pinMode(sw,INPUT_PULLUP);
- pinMode(joy_sw, INPUT_PULLUP);
- randomSeed(analogRead(0));
- for(i=0; i<8; i++)
- pinMode(pin_FND_DATA[i], OUTPUT);
- for(i=0; i<6; i++)
- pinMode(pin_FND_SELECT[i], OUTPUT);
- FND_select(0x3F);
- MsTimer2::set(2, FND_ISR);
- MsTimer2::start();
- }
- void loop() {
- int h=0 , w=0, r_h=0 , r_w=0, cnt=0; //음식 위치와, 랜덤으로 떨어질 위치
- int eat_h[8], eat_w[8], eat_f[8]; //먹었을때 배열에다가 1저장
- double sec=0;
- while(1)
- {
- if(cnt==8){cnt=0; break;}
- int cksum=0;
- r_h = random(1,15); //랜덤함수를 변수에 저장
- r_w = random(0,2); //랜덤함수를 변수에 저장
- eat_h[cnt]=r_h; eat_w[cnt]=r_w;
- for(int i=0;i<cnt;i++)
- {
- if((r_h==eat_h[i])&&(r_w==eat_w[i])){cksum=1; i=8;}
- }
- if(cksum==1) cnt=cnt;
- else cnt++;
- }
- for(int i=0;i<8;i++)
- {
- eat_f[i]=0;
- }
- intro();
- while(2){
- int num_x = analogRead(joy_x); //조이스틱값을 변수에 저장
- int num_y = analogRead(joy_y); // 조이스틱값을 변수에 저장
- lcd.clear();
- lcd.setCursor(h,w);
- lcd.print("*");
- foods(h,w,eat_h,eat_w,eat_f);
- for(int i=0; i<8; i++)
- {
- if(eat_f[i]==1) cnt++;
- }
- delay(200);
- sec+=200;
- if(cnt==8){FND_output(sec/1000,cnt); gameover(sec); break;}
- else {FND_output(sec/1000,cnt);cnt=0;}
- if((num_y>=0)&&(num_y<500)) {w=0;}//UP , x축,y축 범위안에 들어오면 위로!!
- if((num_y>530)&&(num_y<=1024)) {w=1;}//DOWN, x축,y축 범위안에 들어오면 아래로!!
- if((num_x>530)&&(num_x<=1024)) {if(h<=0){continue;}h--;}//LEFT, x축,y축 범위안에 들어오면 왼쪽으로!!
- if((num_x>=0)&&(num_x<500)) {if(h>=15){continue;}h++;}//RIGHT, x축,y축 범위안에 들어오면 오른쪽으로!!
- }
- }
- int foods(int *h,int *w,int *eat_h, int *eat_w,int *eat_f){
- for(int i=0;i<8;i++)
- {
- lcd.setCursor(eat_h[i],eat_w[i]);
- if((eat_f[i]==0)&&((h==eat_h[i])&&(w==eat_w[i]))){lcd.print(""); eat_f[i]=1; sound();} // 0~7배열에 전부 0이 들어가있는데 조이스틱으로 움직이고 있는 우리의 위치와 랜덤함수로 인해 랜덤하게 떨어진 음식이랑 좌표가 같으면 배열에 1이 들어가 카운트하고 소리나옴.
- else if(eat_f[i]==1){lcd.print(""); }
- else lcd.print("=");
- }
- }
- int intro(void){ //처음화면
- while(3){
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("=====MOZZI!=====");
- lcd.setCursor(0,1);
- //lcd.print("Press UP 2 START");
- lcd.print("Press 2 JOYSTICK");
- if(digitalRead(joy_sw) == LOW) break;
- delay(100);
- }
- }
- int gameover(double sec){ //게임이 종료되고 게임 클리어 화면 출력, 게임하는동안 걸린 시간 출력
- while(4)
- {
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("GAME CLEAR!");
- lcd.setCursor(0,1);
- lcd.print("PlayTime:");
- lcd.setCursor(9,1);
- lcd.print(sec/1000);
- lcd.print("s");
- if(digitalRead(joy_sw) == LOW){break;}
- delay(100);
- }
- }
- int sound(void) // 음식먹을때 나오는 사운드
- {
- //lcd.clear();
- tone(piezo,8); delay(20); noTone(piezo);//delay(100);
- tone(piezo,1319); delay(20); noTone(piezo);//delay(100);
- tone(piezo,850); delay(20); noTone(piezo);//delay(100);
- // noTone(pin_PIEZO);
- }
- int FND_output(long sec,int cnt) // FND 게임하는 동안 걸리시간을 실시간으로 출력
- {
- long temp_num = sec;
- data_Cipher[0] = cnt;
- //data_Cipher[1] = 72;
- //data_Cipher[2] = 137;
- temp_num = temp_num%1000; data_Cipher[3] = temp_num/100; // 과제 타이머를 응용해서 사용
- temp_num = temp_num%100; data_Cipher[4] = temp_num/10;
- data_Cipher[5] = temp_num%10;
- }
- void FND_select(uint8_t da)
- {
- for(int i=0; i<6; i++)
- digitalWrite(pin_FND_SELECT[i], (da>>i) & 0x01);
- }
- void FND_data_out(uint8_t da)
- {
- for(int i=0; i<8; i++)
- digitalWrite(pin_FND_DATA[i], (da>>i) & 0x01);
- }
- void FND_ISR(void)
- {
- static int i=0;
- FND_data_out(0);
- FND_select(~(0x001<<i));
- FND_data_out(FND_data[data_Cipher[i]]);
- if(i==5){i=0;}
- else{i++;}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement