A panel
A kijelzőkép
Kapcsolás
Wiring program
http://dl.dropbox.com/u/998596/Puzzle_v12.pde
Kód: Egész kijelölése
/*
Projekt: GAME - Wiring
Fájlnév: PUZZLE_V12.PDE
Dátum: 2011.06.01.
Mcu: ATMega128
Program: Wiring 0027
Verziószám: V1.2
Szerző: Szegő János
E-mail: szego@umszki.hu
*/
#include "LiquidCrystal.h"
boolean bad_key;
boolean sound_ena;
boolean game_start;
boolean manual_end;
boolean field_ready;
unsigned char cols[] = {30, 29, 28};
unsigned char rows[] = {27, 26, 25, 24};
unsigned char button[] = {1, 4, 7, 11, 2, 5, 8, 10, 3, 6, 9, 12};
unsigned char counter;
unsigned char key_num;
unsigned char key_input;
unsigned char item_index;
unsigned char row;
unsigned char col;
unsigned int byte_counter;
unsigned int steps;
unsigned int seconds;
unsigned int minutes;
unsigned int item[10];
unsigned int temp;
unsigned int limit;
unsigned long previousTime = 0;
LiquidCrystal lcd = LiquidCrystal(39, 38, 37, 5);
void setup() {
keypad_init();
}
void keypad_init() {
for (row=0; row<4; row++) {
pinMode(rows[row],INPUT); // rows: bemenetek
digitalWrite(rows[row],HIGH); // felhúzó ellenállások konfigurálása
}
for (col=0; col<3; col++) {
pinMode(cols[col],OUTPUT); // cols: kimenetek
digitalWrite(cols[col],HIGH); // nyugalmi magas szintek beállítása
}
}
void getkey() {
counter = 0;
key_input = 12;
for (col=0; col<3; col++) {
digitalWrite(cols[col],LOW);
for (row=0; row<4; row++) {
if (digitalRead(rows[row])==0) {
key_input = counter;
}
counter++;
}
digitalWrite(cols[col],HIGH);
}
}
void display_init() {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" *** Puzzle ***");
lcd.setCursor(0, 3);
lcd.print("Press a Key to Begin");
key_input = 12;
while(key_input==12) {
getkey();
}
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("| |");
lcd.setCursor(2, 1);
lcd.print("| |");
lcd.setCursor(2, 2);
lcd.print("| | Mixing");
lcd.setCursor(9, 0);
lcd.print("----------");
lcd.setCursor(2, 3);
lcd.print("-----------------");
}
void game_inic() {
item[1] = 1;
item[2] = 2;
item[3] = 3;
item[4] = 4;
item[5] = 5;
item[6] = 6;
item[7] = 7;
item[8] = 8;
item[9] = 32;
limit = millis();
for (byte_counter=0; byte_counter<limit; byte_counter++) {
key_num = random(10);
if (key_num == 0) {
key_num = random(10);
conversion();
push_item();
}
}
lcd.setCursor(9, 2);
lcd.print("Get Ready");
delay(2000);
lcd.setCursor(9, 1);
lcd.print("Step ");
lcd.print(steps);
lcd.setCursor(9, 2);
lcd.print("Time ");
time_write();
}
void time_write() {
lcd.setCursor(14, 2);
if (minutes<10) {
lcd.print("0");
}
lcd.print(minutes);
lcd.print(":");
if (seconds<10) {
lcd.print("0");
}
lcd.print(seconds);
}
void conversion() {
for (counter=1; counter<10; counter++) {
if (item[counter]==key_num) {
item_index = counter;
counter = 10;
}
}
}
void field_write() {
lcd.setCursor(3, 0);
for (counter=1; counter<4; counter++) {
if (item[counter]==32) {
lcd.print(" ");
}
else {
lcd.print(item[counter]);
}
}
lcd.setCursor(3, 1);
for (counter=4; counter<7; counter++) {
if (item[counter]==32) {
lcd.print(" ");
}
else {
lcd.print(item[counter]);
}
}
lcd.setCursor(3, 2);
for (counter=7; counter<10; counter++) {
if (item[counter]==32) {
lcd.print(" ");
}
else {
lcd.print(item[counter]);
}
}
if (game_start==true) {
lcd.setCursor(9, 1);
steps++;
lcd.print("Step ");
lcd.print(steps);
good_signal();
}
}
void push_item() {
switch (item_index) {
case 1:
if (item[2]==32) {
item[2] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[4]==32) {
item[4] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
break;
case 2:
if (item[1]==32) {
item[1] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[3]==32) {
item[3] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[5]==32) {
item[5] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
}
break;
case 3:
if (item[2]==32) {
item[2] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[6]==32) {
item[6] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
break;
case 4:
if (item[1]==32) {
item[1] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[5]==32) {
item[5] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[7]==32) {
item[7] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
}
break;
case 5:
if (item[2]==32) {
item[2] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[4]==32) {
item[4] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[6]==32) {
item[6] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[8]==32) {
item[8] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
}
}
break;
case 6:
if (item[3]==32) {
item[3] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[5]==32) {
item[5] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[9]==32) {
item[9] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
}
break;
case 7:
if (item[4]==32) {
item[4] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[8]==32) {
item[8] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
break;
case 8:
if (item[5]==32) {
item[5] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[7]==32) {
item[7] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[9]==32) {
item[9] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
}
break;
case 9:
if (item[6]==32) {
item[6] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
if (item[8]==32) {
item[8] = item[item_index];
item[item_index] = 32;
field_write();
}
else {
bad_key = true;
}
}
break;
}
}
void good_signal() {
if (sound_ena==true) {
tone(23, 523, 200);
}
}
void bad_signal() {
if (sound_ena==true) {
tone(23, 220, 100);
}
}
void time_increment() {
previousTime = millis();
seconds++;
if (seconds>59) {
seconds = 0;
minutes++;
if (minutes>59) {
minutes = 0;
}
}
time_write();
}
void result_check() {
if ((item[1]==1) && (item[2]==2) && (item[3]==3) && (item[4]==4) && (item[5]==5) && (item[6]==6) && (item[7]==7) && (item[8]==8)) {
field_ready = true;
}
}
void loop() {
while (1) {
steps = 0;
seconds = 0;
minutes = 0;
sound_ena = true;
game_start = false;
manual_end = false;
display_init();
game_inic();
previousTime = millis();
game_start = true;
bad_key = false;
field_ready = false;
while((manual_end==false) && (field_ready==false)) {
key_input = 0;
delay(50);
while(key_input!=12) { // elengedésre vár
if((millis() - previousTime) >= 1000 ) {
time_increment();
}
getkey();
}
delay(50);
while(key_input==12) { // megnyomásre vár
if((millis() - previousTime) >= 1000 ) {
time_increment();
}
getkey();
}
key_num = button[key_input];
if (key_num<9) {
conversion();
push_item();
result_check();
}
if (key_num==11) {
manual_end = true;
}
if (key_num==12) {
if (sound_ena==false) {
sound_ena = true;
}
else {
sound_ena = false;
}
}
if (bad_key==true) {
bad_key = false;
bad_signal();
}
if (field_ready==true) {
delay(200);
good_signal();
delay(200);
good_signal();
}
}
}
}