Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.28 KB | None | 0 0
  1. #include <pic32mx.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #define DISPLAY_VDD PORTFbits.RF6
  5. #define DISPLAY_VBATT PORTFbits.RF5
  6. #define DISPLAY_COMMAND_DATA PORTFbits.RF4
  7. #define DISPLAY_RESET PORTGbits.RG9
  8. #define DISPLAY_VDD_PORT PORTF
  9. #define DISPLAY_VDD_MASK 0x40
  10. #define DISPLAY_VBATT_PORT PORTF // VBATT sätter på själva skärmen
  11. #define DISPLAY_VBATT_MASK 0x20
  12. #define DISPLAY_COMMAND_DATA_PORT PORTF
  13. #define DISPLAY_COMMAND_DATA_MASK 0x10
  14. #define DISPLAY_RESET_PORT PORTG
  15. #define DISPLAY_RESET_MASK 0x200
  16. void *stdout = (void *) 0;
  17. char textbuffer[4][16];
  18. // vilken page boll och spelare är i
  19. int pos1, pos2, posball, posballt, posballk, ballx, moveback, course,
  20. counter1, counter2, impage;
  21. // Player1 ska vara på x = 10 (pixeln längst till vänster)
  22. // Player2 ska vara pp x = 115
  23. static const uint8_t const font[] = {
  24. 0, 0, 0, 0, 0, 0, 0, 0,
  25. 0, 0, 0, 0, 0, 0, 0, 0,
  26. 0, 0, 0, 0, 0, 0, 0, 0,
  27. 0, 0, 0, 0, 0, 0, 0, 0,
  28. 0, 0, 0, 0, 0, 0, 0, 0,
  29. 0, 0, 0, 0, 0, 0, 0, 0,
  30. 0, 0, 0, 0, 0, 0, 0, 0,
  31. 0, 0, 0, 0, 0, 0, 0, 0,
  32. 0, 0, 0, 0, 0, 0, 0, 0,
  33. 0, 0, 0, 0, 0, 0, 0, 0,
  34. 0, 0, 0, 0, 0, 0, 0, 0,
  35. 0, 0, 0, 0, 0, 0, 0, 0,
  36. 0, 0, 0, 0, 0, 0, 0, 0,
  37. 0, 0, 0, 0, 0, 0, 0, 0,
  38. 0, 0, 0, 0, 0, 0, 0, 0,
  39. 0, 0, 0, 0, 0, 0, 0, 0,
  40. 0, 0, 0, 0, 0, 0, 0, 0,
  41. 0, 0, 0, 0, 0, 0, 0, 0,
  42. 0, 0, 0, 0, 0, 0, 0, 0,
  43. 0, 0, 0, 0, 0, 0, 0, 0,
  44. 0, 0, 0, 0, 0, 0, 0, 0,
  45. 0, 0, 0, 0, 0, 0, 0, 0,
  46. 0, 0, 0, 0, 0, 0, 0, 0,
  47. 0, 0, 0, 0, 0, 0, 0, 0,
  48. 0, 0, 0, 0, 0, 0, 0, 0,
  49. 0, 0, 0, 0, 0, 0, 0, 0,
  50. 0, 0, 0, 0, 0, 0, 0, 0,
  51. 0, 0, 0, 0, 0, 0, 0, 0,
  52. 0, 0, 0, 0, 0, 0, 0, 0,
  53. 0, 0, 0, 0, 0, 0, 0, 0,
  54.  
  55. 0, 0, 0, 0, 0, 0, 0, 0,
  56. 0, 0, 0, 0, 0, 0, 0, 0,
  57. 0, 0, 0, 0, 0, 0, 0, 0,
  58. 0, 0, 0, 94, 0, 0, 0, 0,
  59. 0, 0, 4, 3, 4, 3, 0, 0,
  60. 0, 36, 126, 36, 36, 126, 36, 0,
  61. 0, 36, 74, 255, 82, 36, 0, 0,
  62. 0, 70, 38, 16, 8, 100, 98, 0,
  63. 0, 52, 74, 74, 52, 32, 80, 0,
  64. 0, 0, 0, 4, 3, 0, 0, 0,
  65. 0, 0, 0, 126, 129, 0, 0, 0,
  66. 0, 0, 0, 129, 126, 0, 0, 0,
  67. 0, 42, 28, 62, 28, 42, 0, 0,
  68. 0, 8, 8, 62, 8, 8, 0, 0,
  69. 0, 0, 0, 128, 128, 0, 0, 0,
  70. 0, 8, 8, 8, 8, 8, 0, 0,
  71. 0, 0, 0, 0, 128, 0, 0, 0,
  72. 0, 64, 32, 16, 8, 4, 2, 0,
  73. 0, 62, 65, 73, 65, 62, 0, 0,
  74. 0, 0, 66, 127, 64, 0, 0, 0,
  75. 0, 0, 98, 81, 73, 70, 0, 0,
  76. 0, 0, 34, 73, 73, 54, 0, 0,
  77. 0, 0, 14, 8, 127, 8, 0, 0,
  78. 0, 0, 35, 69, 69, 57, 0, 0,
  79. 0, 0, 62, 73, 73, 50, 0, 0,
  80. 0, 0, 1, 97, 25, 7, 0, 0,
  81. 0, 0, 54, 73, 73, 54, 0, 0,
  82. 0, 0, 6, 9, 9, 126, 0, 0,
  83. 0, 0, 0, 102, 0, 0, 0, 0,
  84. 0, 0, 128, 102, 0, 0, 0, 0,
  85. 0, 0, 8, 20, 34, 65, 0, 0,
  86. 0, 0, 20, 20, 20, 20, 0, 0,
  87. 0, 0, 65, 34, 20, 8, 0, 0,
  88. 0, 2, 1, 81, 9, 6, 0, 0,
  89. 0, 28, 34, 89, 89, 82, 12, 0,
  90. 0, 0, 126, 9, 9, 126, 0, 0,
  91. 0, 0, 127, 73, 73, 54, 0, 0,
  92. 0, 0, 62, 65, 65, 34, 0, 0,
  93. 0, 0, 127, 65, 65, 62, 0, 0,
  94. 0, 0, 127, 73, 73, 65, 0, 0,
  95. 0, 0, 127, 9, 9, 1, 0, 0,
  96. 0, 0, 62, 65, 81, 50, 0, 0,
  97. 0, 0, 127, 8, 8, 127, 0, 0,
  98. 0, 0, 65, 127, 65, 0, 0, 0,
  99. 0, 0, 32, 64, 64, 63, 0, 0,
  100. 0, 0, 127, 8, 20, 99, 0, 0,
  101. 0, 0, 127, 64, 64, 64, 0, 0,
  102. 0, 127, 2, 4, 2, 127, 0, 0,
  103. 0, 127, 6, 8, 48, 127, 0, 0,
  104. 0, 0, 62, 65, 65, 62, 0, 0,
  105. 0, 0, 127, 9, 9, 6, 0, 0,
  106. 0, 0, 62, 65, 97, 126, 64, 0,
  107. 0, 0, 127, 9, 9, 118, 0, 0,
  108. 0, 0, 38, 73, 73, 50, 0, 0,
  109. 0, 1, 1, 127, 1, 1, 0, 0,
  110. 0, 0, 63, 64, 64, 63, 0, 0,
  111. 0, 31, 32, 64, 32, 31, 0, 0,
  112. 0, 63, 64, 48, 64, 63, 0, 0,
  113. 0, 0, 119, 8, 8, 119, 0, 0,
  114. 0, 3, 4, 120, 4, 3, 0, 0,
  115. 0, 0, 113, 73, 73, 71, 0, 0,
  116.  
  117. 0, 0, 127, 65, 65, 0, 0, 0,
  118. 0, 2, 4, 8, 16, 32, 64, 0,
  119. 0, 0, 0, 65, 65, 127, 0, 0,
  120. 0, 4, 2, 1, 2, 4, 0, 0,
  121. 0, 64, 64, 64, 64, 64, 64, 0,
  122. 0, 0, 1, 2, 4, 0, 0, 0,
  123. 0, 0, 48, 72, 40, 120, 0, 0,
  124. 0, 0, 127, 72, 72, 48, 0, 0,
  125. 0, 0, 48, 72, 72, 0, 0, 0,
  126. 0, 0, 48, 72, 72, 127, 0, 0,
  127. 0, 0, 48, 88, 88, 16, 0, 0,
  128. 0, 0, 126, 9, 1, 2, 0, 0,
  129. 0, 0, 80, 152, 152, 112, 0, 0,
  130. 0, 0, 127, 8, 8, 112, 0, 0,
  131. 0, 0, 0, 122, 0, 0, 0, 0,
  132. 0, 0, 64, 128, 128, 122, 0, 0,
  133. 0, 0, 127, 16, 40, 72, 0, 0,
  134. 0, 0, 0, 127, 0, 0, 0, 0,
  135. 0, 120, 8, 16, 8, 112, 0, 0,
  136. 0, 0, 120, 8, 8, 112, 0, 0,
  137. 0, 0, 48, 72, 72, 48, 0, 0,
  138. 0, 0, 248, 40, 40, 16, 0, 0,
  139. 0, 0, 16, 40, 40, 248, 0, 0,
  140. 0, 0, 112, 8, 8, 16, 0, 0,
  141. 0, 0, 72, 84, 84, 36, 0, 0,
  142. 0, 0, 8, 60, 72, 32, 0, 0,
  143. 0, 0, 56, 64, 32, 120, 0, 0,
  144. 0, 0, 56, 64, 56, 0, 0, 0,
  145. 0, 56, 64, 32, 64, 56, 0, 0,
  146. 0, 0, 72, 48, 48, 72, 0, 0,
  147. 0, 0, 24, 160, 160, 120, 0, 0,
  148. 0, 0, 100, 84, 84, 76, 0, 0,
  149. 0, 0, 8, 28, 34, 65, 0, 0,
  150. 0, 0, 0, 126, 0, 0, 0, 0,
  151. 0, 0, 65, 34, 28, 8, 0, 0,
  152. 0, 0, 4, 2, 4, 2, 0, 0,
  153. 0, 120, 68, 66, 68, 120, 0, 0,
  154. };
  155. uint8_t Screen [] =
  156. {
  157. 0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  158. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  159. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  160. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  161. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,
  162. // Page 0 // Varje sådan rad 28 element bred, varje page 128 bred (element)
  163. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  164. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  165. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  166. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  167. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // Page
  168. 1
  169. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  170. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  171. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  172. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  173. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // Page
  174. 2
  175. 126,18,18,12,0,0,4,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  176. ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  177.  
  178. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  179. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  180. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,18,18,12,0,0,68,98,82,76
  181. // Page 3
  182. };
  183. void delay(int cyc) {
  184. int i;
  185. for(i = cyc; i > 0; i--);
  186. }
  187. uint8_t spi_send_recv(uint8_t data) { // vad gör/hur fungerar spi ???
  188. while(!(SPI2STAT & 0x08));
  189. SPI2BUF = data;
  190. while(!(SPI2STAT & 0x01));
  191. return SPI2BUF;
  192. }
  193. void display_init() {
  194. DISPLAY_COMMAND_DATA_PORT &= ~DISPLAY_COMMAND_DATA_MASK;
  195. // and med inversen av 0x10
  196. delay(10);
  197. DISPLAY_VDD_PORT &= ~DISPLAY_VDD_MASK; // and med inversen
  198. av 0x40
  199. delay(1000000);
  200. spi_send_recv(0xAE); // set display off
  201. DISPLAY_RESET_PORT &= ~DISPLAY_RESET_MASK;
  202. delay(10);
  203. DISPLAY_RESET_PORT |= DISPLAY_RESET_MASK;
  204. delay(10);
  205. spi_send_recv(0x8D); // Charge Pump Setting
  206. spi_send_recv(0x14); // Enable charge pump
  207. spi_send_recv(0xD9); // Set Pre-charge Period
  208. spi_send_recv(0xF1); // bit 0-3 är period 1 och 4-7 är period 2. Kan max vara 15 klockcyklar, 0 är invalid.
  209. DISPLAY_VBATT_PORT &= ~DISPLAY_VBATT_MASK;
  210. delay(10000000);
  211. spi_send_recv(0xA1); // Set Segment Re-map: A1h, X[0]=1b: column address 127 is mapped to SEG0
  212. spi_send_recv(0xC8); // Set COM Output Scan Direction
  213. spi_send_recv(0xDA); // Set COM Pins Hardware configuration
  214. spi_send_recv(0x20); // Set memory adressing mode
  215. spi_send_recv(0xAF); // set display on.
  216. }
  217. void display_string(int line, char *s) {
  218. int i;
  219. if(line < 0 || line >= 4)
  220. return;
  221. if(!s)
  222. return;
  223. for(i = 0; i < 16; i++)
  224. if(*s) {
  225.  
  226. textbuffer[line][i] = *s;
  227. s++;
  228. } else
  229. textbuffer[line][i] = ' ';
  230. }
  231. void display_update() {
  232. int i, j, k, a, b, d;
  233. int c;
  234. for(i = 0; i < 4; i++) {
  235. DISPLAY_COMMAND_DATA_PORT &=
  236. ~DISPLAY_COMMAND_DATA_MASK;
  237. spi_send_recv(0x22);
  238. spi_send_recv(i);
  239. spi_send_recv(0x0);
  240. spi_send_recv(0x10);
  241. DISPLAY_COMMAND_DATA_PORT |=
  242. DISPLAY_COMMAND_DATA_MASK;
  243. for(j = 0; j < 16; j++) {
  244. c = textbuffer[i][j];
  245. if(c & 0x80)
  246. continue;
  247. for(k = 0; k < 8; k++)
  248. spi_send_recv(font[c*8 + k]);
  249. }
  250. }
  251. // displayupdate tar slut
  252. }
  253. void display_Screen(int x, const uint8_t *data){
  254. int i, j;
  255. for(i = 0; i < 4; i++) {
  256. DISPLAY_COMMAND_DATA_PORT &=
  257. ~DISPLAY_COMMAND_DATA_MASK;
  258. spi_send_recv(0x22); // Setup page start and end address
  259. spi_send_recv(i); // fyra olika pages
  260. spi_send_recv(x & 0xF); // and med de fyra sista bitarna? 0000? (Lower column limit).
  261. spi_send_recv(0x10 | ((x >> 4) & 0xF)); // 0001
  262. 0000 OR 0110 (om x = 128) = 0001 0110 = 0x16 (Upper column limit)
  263. DISPLAY_COMMAND_DATA_PORT |=
  264. DISPLAY_COMMAND_DATA_MASK;
  265. for(j = 0; j < 128; j++)
  266. // avgör hur stor del(av vektorn) som får synas på skärmen
  267. spi_send_recv(data[i*128 + j]);
  268. // inversen av hundens vektor[1, 2, 3, ..., j] [32 + 1,
  269. 2, 3,..., j] [64 + 1, 2, 3, ..., j]
  270. }
  271. }
  272.  
  273. void move_ballf()
  274. {
  275. int i;
  276. // Flyttar bollen fram en pixel
  277. for (i = 1; i<4; i++) // allt kommer att flyttas ett steg åt höger. Ballx är den pixeln längs vänster
  278. {
  279. Screen[ballx + i + 128*(posball-1)] = Screen[ballx + 1 +
  280. 128*(posball-1)];
  281. Screen[ballx + i + 128*(posball)] = Screen[ballx + 1 +
  282. 128*(posball)];
  283. Screen[ballx + i + 128*(posball+1)] = Screen[ballx + 1 +
  284. 128*(posball+1)];
  285. if (posball != 0)
  286. {
  287. Screen[ballx + i + 128*(posball-1)] =
  288. Screen[ballx + 128*(posball-1)];// Kopierar pagen ovanför
  289. }
  290. if (posball != 3)
  291. {
  292. Screen[ballx + i + 128*(posball+1)] =
  293. Screen[ballx + 128*(posball+1)];// Kopierar pagen nedanför
  294. }
  295. }
  296. Screen[ballx + 128*(posball-1)] = 0;
  297. Screen[ballx + 128*(posball+1)] = 0;
  298. Screen[ballx + 128*posball] = 0;
  299. // tar bort fula pixlar vid pagebyte. Tar bort och sedan uppdaterar.
  300. ballx++;
  301. // Anger nya x-värdet
  302. delay(100);
  303. }
  304. void move_ballb()
  305. {
  306. // behöver endast flytta en vektorenhet åt vänster. De andra behåller sitt värde. Den längst åt höger blir den längst till vänster.
  307. Screen[ballx - 1 + 128*(posball)] = Screen[ballx +
  308. 128*(posball)]; // Kopierar pagen
  309. Screen[ballx - 1 + 128*(posball+1)] = Screen[ballx +
  310. 128*(posball+1)];// Kopierar pagen nedanför
  311. Screen[ballx - 1 + 128*(posball-1)] = Screen[ballx +
  312. 128*(posball-1)];// Kopierar pagen ovanför
  313. Screen[ballx+2 + 128*posball] = 0;
  314. // Tar bort vektorsiffran längst till höger
  315. Screen[ballx+2 + 128*(posball-1)] = 0;
  316. Screen[ballx+2 + 128*(posball+1)] = 0;
  317. // tar bort fula pixlar vid pagebyte
  318. ballx--;
  319. // Anger nya x-värdet
  320. delay(100);
  321. }
  322. void move_ballu()
  323.  
  324. {
  325. int i;
  326. // Kollar om bollen ligger längst upp i pagen, värdena är så att längst till höger om talet är längst upp.
  327. int left3 = 0; // Om den är precis vid page-kanten
  328. int left2 = 0; // Om en rad redan passerat page-kanten
  329. int left1 = 0; // Om två rader redan passerat page-kanten
  330. for (i = 0; i<128; i++)
  331. {
  332. if (Screen[i + posball*128] == 7)
  333. // Om bollen ligger längst upp i sin page, 7 = 0000 0111
  334. left3 = 1;
  335. }
  336. for (i = 0; i<128; i++)
  337. {
  338. if (Screen[i + posball*128] == 3)
  339. // Om bollen ligger längst upp i sin page eller mellan
  340. left2 = 1;
  341. }
  342. for (i = 0; i<128; i++)
  343. {
  344. if (Screen[i + posball*128] == 1)
  345. // Om bollen ligger längst upp i sin page eller mellan
  346. left1 = 1;
  347. }
  348. // Flyttar bollen upp en pixel
  349. if ((left1 + left2 + left3) == 0) // Om bollen inte ligger nära kanten
  350. {
  351. Screen[ballx + 128*posball] = Screen[(ballx +
  352. 128*posball)]/2; // Dividerar alla (aktuella) vektorsplatser med 2. VL = nuvarande
  353. Screen[ballx + 1 + 128*posball] = Screen[(ballx + 1 +
  354. 128*posball)]/2; // divison då till höger om det binära talet är högst upp
  355. Screen[ballx + 2 + 128*posball] = Screen[(ballx + 2 +
  356. 128*posball)]/2;
  357. for(i = 0; i<3; i++) //Tar bort splitts?
  358. {
  359. if (Screen[ballx + 128*posball]
  360. == 96)
  361. Screen[ballx + i + 128*posball]
  362. = 112;
  363. }
  364. }
  365. if (left3 == 1) // Om den preci kommit till kanten
  366. {
  367. for (i = 0; i<3; i++) //Tar bort en rad på nedre pagen
  368. {
  369. Screen[ballx + i + posball*128] = 3;
  370. Screen[ballx + i + (posball-1)*128] = 128;
  371. // Startar ny rad på övre pagen
  372. }
  373. }
  374. if (left2 == 1) // Om den preci kommit till kanten
  375. {
  376.  
  377. for (i = 0; i<3; i++)
  378. {
  379. Screen[ballx + i + posball*128] = 1;
  380. Screen[ballx + i + (posball-1)*128] = 192;
  381. // Startar ny rad på övre pagen
  382. }
  383. }
  384. if (left1 == 1) // Om den preci kommit till kanten
  385. {
  386. for (i = 0; i<3; i++)
  387. {
  388. Screen[ballx + i + posball*128] = 0;
  389. Screen[ballx + i + (posball-1)*128] = 224;
  390. // Startar ny rad på övre pagen
  391. }
  392. delay(1000);
  393. posball--;
  394. }
  395. }
  396. void move_balld()
  397. {
  398. // Kollar om bollen ligger längst upp i pagen
  399. int left3 = 0; // Om den är precis vid page-kanten
  400. int left2 = 0; // Om en rad redan passerat page-kanten
  401. int left1 = 0; // Om två rader redan passerat page-kanten
  402. int i;
  403. for (i = 0; i<114; i++)
  404. {
  405. if (Screen[i + posball*128] == 224)
  406. // Om bollen ligger löngst ned i sin page, 224 = 111 000 00
  407. left3 = 1;
  408. }
  409. for (i = 0; i<114; i++)
  410. {
  411. if (Screen[i + posball*128] == 192)
  412. // Om bollen ligger löngst ned i sin page eller mellan
  413. left2 = 1;
  414. }
  415. for (i = 0; i<114; i++)
  416. {
  417. if (Screen[i + posball*128] == 128)
  418. // Om bollen ligger löngst ned i sin page eller mellan
  419. left1 = 1;
  420. }
  421. // Flyttar bollen upp en pixel
  422. if ((left1 + left2 + left3) == 0) // Om bollen inte ligger nära kanten
  423. {
  424. Screen[ballx + 128*posball] = Screen[(ballx +
  425. 128*posball)]*2; // Multiplicerar alla (aktuella) vektorsplatser med 2. VL = nuvarande
  426. Screen[ballx + 1 + 128*posball] = Screen[(ballx + 1 +
  427. 128*posball)]*2;
  428. Screen[ballx + 2 + 128*posball] = Screen[(ballx + 2 +
  429. 128*posball)]*2;
  430.  
  431. Screen[ballx + 1 + 128*(posball-1)] = 0;
  432. Screen[ballx + 2 + 128*(posball-1)] = 0;
  433. }
  434. if (left3 == 1) // Om den preci kommit till kanten
  435. {
  436. for (i = 0; i<3; i++) //Tar bort en rad på nedre pagen
  437. {
  438. Screen[ballx + i + posball*128] = 192;
  439. Screen[ballx + i + (posball+1)*128] = 1;
  440. // Startar ny rad på nedre pagen
  441. }
  442. }
  443. if (left2 == 1) // Om den preci kommit till kanten
  444. {
  445. for (i = 0; i<3; i++)
  446. {
  447. Screen[ballx + i + posball*128] = 128;
  448. Screen[ballx + i + (posball+1)*128] = 3;
  449. // Startar ny rad på övre pagen
  450. }
  451. }
  452. if (left1 == 1) // Om den preci kommit till kanten
  453. {
  454. for (i = 0; i<3; i++)
  455. {
  456. Screen[ballx + i + posball*128] = 0;
  457. Screen[ballx + i + (posball+1)*128] = 7;
  458. // Startar ny rad på övre pagen
  459. }
  460. delay(1000);
  461. if( 0 <= posball < 3)
  462. {
  463. posball++;
  464. }
  465. }
  466. }
  467. void course_generator() // Ger en random course-siffra som passar vilken page den studsar på
  468. {
  469. // För studs på vänstra sidan
  470. if( (ballx == 13) && (posball == pos1) && (posball == 0))
  471. {
  472. course = (rand() % 6) + 12;
  473. // course avgör hur många pixlar framåt/bakåt bollen åker innan den åker upp/ned.
  474. }
  475. else if( (ballx == 13) && (posball == pos1) && (posball == 1))
  476. {
  477. course = (rand() % 6) + 16;
  478. }
  479. else if( (ballx == 13) && (posball == pos1) && (posball == 2))
  480. {
  481. course = (rand() % 6) + 12;
  482. }
  483.  
  484. // För studs på högra sidan
  485. else if( (ballx == 112) && (posball == pos2) && (posball == 0))
  486. {
  487. course = (rand() % 6) + 12;
  488. }
  489. else if( (ballx == 112) && (posball == pos2) && (posball == 1))
  490. {
  491. course = (rand() % 6) + 16;
  492. }
  493. else if( (ballx == 112) && (posball == pos2) && (posball == 2))
  494. {
  495. course = (rand() % 6) + 12;
  496. }
  497. }
  498. void move_ball() {
  499. if( (ballx == 12)) // bollen är bakom player1
  500. {
  501. for(;;)
  502. {
  503. moveback = 2;
  504. display_update();
  505. display_string(0, " GAME
  506. OVER");
  507. display_string(2, " Player 2 wins");
  508. }
  509. }
  510. if( (ballx == 113))
  511. {
  512. for(;;){
  513. moveback = 2;
  514. display_update();
  515. display_string(0, " GAME
  516. OVER");
  517. display_string(2, " Player 1 wins");
  518. }
  519. }
  520. if( (ballx == 13) && (posball == pos1))
  521. {
  522. course_generator();
  523. moveback = 0;
  524. impage = pos1;
  525. }
  526. if((ballx == 112) && (posball == pos2))
  527. {
  528. course_generator();
  529. moveback = 1;
  530. impage = pos2;
  531. }
  532. delay(1000);
  533. if (moveback == 0)
  534. {
  535. move_ballf();
  536. counter1++;
  537. delay(100);
  538. if (counter1 == course)
  539. {
  540.  
  541. if ((impage == 0) | (impage == 1))
  542. {
  543. move_balld();
  544. counter1 = 0;
  545. }
  546. else if ((impage == 2))
  547. {
  548. move_ballu();
  549. counter1 = 0;
  550. }
  551. }
  552. }
  553. if (moveback == 1) // om impact sker vid antingen page 2 eller 3 ska den åka upp
  554. {
  555. move_ballb();
  556. counter2++;
  557. delay(100);
  558. if (counter2 == course)
  559. {
  560. if ((impage == 0) | (impage == 1))
  561. {
  562. move_balld();
  563. // posball uppdateras här?
  564. counter2 = 0;
  565. }
  566. else if ((impage == 2))
  567. {
  568. move_ballu();
  569. counter2 = 0;
  570. }
  571. }
  572. }
  573. }
  574. void move_player1u()
  575. {
  576. if(pos1 != 0)
  577. {
  578. int i;
  579. for(i=0; i<3; i++)
  580. // 3 bred
  581. {
  582. Screen[pos1*128 + 10 + i] = 0;
  583. }
  584. for(i=0; i<3; i++)
  585. {
  586. Screen[(pos1-1)*128 + 10 + i] = 255;
  587. }
  588. pos1--;
  589. }
  590. // OM pos 1 == 0 ska inget hända
  591. }
  592. void move_player1d()
  593. {
  594. if(pos1 != 2)
  595. {
  596.  
  597. int i;
  598. for(i=0; i<3; i++)
  599. {
  600. Screen[pos1*128 + 10 + i] = 0;
  601. }
  602. for(i=0; i<3; i++)
  603. {
  604. Screen[(pos1+1)*128 + 10 + i] = 255;
  605. }
  606. pos1++;
  607. }
  608. }
  609. void move_player2u()
  610. {
  611. if(pos2 != 0)
  612. {
  613. int i;
  614. for(i=0; i<3; i++)
  615. {
  616. Screen[pos2*128 + 115 + i] = 0;
  617. }
  618. for(i=0; i<3; i++)
  619. {
  620. Screen[(pos2-1)*128 + 115 + i] = 255;
  621. }
  622. pos2--;
  623. }
  624. }
  625. void move_player2d()
  626. {
  627. if(pos2 != 2)
  628. {
  629. int i;
  630. for(i=0; i<3; i++)
  631. {
  632. Screen[pos2*128 + 115 + i] = 0;
  633. }
  634. for(i=0; i<3; i++)
  635. {
  636. Screen[(pos2+1)*128 + 115 + i] = 255;
  637. }
  638. pos2++;
  639. }
  640. }
  641. int main(void)
  642. {
  643. /* Set up peripheral bus clock */
  644. OSCCON &= ~0x180000;
  645. OSCCON |= 0x080000;
  646. /* Set up output pins */
  647. AD1PCFG = 0xFFFF;
  648. ODCE = 0x0;
  649. TRISECLR = 0xFF;
  650. PORTE = 0x0;
  651. /* Output pins for display signals */
  652. PORTF = 0xFFFF;
  653. PORTG = (1 << 9);
  654. ODCF = 0x0;
  655.  
  656. ODCG = 0x0;
  657. TRISFCLR = 0x70;
  658. TRISGCLR = 0x200;
  659. /* Set up input pins */
  660. TRISDSET = (1 << 8);
  661. TRISFSET = (1 << 1);
  662. /* Set up SPI as master */
  663. SPI2CON = 0;
  664. SPI2BRG = 4;
  665. /* Clear SPIROV*/
  666. SPI2STATCLR &= ~0x40;
  667. /* Set CKP = 1, MSTEN = 1; */
  668. SPI2CON |= 0x60;
  669. /* Turn on SPI */
  670. SPI2CONSET = 0x8000;
  671. display_init();
  672. pos1 = 0;
  673. pos2 = 0;
  674. posball = 0;
  675. ballx = 70;
  676. moveback = 0;
  677. course = 8;
  678. counter1 = 0;
  679. counter2 = 0;
  680. impage = 0;
  681. int h;
  682. for(h = 0; h < 3; h++)
  683. Screen[posball*128 + ballx + h] = 224;
  684. //course_generator();
  685. for(;;){
  686. {
  687. display_Screen(0,Screen);
  688. if (getbtn() == 0x08) // om endast btn 4 är tryckt(nedåt)
  689. {
  690. move_player1u();
  691. }
  692. if (getbtn() == 0x04) // om endast btn 3 är tryckt(uppåt)
  693. {
  694. move_player1d();
  695. }
  696. if (getbtn() == 0x2)
  697. {
  698. move_player2u();
  699. }
  700. if(getbtn1() == 0x01)
  701. {
  702. move_player2d();
  703. }
  704.  
  705. move_ball();
  706. // move_balld();
  707. delay(500000);
  708. //delay(1000000);
  709. }
  710. } ;
  711. return 0;
  712. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement