Advertisement
Guest User

Untitled

a guest
May 24th, 2015
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.06 KB | None | 0 0
  1. #include <basedef.h>
  2. #include <Board.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #include <fixedsys.h>
  7. #include <lcd_GE8.h>
  8. #include <lib_at91sam7_pio.h>
  9. #include <AT91SAM7X256.H>
  10. #include <lib_at91sam7_pwmc.h>
  11.  
  12. #define TRUE 1
  13. #define FALSE 0
  14.  
  15. #define SIZE 3
  16. #define SIZE2 (SIZE*SIZE)
  17.  
  18. #define SCREEN_SIZE 132
  19. #define LINE_STEP (SCREEN_SIZE / 9)
  20.  
  21. #define DIGIT_X_OFFSET 2
  22. #define DIGIT_Y_OFFSET 0
  23.  
  24. #define BACKGROUND_COLOR LCD_COLOR_WHITE
  25. #define ACTIVE_BACKGROUND_COLOR LCD_COLOR_RED
  26. #define LINE_COLOR LCD_COLOR_BLACK
  27. #define DIGIT_COLOR LCD_COLOR_BLACK
  28.  
  29. #define BIT_JOYSTICK_LEFT AT91C_PIO_PA7
  30. #define BIT_JOYSTICK_TOP AT91C_PIO_PA9
  31. #define BIT_JOYSTICK_DOWN AT91C_PIO_PB8
  32. #define BIT_JOYSTICK_RIGHT AT91C_PIO_PA14
  33. #define BIT_JOYSTICK_CENTER AT91C_PIO_PA15
  34.  
  35. #define BIT_BUTTON1 AT91C_PIO_PB25
  36. #define BIT_BUTTON2 AT91C_PIO_PB26
  37.  
  38. AT91PS_PIO p_pPioA;
  39. AT91PS_PIO p_pPioB;
  40.  
  41. enum { JOYSTICK_NONE, JOYSTICK_CENTER, JOYSTICK_LEFT, JOYSTICK_RIGHT, JOYSTICK_UP, JOYSTICK_DOWN } gJoystickPosition = JOYSTICK_NONE;
  42. int gButton1Pressed = FALSE;
  43. int gButton2Pressed = FALSE;
  44.  
  45. int gSelectedCellX = SIZE2 / 2;
  46. int gSelectedCellY = SIZE2 / 2;
  47. int gIsDirty = TRUE;
  48. int gGrid[SIZE2][SIZE2];
  49. int gGridToDisplay[SIZE2];
  50.  
  51. void Delay (unsigned long a) {while (--a!=0);}
  52.  
  53. void InitJoystick( )
  54. {
  55. AT91PS_PMC p_pPMC = AT91C_BASE_PMC;
  56. p_pPioA = AT91C_BASE_PIOA;
  57.  
  58. p_pPMC->PMC_PCER = 1 << AT91C_ID_PIOA;
  59.  
  60. p_pPioA->PIO_ODR |= BIT_JOYSTICK_LEFT;
  61. p_pPioA->PIO_PER |= BIT_JOYSTICK_LEFT;
  62.  
  63. p_pPioA->PIO_ODR |= BIT_JOYSTICK_RIGHT;
  64. p_pPioA->PIO_PER |= BIT_JOYSTICK_RIGHT;
  65.  
  66. p_pPioA->PIO_ODR |= BIT_JOYSTICK_TOP;
  67. p_pPioA->PIO_PER |= BIT_JOYSTICK_TOP;
  68.  
  69. p_pPioA->PIO_ODR |= BIT_JOYSTICK_DOWN;
  70. p_pPioA->PIO_PER |= BIT_JOYSTICK_DOWN;
  71. }
  72.  
  73. void InitButtons( )
  74. {
  75. p_pPioB = AT91C_BASE_PIOB;
  76. p_pPioB->PIO_ODR |= BIT_BUTTON1;
  77. p_pPioB->PIO_PER |= BIT_BUTTON1;
  78.  
  79. p_pPioB->PIO_ODR |= BIT_BUTTON2;
  80. p_pPioB->PIO_PER |= BIT_BUTTON2;
  81. }
  82.  
  83. void InitLines( )
  84. {
  85. int i, j = 0;
  86. for (i = 0; i < SCREEN_SIZE; i += LINE_STEP)
  87. {
  88. if (j % 3 == 0)
  89. {
  90. ++i;
  91. }
  92.  
  93. gGridToDisplay[j] = i + 1;
  94. ++j;
  95. }
  96. }
  97.  
  98. void DrawLines( )
  99. {
  100. int i, j = 0;
  101. for (i = 0; i < SCREEN_SIZE; i += LINE_STEP)
  102. {
  103. LCDSetLine(0, i, SCREEN_SIZE - 1, i, LINE_COLOR);
  104. LCDSetLine(i, 0, i, SCREEN_SIZE - 1, LINE_COLOR);
  105. if (j % 3 == 0)
  106. {
  107. ++i;
  108. LCDSetLine(0, i, SCREEN_SIZE - 1, i, LINE_COLOR);
  109. LCDSetLine(i, 0, i, SCREEN_SIZE - 1, LINE_COLOR);
  110. }
  111.  
  112. ++j;
  113. }
  114. }
  115.  
  116. void DrawDigit( int x, int y, int digit )
  117. {
  118. Color_t backgroundColor;
  119.  
  120. if( x == gSelectedCellX && y == gSelectedCellY )
  121. {
  122. backgroundColor = ACTIVE_BACKGROUND_COLOR;
  123. }
  124. else
  125. {
  126. backgroundColor = BACKGROUND_COLOR;
  127. }
  128.  
  129. LCD_WriteChar(digit + '0', FONT_DESCRIPTOR, gGridToDisplay[x] + DIGIT_X_OFFSET, gGridToDisplay[y] + DIGIT_Y_OFFSET, DIGIT_COLOR, backgroundColor);
  130. }
  131.  
  132. void DrawGrid( )
  133. {
  134. int i, j;
  135. for (i = 0; i < SIZE2; ++i )
  136. {
  137. for (j = 0; j < SIZE2; ++j )
  138. {
  139. DrawDigit( i, j, gGrid[i][j] );
  140. }
  141. }
  142. }
  143.  
  144.  
  145.  
  146. void Init( )
  147. {
  148. int i, j;
  149.  
  150. AT91F_LowLevel_Init( );
  151. InitJoystick( );
  152. InitButtons( );
  153.  
  154. InitLCD( );
  155. LCD_ClearScreen( BACKGROUND_COLOR );
  156.  
  157. AT91F_Finalize_Init( );
  158.  
  159. InitLines( );
  160.  
  161. for (i = 0; i < 9; ++i )
  162. {
  163. for (j = 0; j < 9; ++j )
  164. {
  165. gGrid[i][j] = i + 1;
  166. }
  167. }
  168.  
  169. DrawGrid( );
  170. DrawLines( );
  171. }
  172.  
  173. void CollectInputs( )
  174. {
  175. gJoystickPosition = JOYSTICK_NONE;
  176. gButton1Pressed = FALSE;
  177. gButton2Pressed = FALSE;
  178.  
  179.  
  180. if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_LEFT))
  181. {
  182. gJoystickPosition = JOYSTICK_LEFT;
  183. }
  184. else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_RIGHT))
  185. {
  186. gJoystickPosition = JOYSTICK_RIGHT;
  187. }
  188. else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_DOWN))
  189. {
  190. gJoystickPosition = JOYSTICK_DOWN;
  191. }
  192. else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_TOP))
  193. {
  194. gJoystickPosition = JOYSTICK_UP;
  195. }
  196. else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_CENTER))
  197. {
  198. gJoystickPosition = JOYSTICK_CENTER;
  199. }
  200. else if(!((p_pPioB->PIO_PDSR) & BIT_BUTTON1))
  201. {
  202. gButton1Pressed = TRUE;
  203. }
  204. else if(!((p_pPioB->PIO_PDSR) & BIT_BUTTON2))
  205. {
  206. gButton2Pressed = TRUE;
  207. }
  208. }
  209.  
  210. void MoveCursor( )
  211. {
  212. switch( gJoystickPosition )
  213. {
  214. case JOYSTICK_LEFT:
  215. gSelectedCellX = gSelectedCellX == 0 ? SIZE2 - 1 : gSelectedCellX - 1;
  216. gIsDirty = TRUE;
  217. break;
  218. case JOYSTICK_RIGHT:
  219. gSelectedCellX = gSelectedCellX == SIZE2 - 1 ? 0 : gSelectedCellX + 1;
  220. gIsDirty = TRUE;
  221. break;
  222. case JOYSTICK_UP:
  223. gSelectedCellY = gSelectedCellY == 0 ? SIZE2 - 1 : gSelectedCellY - 1;
  224. gIsDirty = TRUE;
  225. break;
  226. case JOYSTICK_DOWN:
  227. gSelectedCellY = gSelectedCellY == SIZE2 - 1 ? 0 : gSelectedCellY + 1;
  228. gIsDirty = TRUE;
  229. break;
  230. }
  231. }
  232.  
  233. void UpdateCell( )
  234. {
  235. int *digit = &(gGrid[gSelectedCellY][gSelectedCellX]);
  236.  
  237. if( gButton1Pressed == TRUE )
  238. {
  239. *digit = *digit == 1 ? 1 : *digit - 1;
  240. gIsDirty = TRUE;
  241. }
  242. else if( gButton2Pressed == TRUE )
  243. {
  244. *digit = *digit == SIZE2 - 1 ? SIZE2 - 1 : *digit + 1;
  245. gIsDirty = TRUE;
  246. }
  247. }
  248.  
  249. void DoTheJob( )
  250. {
  251. MoveCursor( );
  252. UpdateCell( );
  253. if( gIsDirty )
  254. {
  255. DrawGrid( );
  256. // DrawLines( );
  257. gIsDirty = FALSE;
  258. }
  259. }
  260.  
  261. void WriteOutput( )
  262. {
  263. }
  264.  
  265.  
  266. int main()
  267. {
  268. Init( );
  269.  
  270. while ( true )
  271. {
  272. CollectInputs( );
  273. DoTheJob( );
  274. WriteOutput( );
  275. }
  276.  
  277. /* the answer to life the universe and everything */
  278. return 42;
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement