📄 qs_ek-lm3s6965_revc.c
字号:
//*****************************************************************************
//
// qs_ek-lm3s6965_revc.c - The quick start application for the LM3S6965 Rev C
// Evaluation Board.
//
// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved.
//
// Software License Agreement
//
// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
// exclusively on LMI's microcontroller products.
//
// The software is owned by LMI and/or its suppliers, and is protected under
// applicable copyright laws. All rights are reserved. You may not combine
// this software with "viral" open-source software in order to form a larger
// program. Any use in violation of the foregoing restrictions may subject
// the user to criminal sanctions under applicable laws, as well as to civil
// liability for the breach of the terms and conditions of this license.
//
// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 1952 of the Stellaris Peripheral Driver Library.
//
//*****************************************************************************
#include "../../../hw_ints.h"
#include "../../../hw_memmap.h"
#include "../../../hw_sysctl.h"
#include "../../../hw_types.h"
#include "../../../src/adc.h"
#include "../../../src/debug.h"
#include "../../../src/gpio.h"
#include "../../../src/interrupt.h"
#include "../../../src/pwm.h"
#include "../../../src/sysctl.h"
#include "../../../src/systick.h"
#include "../../../src/timer.h"
#include "../../../src/uart.h"
#include "../rit128x96x4.h"
#include "audio.h"
#include "enet.h"
#include "game.h"
#include "globals.h"
#include "images.h"
#include "random.h"
#include "screen_saver.h"
#include "sounds.h"
//*****************************************************************************
//
//! \addtogroup ek_lm3s6965_revc_list
//! <h1>EK-LM3S6965 Rev C Quickstart Application (qs_ek-lm3s6965_revc)</h1>
//!
//! A game in which a blob-like character tries to find its way out of a maze.
//! The character starts in the middle of the maze and must find the exit,
//! which will always be located at one of the four corners of the maze. Once
//! the exit to the maze is located, the character is placed into the middle of
//! a new maze and must find the exit to that maze; this repeats endlessly.
//!
//! The game is started by pressing the select push button on the right side
//! of the board. During game play, the select push button will fire a bullet
//! in the direction the character is currently facing, and the navigation push
//! buttons on the left side of the board will cause the character to walk in
//! the corresponding direction.
//!
//! Populating the maze are a hundred spinning stars that mindlessly attack the
//! character. Contact with one of these stars results in the game ending, but
//! the stars go away when shot.
//!
//! Score is accumulated for shooting the stars and for finding the exit to the
//! maze. The game lasts for only one character, and the score is displayed on
//! the virtual UART at 115,200, 8-N-1 during game play and will be displayed
//! on the screen at the end of the game.
//!
//! A small web site is provided by the game over the Ethernet port. DHCP is
//! used to obtain an Ethernet address. If DHCP times out without obtaining an
//! address, a static IP address will be used. The DHCP timeout and the
//! default static IP are easily configurable using macros. The address that
//! is selected will be shown on the OLED display before the game starts. The
//! web pages allow the entire game maze to be viewed, along with the character
//! and stars; the display is generated by a Java applet that is downloaded
//! from the game (therefore requiring that Java be installed in the web
//! browser). The volume of the game music and sound effects can also be
//! adjusted.
//!
//! Since the OLED display on the evaluation board has burn-in characteristics
//! similar to a CRT, the application also contains a screen saver. The screen
//! saver will only become active if two minutes have passed without the user
//! push button being pressed while waiting to start the game (that is, it will
//! never come on during game play). Qix-style bouncing lines are drawn on the
//! display by the screen saver.
//!
//! After two minutes of running the screen saver, the display will be turned
//! off and the user LED will blink. Either mode of screen saver (bouncing
//! lines or blank display) will be exited by pressing the select push button.
//! The select push button will then need to be pressed again to start the
//! game.
//
//*****************************************************************************
//*****************************************************************************
//
// A set of flags used to track the state of the application.
//
//*****************************************************************************
unsigned long g_ulFlags;
//*****************************************************************************
//
// The speed of the processor clock, which is therefore the speed of the clock
// that is fed to the peripherals.
//
//*****************************************************************************
unsigned long g_ulSystemClock;
//*****************************************************************************
//
// Storage for a local frame buffer.
//
//*****************************************************************************
unsigned char g_pucFrame[6144];
//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif
//*****************************************************************************
//
// The number of clock ticks that have occurred. This is used as an entropy
// source for the random number generator; the number of clock ticks at the
// time of a button press or release is an entropic event.
//
//*****************************************************************************
static unsigned long g_ulTickCount = 0;
//*****************************************************************************
//
// The number of clock ticks that have occurred since the last screen update
// was requested. This is used to divide down the system clock tick to the
// desired screen update rate.
//
//*****************************************************************************
static unsigned char g_ucScreenUpdateCount = 0;
//*****************************************************************************
//
// The number of clock ticks that have occurred since the last application
// update was performed. This is used to divide down the system clock tick to
// the desired application update rate.
//
//*****************************************************************************
static unsigned char g_ucAppUpdateCount = 0;
//*****************************************************************************
//
// The debounced state of the five push buttons. The bit positions correspond
// to:
//
// 0 - Up
// 1 - Down
// 2 - Left
// 3 - Right
// 4 - Select
//
//*****************************************************************************
unsigned char g_ucSwitches = 0x1f;
//*****************************************************************************
//
// The vertical counter used to debounce the push buttons. The bit positions
// are the same as g_ucSwitches.
//
//*****************************************************************************
static unsigned char g_ucSwitchClockA = 0;
static unsigned char g_ucSwitchClockB = 0;
//*****************************************************************************
//
// Handles the SysTick timeout interrupt.
//
//*****************************************************************************
void
SysTickIntHandler(void)
{
unsigned long ulData, ulDelta;
//
// Increment the tick count.
//
g_ulTickCount++;
//
// Indicate that a timer interrupt has occurred.
//
HWREGBITW(&g_ulFlags, FLAG_CLOCK_TICK) = 1;
//
// Increment the screen update count.
//
g_ucScreenUpdateCount++;
//
// See if 1/30th of a second has passed since the last screen update.
//
if(g_ucScreenUpdateCount == (CLOCK_RATE / 30))
{
//
// Restart the screen update count.
//
g_ucScreenUpdateCount = 0;
//
// Request a screen update.
//
HWREGBITW(&g_ulFlags, FLAG_UPDATE) = 1;
}
//
// Update the music/sound effects.
//
AudioHandler();
//
// Increment the application update count.
//
g_ucAppUpdateCount++;
//
// See if 1/100th of a second has passed since the last application update.
//
if(g_ucAppUpdateCount != (CLOCK_RATE / 100))
{
//
// Return without doing any further processing.
//
return;
}
//
// Restart the application update count.
//
g_ucAppUpdateCount = 0;
//
// Run the Ethernet handler.
//
EnetTick(10);
//
// Read the state of the push buttons.
//
ulData = (GPIOPinRead(GPIO_PORTE_BASE, (GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_2 | GPIO_PIN_3)) |
(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1) << 3));
//
// Determine the switches that are at a different state than the debounced
// state.
//
ulDelta = ulData ^ g_ucSwitches;
//
// Increment the clocks by one.
//
g_ucSwitchClockA ^= g_ucSwitchClockB;
g_ucSwitchClockB = ~g_ucSwitchClockB;
//
// Reset the clocks corresponding to switches that have not changed state.
//
g_ucSwitchClockA &= ulDelta;
g_ucSwitchClockB &= ulDelta;
//
// Get the new debounced switch state.
//
g_ucSwitches &= g_ucSwitchClockA | g_ucSwitchClockB;
g_ucSwitches |= (~(g_ucSwitchClockA | g_ucSwitchClockB)) & ulData;
//
// Determine the switches that just changed debounced state.
//
ulDelta ^= (g_ucSwitchClockA | g_ucSwitchClockB);
//
// See if any switches just changed debounced state.
//
if(ulDelta)
{
//
// Add the current tick count to the entropy pool.
//
RandomAddEntropy(g_ulTickCount);
}
//
// See if the select button was just pressed.
//
if((ulDelta & 0x10) && !(g_ucSwitches & 0x10))
{
//
// Set a flag to indicate that the select button was just pressed.
//
HWREGBITW(&g_ulFlags, FLAG_BUTTON_PRESS) = 1;
}
}
//*****************************************************************************
//
// Delay for a multiple of the system tick clock rate.
//
//*****************************************************************************
static void
Delay(unsigned long ulCount)
{
//
// Loop while there are more clock ticks to wait for.
//
while(ulCount--)
{
//
// Wait until a SysTick interrupt has occurred.
//
while(!HWREGBITW(&g_ulFlags, FLAG_CLOCK_TICK))
{
}
//
// Clear the SysTick interrupt flag.
//
HWREGBITW(&g_ulFlags, FLAG_CLOCK_TICK) = 0;
}
}
//*****************************************************************************
//
// Displays a logo for a specified amount of time.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -