Advertisement
merte_edenflower

Airhockey test

Mar 21st, 2016
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //include pwm display
  2. #include "Adafruit_TLC59711.h"//pwm control board driver
  3. #include <SPI.h>//hardware serial port
  4. //define pins
  5. #define s_latch 10//latch/update pin for score board
  6. #define s_data 9//data pin for score board
  7. #define s_clock 8//clock pin for scoreboard
  8. #define L_dataPin 11//data pin for pwm control board
  9. #define L_clockPin 13//clock pin for pwm control board
  10. #define p1Button 2//button for player 1
  11. #define p2Button 3//button for player 2
  12. #define rstButton 4//reset button
  13. #define p1scorepoint 2//deflection point for player 1
  14. #define p2scorepoint 11//deflection point for player 2
  15. //define different numerical characters for the score display
  16. #define s_blank 255
  17. #define s_0 3
  18. #define s_1 159
  19. #define s_2 37
  20. #define s_3 13
  21. #define s_4 153
  22. #define s_5 73
  23. #define s_6 65
  24. #define s_7 31
  25. #define s_8 1
  26. #define s_9 9
  27. #define s_e 97
  28. //init global variables
  29. //settings
  30. int t_delay = 50;// set time delay / 5
  31. //internal use
  32. int currentlednumber = 1;
  33. bool direc = false;
  34. bool runnin = false;
  35. bool p1deflect = false;
  36. bool p2deflect = false;
  37. int p1score = 0;
  38. int p2score = 0;
  39. //set pwm var
  40. Adafruit_TLC59711 tlc = Adafruit_TLC59711(1, L_clockPin, L_dataPin);
  41.  
  42. void setup() {
  43.   // put your setup code here, to run once:
  44.   pinMode(s_latch, OUTPUT);
  45.   pinMode(s_data, OUTPUT);
  46.   pinMode(s_clock, OUTPUT);
  47.   pinMode(p1Button, INPUT);
  48.   pinMode(p2Button, INPUT);
  49.   pinMode(rstButton, INPUT);
  50.   attachInterrupt(digitalPinToInterrupt(p1Button), button_p1, FALLING);
  51.   attachInterrupt(digitalPinToInterrupt(p2Button), button_p2, FALLING);
  52.   screen_init();
  53.   tlc.begin();
  54.   tlc.write();
  55. }
  56.  
  57. void loop() {
  58.   // put your main code here, to run repeatedly:
  59.   for (uint8_t i = 0; i < 10; i++) {
  60.     deflect();
  61.     delay(t_delay);
  62.   }
  63.   if (runnin) {
  64.     if (direc) {
  65.       currentlednumber--;
  66.       if (currentlednumber < 0) {
  67.         score(1);
  68.         direc = false;
  69.       }
  70.     }
  71.     else {
  72.       currentlednumber++;
  73.       if (currentlednumber > 12) {
  74.         score(2);
  75.         direc = true;
  76.       }
  77.     }
  78.     updateleds();
  79.   }
  80. }
  81.  
  82. void updateleds() {
  83.   for (uint16_t i = 0; i < 12; i++) {
  84.     if (i == currentlednumber) {
  85.       tlc.setPWM(i, 4095);
  86.     }
  87.     else {
  88.       tlc.setPWM(i, 0);
  89.     }
  90.   }
  91.   tlc.write();
  92. }
  93. void deflect() {
  94.   if (p1deflect || p2deflect) {
  95.     if (!runnin) {
  96.       runnin = true;
  97.     }
  98.     else {
  99.       if (p1deflect && (currentlednumber == p1scorepoint) && direc) {
  100.         direc = false;
  101.         p1deflect = false;
  102.       }
  103.       if (p2deflect && (currentlednumber == p2scorepoint) && !direc) {
  104.         direc = true;
  105.         p2deflect = false;
  106.       }
  107.     }
  108.   }
  109.   upd();
  110. }
  111. void score(int player) {
  112.   if (player == 1) {
  113.     for (uint8_t i = 0; i < 5; i++) {
  114.       for (uint8_t j = 0; j < 2; j++) {
  115.         tlc.setPWM(j, 4095);
  116.       }
  117.       for (uint8_t j = 2; j < 12; j++) {
  118.         tlc.setPWM(j, 0);
  119.       }
  120.       tlc.write();
  121.       delay(100);
  122.     }
  123.     if (p1score >! 99) {
  124.       p1score++;
  125.     }
  126.   }
  127.   if (player == 2) {
  128.     for (uint8_t i = 0; i < 5; i++) {
  129.       for (uint8_t j = 0; j < 10; j++) {
  130.         tlc.setPWM(j, 0);
  131.       }
  132.       for (uint8_t j = 10; j < 12; j++) {
  133.         tlc.setPWM(j, 4095);
  134.       }
  135.       tlc.write();
  136.       delay(100);
  137.     }
  138.     if (p2score >! 99) {
  139.       p2score++;
  140.     }
  141.   }
  142.   setscore(p1score, p2score);
  143. }
  144. //<<------ screen functions ------->>
  145. void screen_init() {
  146.   digitalWrite(s_data, HIGH);
  147.   for (uint16_t i = 0; i < 32; i++) {
  148.     digitalWrite(s_clock, HIGH);
  149.     digitalWrite(s_clock, LOW);
  150.   }
  151.   digitalWrite(s_latch, HIGH);
  152.   digitalWrite(s_latch, LOW);
  153. }
  154. void setscore(uint16_t score1, uint16_t score2) {
  155.   uint8_t score_1 = finddigit((score1 / 10));
  156.   uint8_t score_2 = finddigit((score1 % 10));
  157.   uint8_t score_3 = finddigit((score2 / 10));
  158.   uint8_t score_4 = finddigit((score2 % 10));
  159.   if ((score_1 > 9) || (score_2 > 9) || (score_3 > 9) || (score_4 > 9)){
  160.   writedigit(10);
  161.   writedigit(10);
  162.   writedigit(10);
  163.   writedigit(10);
  164.   }
  165.   else {
  166.   writedigit(score_4);
  167.   writedigit(score_3);
  168.   writedigit(score_1);
  169.   writedigit(score_2);
  170.   }
  171.   digitalWrite(s_latch, HIGH);
  172.   digitalWrite(s_latch, LOW);
  173. }
  174. void writedigit(uint8_t data) {//for internal use
  175.   for (uint16_t i = 0; i < 8; i++) {
  176.     digitalWrite(s_data, bitRead(data, i));
  177.     digitalWrite(s_clock, HIGH);
  178.     digitalWrite(s_clock, LOW);
  179.   }
  180. }
  181. uint8_t finddigit(uint16_t number) { //for internal use
  182.   switch (number) {
  183.     case 0:
  184.       return s_0;
  185.       break;
  186.     case 1:
  187.       return s_1;
  188.       break;
  189.     case 2:
  190.       return s_2;
  191.       break;
  192.     case 3:
  193.       return s_3;
  194.       break;
  195.     case 4:
  196.       return s_4;
  197.       break;
  198.     case 5:
  199.       return s_5;
  200.       break;
  201.     case 6:
  202.       return s_6;
  203.       break;
  204.     case 7:
  205.       return s_7;
  206.       break;
  207.     case 8:
  208.       return s_8;
  209.       break;
  210.     case 9:
  211.       return s_9;
  212.       break;
  213.     case 10:
  214.       return s_e;
  215.       break;
  216.     default:
  217.       return s_e;
  218.       break;
  219.   }
  220. }
  221. //<<------ end of screen functions ------->>
  222.  
  223. //<<------ several interrupts ------------>>
  224. void button_p1() { //interrupt for pin 2
  225.   p1deflect = true;
  226. }
  227. void button_p2() { //interrupt for pin 3
  228.   p2deflect = true;
  229. }
  230. //<<------ end of several interrupts ----->>
  231. //<<------ MISC ------>>
  232. void upd() {//RESET!
  233.   if (digitalRead(rstButton) == LOW) {
  234.     for (uint16_t i = 0; i < 12; i++) {
  235.       tlc.setPWM(i, 0);
  236.     }
  237.     p1score = 0;
  238.     p2score = 0;
  239.     runnin = false;
  240.     for (uint16_t i = 0; i < 12; i++) {
  241.         tlc.setPWM(i, 0);
  242.     }
  243.     tlc.write();
  244.     setscore(0,0);
  245.     currentlednumber = 1;
  246.     direc = false;
  247.   }
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement