Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <basedef.h>
- #include <Board.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fixedsys.h>
- #include <lcd_GE8.h>
- #include <lib_at91sam7_pio.h>
- #include <AT91SAM7X256.H>
- #include <lib_at91sam7_pwmc.h>
- #define TRUE 1
- #define FALSE 0
- #define SIZE 3
- #define SIZE2 (SIZE*SIZE)
- #define SCREEN_SIZE 132
- #define LINE_STEP (SCREEN_SIZE / 9)
- #define DIGIT_X_OFFSET 2
- #define DIGIT_Y_OFFSET 0
- #define BACKGROUND_COLOR LCD_COLOR_WHITE
- #define ACTIVE_BACKGROUND_COLOR LCD_COLOR_RED
- #define LINE_COLOR LCD_COLOR_BLACK
- #define DIGIT_COLOR LCD_COLOR_BLACK
- #define BIT_JOYSTICK_LEFT AT91C_PIO_PA7
- #define BIT_JOYSTICK_TOP AT91C_PIO_PA9
- #define BIT_JOYSTICK_DOWN AT91C_PIO_PB8
- #define BIT_JOYSTICK_RIGHT AT91C_PIO_PA14
- #define BIT_JOYSTICK_CENTER AT91C_PIO_PA15
- #define BIT_BUTTON1 AT91C_PIO_PB25
- #define BIT_BUTTON2 AT91C_PIO_PB26
- AT91PS_PIO p_pPioA;
- AT91PS_PIO p_pPioB;
- enum { JOYSTICK_NONE, JOYSTICK_CENTER, JOYSTICK_LEFT, JOYSTICK_RIGHT, JOYSTICK_UP, JOYSTICK_DOWN } gJoystickPosition = JOYSTICK_NONE;
- int gButton1Pressed = FALSE;
- int gButton2Pressed = FALSE;
- int gSelectedCellX = SIZE2 / 2;
- int gSelectedCellY = SIZE2 / 2;
- int gIsDirty = TRUE;
- int gGrid[SIZE2][SIZE2];
- int gGridToDisplay[SIZE2];
- void Delay (unsigned long a) {while (--a!=0);}
- void InitJoystick( )
- {
- AT91PS_PMC p_pPMC = AT91C_BASE_PMC;
- p_pPioA = AT91C_BASE_PIOA;
- p_pPMC->PMC_PCER = 1 << AT91C_ID_PIOA;
- p_pPioA->PIO_ODR |= BIT_JOYSTICK_LEFT;
- p_pPioA->PIO_PER |= BIT_JOYSTICK_LEFT;
- p_pPioA->PIO_ODR |= BIT_JOYSTICK_RIGHT;
- p_pPioA->PIO_PER |= BIT_JOYSTICK_RIGHT;
- p_pPioA->PIO_ODR |= BIT_JOYSTICK_TOP;
- p_pPioA->PIO_PER |= BIT_JOYSTICK_TOP;
- p_pPioA->PIO_ODR |= BIT_JOYSTICK_DOWN;
- p_pPioA->PIO_PER |= BIT_JOYSTICK_DOWN;
- }
- void InitButtons( )
- {
- p_pPioB = AT91C_BASE_PIOB;
- p_pPioB->PIO_ODR |= BIT_BUTTON1;
- p_pPioB->PIO_PER |= BIT_BUTTON1;
- p_pPioB->PIO_ODR |= BIT_BUTTON2;
- p_pPioB->PIO_PER |= BIT_BUTTON2;
- }
- void InitLines( )
- {
- int i, j = 0;
- for (i = 0; i < SCREEN_SIZE; i += LINE_STEP)
- {
- if (j % 3 == 0)
- {
- ++i;
- }
- gGridToDisplay[j] = i + 1;
- ++j;
- }
- }
- void DrawLines( )
- {
- int i, j = 0;
- for (i = 0; i < SCREEN_SIZE; i += LINE_STEP)
- {
- LCDSetLine(0, i, SCREEN_SIZE - 1, i, LINE_COLOR);
- LCDSetLine(i, 0, i, SCREEN_SIZE - 1, LINE_COLOR);
- if (j % 3 == 0)
- {
- ++i;
- LCDSetLine(0, i, SCREEN_SIZE - 1, i, LINE_COLOR);
- LCDSetLine(i, 0, i, SCREEN_SIZE - 1, LINE_COLOR);
- }
- ++j;
- }
- }
- void DrawDigit( int x, int y, int digit )
- {
- Color_t backgroundColor;
- if( x == gSelectedCellX && y == gSelectedCellY )
- {
- backgroundColor = ACTIVE_BACKGROUND_COLOR;
- }
- else
- {
- backgroundColor = BACKGROUND_COLOR;
- }
- LCD_WriteChar(digit + '0', FONT_DESCRIPTOR, gGridToDisplay[x] + DIGIT_X_OFFSET, gGridToDisplay[y] + DIGIT_Y_OFFSET, DIGIT_COLOR, backgroundColor);
- }
- void DrawGrid( )
- {
- int i, j;
- for (i = 0; i < SIZE2; ++i )
- {
- for (j = 0; j < SIZE2; ++j )
- {
- DrawDigit( i, j, gGrid[i][j] );
- }
- }
- }
- void Init( )
- {
- int i, j;
- AT91F_LowLevel_Init( );
- InitJoystick( );
- InitButtons( );
- InitLCD( );
- LCD_ClearScreen( BACKGROUND_COLOR );
- AT91F_Finalize_Init( );
- InitLines( );
- for (i = 0; i < 9; ++i )
- {
- for (j = 0; j < 9; ++j )
- {
- gGrid[i][j] = i + 1;
- }
- }
- DrawGrid( );
- DrawLines( );
- }
- void CollectInputs( )
- {
- gJoystickPosition = JOYSTICK_NONE;
- gButton1Pressed = FALSE;
- gButton2Pressed = FALSE;
- if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_LEFT))
- {
- gJoystickPosition = JOYSTICK_LEFT;
- }
- else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_RIGHT))
- {
- gJoystickPosition = JOYSTICK_RIGHT;
- }
- else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_DOWN))
- {
- gJoystickPosition = JOYSTICK_DOWN;
- }
- else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_TOP))
- {
- gJoystickPosition = JOYSTICK_UP;
- }
- else if(!((p_pPioA->PIO_PDSR) & BIT_JOYSTICK_CENTER))
- {
- gJoystickPosition = JOYSTICK_CENTER;
- }
- else if(!((p_pPioB->PIO_PDSR) & BIT_BUTTON1))
- {
- gButton1Pressed = TRUE;
- }
- else if(!((p_pPioB->PIO_PDSR) & BIT_BUTTON2))
- {
- gButton2Pressed = TRUE;
- }
- }
- void MoveCursor( )
- {
- switch( gJoystickPosition )
- {
- case JOYSTICK_LEFT:
- gSelectedCellX = gSelectedCellX == 0 ? SIZE2 - 1 : gSelectedCellX - 1;
- gIsDirty = TRUE;
- break;
- case JOYSTICK_RIGHT:
- gSelectedCellX = gSelectedCellX == SIZE2 - 1 ? 0 : gSelectedCellX + 1;
- gIsDirty = TRUE;
- break;
- case JOYSTICK_UP:
- gSelectedCellY = gSelectedCellY == 0 ? SIZE2 - 1 : gSelectedCellY - 1;
- gIsDirty = TRUE;
- break;
- case JOYSTICK_DOWN:
- gSelectedCellY = gSelectedCellY == SIZE2 - 1 ? 0 : gSelectedCellY + 1;
- gIsDirty = TRUE;
- break;
- }
- }
- void UpdateCell( )
- {
- int *digit = &(gGrid[gSelectedCellY][gSelectedCellX]);
- if( gButton1Pressed == TRUE )
- {
- *digit = *digit == 1 ? 1 : *digit - 1;
- gIsDirty = TRUE;
- }
- else if( gButton2Pressed == TRUE )
- {
- *digit = *digit == SIZE2 - 1 ? SIZE2 - 1 : *digit + 1;
- gIsDirty = TRUE;
- }
- }
- void DoTheJob( )
- {
- MoveCursor( );
- UpdateCell( );
- if( gIsDirty )
- {
- DrawGrid( );
- // DrawLines( );
- gIsDirty = FALSE;
- }
- }
- void WriteOutput( )
- {
- }
- int main()
- {
- Init( );
- while ( true )
- {
- CollectInputs( );
- DoTheJob( );
- WriteOutput( );
- }
- /* the answer to life the universe and everything */
- return 42;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement