ECE2035 class project
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
Fork of missile_command by
Revision 0:532cb55d6136, committed 2014-10-29
- Comitter:
- arvahsu
- Date:
- Wed Oct 29 01:21:34 2014 +0000
- Child:
- 1:3da29f1d84b4
- Commit message:
- First public version
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/4DGL-uLCD-SE.lib Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/4180_1/code/4DGL-uLCD-SE/#e39a44de229a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/mbed/code/SDFileSystem/#7b35d1709458
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/city_landscape/city_landscape.cpp Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,117 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "city_landscape_private.h"
+
+CITY city_record[MAX_NUM_CITY];
+int building_height[NUM_BUILDING];
+
+// See the comments in city_landscape_public.h
+void city_landscape_init(int num_city) {
+ int i;
+ int city_distance = (SIZE_X-CITY_TO_SCREEN_MARGIN*2)/num_city;
+
+ // All interface for user should have error checking
+ ASSERT_P(num_city<=MAX_NUM_CITY,ERROR_CITY_NUMBER);
+
+ //initialize the record of cities
+ for(i=0;i<MAX_NUM_CITY;i++){
+ if(i<num_city){
+ // See the definition of CITY structure in city_landscape.h
+ city_record[i].y = REVERSE_Y(LANDSCAPE_HEIGHT)-1;
+ city_record[i].x = i*city_distance + CITY_TO_SCREEN_MARGIN;
+ city_record[i].width = CITY_WIDTH; // the width is fix number
+ city_record[i].height = MAX_BUILDING_HEIGHT; // the height is fix number
+ city_record[i].status = EXIST;
+ }
+ else{
+ city_record[i].status = DESTORIED;
+ }
+ }
+
+ //initialize the height of the buildings
+ srand(1);
+ for(i=0;i<NUM_BUILDING;i++){
+ building_height[i] = (rand() % MAX_BUILDING_HEIGHT*2/3)+MAX_BUILDING_HEIGHT/3;
+ }
+
+ //draw city landscape on the screen
+ draw_cities();
+ draw_landscape();
+
+}
+
+CITY city_get_info(int index){
+ // All interface for user should have error checking
+ ASSERT_P(index<MAX_NUM_CITY,ERROR_CITY_INDEX_GET_INFO);
+
+ return city_record[index];
+}
+
+void city_destory(int index){
+ int j;
+ int city_x, city_y, building_x, building_y;
+ int height;
+
+ // error checking. the index must smaller than its max.
+ ASSERT_P(index<MAX_NUM_CITY,ERROR_CITY_INDEX_DESTROY);
+
+ // remove the record
+ city_record[index].status = DESTORIED;
+
+ // use the background color to cover the city
+ city_x = city_record[index].x;
+ city_y = city_record[index].y;
+ for(j=0;j<NUM_BUILDING;j++){
+ building_x = city_x+j*BUILDING_WIDTH;
+ building_y = city_y;
+ height = building_y-building_height[j]+1;
+ uLCD.filled_rectangle(building_x, building_y, building_x+BUILDING_WIDTH-1, height, BACKGROUND_COLOR);
+ }
+}
+
+void draw_cities(void){
+ int i,j;
+ int city_x, city_y, building_x, building_y;
+ int height;
+
+ for(i=0;i<MAX_NUM_CITY;i++){
+
+ // draw each city
+ if(city_record[i].status==EXIST){
+ city_x = city_record[i].x;
+ city_y = city_record[i].y;
+
+ // draw each building
+ for(j=0;j<NUM_BUILDING;j++){
+ building_x = city_x+j*BUILDING_WIDTH;
+ building_y = city_y;
+ height = building_y-building_height[j]+1;
+ uLCD.filled_rectangle(building_x, building_y, building_x+BUILDING_WIDTH-1, height, BUILDING_COLOR);
+ }
+ }
+ }
+}
+
+void draw_landscape(void){
+ uLCD.filled_rectangle(0, SIZE_Y-1, SIZE_X-1, REVERSE_Y(LANDSCAPE_HEIGHT), LANDSCAPE_COLOR);
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/city_landscape/city_landscape_private.h Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,60 @@ +/* Gatech ECE2035 2014 FALL missile command + * Copyright (c) 2014 Gatech ECE2035 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef CITY_LANDSCAPE_PRIVATE_H +#define CITY_LANDSCAPE_PRIVATE_H + +#include "mbed.h" +#include "uLCD_4DGL.h" +#include "globals.h" +#include "city_landscape_public.h" + +//==== [private type] ==== +// N/A + + + +//==== [private function] ==== +// N/A + + + +//==== [private macros] ==== +// The bottom of the screen => y=127 +// Gut the landscape grow up from the bottom of the screen. It is awkward. +// Thus, we use a macro to reverse the coordinate for convenience. +#define REVERSE_Y(x) (SIZE_Y-(x)) + +//==== [private settings] ==== +// You could modify these settings, but try to keep them be used only inside city_landscape.cpp +// Here are the settings to define the looking of your city landscape +#define CITY_TO_SCREEN_MARGIN 25 // pixel on the screen +#define CITY_WIDTH 10 // pixel on the screen +#define BUILDING_WIDTH 2 // pixel on the screen +#define NUM_BUILDING (CITY_WIDTH/BUILDING_WIDTH) +#define BUILDING_COLOR 0x00FF00 +#define LANDSCAPE_COLOR 0xCCAA00 + + + + + +#endif //CITY_LANDSCAPE_PRIVATE_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/city_landscape/city_landscape_public.h Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,71 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file city_landscape_public.h */
+#ifndef CITY_LANDSCAPE_PUBLIC_H
+#define CITY_LANDSCAPE_PUBLIC_H
+
+/// The enum define the status of a city
+typedef enum {
+ EXIST=1, ///< The city will be shown on screen
+ DESTORIED=0 ///< The city won't be shown on screen
+} CITY_STATUS;
+
+/// The structure to store the information of a city
+typedef struct {
+ int x; ///< Bottom-left corner of the city. x coordinate on the screen.
+ int y; ///< Bottom-left corner of the city. y coordinate on the screen.
+ int width; ///< The width of the city. The shape of the city is an rectangle.
+ int height; ///< The height of the city
+ CITY_STATUS status; ///< See enum CITY_STATUS
+} CITY;
+
+#define MAX_NUM_CITY 6
+
+/** Call city_landscape_init() once at the begining of your code
+ @brief It initialize the city data structure and draw the cities.
+ @param num_city number of city to be draw. It must be less/equal to MAX_NUM_CITY.
+*/
+void city_landscape_init(int num_city);
+
+/** Get the information of city
+ @param index The index in city_record. It must be smaller than MAX_NUM_CITY.
+ @return The structure of city information
+*/
+CITY city_get_info(int index);
+
+/** Remove the city from its record and the screen
+ @param index The index in city_record. It must be smaller than MAX_NUM_CITY.
+*/
+void city_destory(int index);
+
+/** Draw all exist cities on the screen
+ @brief You might not need to use this function, but you could still use it if you want.
+*/
+void draw_cities(void);
+
+/** Draw the landscape
+ @brief You might not need to use this function, but you could still use it if you want.
+*/
+void draw_landscape(void);
+
+
+#endif //CITY_LANDSCAPE_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/globals.h Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,56 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef GLOBAL_H
+#define GLOBAL_H
+
+// === [global object] ===
+extern uLCD_4DGL uLCD;
+
+
+// === [global settings] ===
+#define BACKGROUND_COLOR 0x000000 //black
+#define LANDSCAPE_HEIGHT 4 // number of pixel on the screen
+#define MAX_BUILDING_HEIGHT 10 // number of pixel on the screen
+
+
+// === [define the macro of error heandle function] ===
+// when the condition (c) is not true, assert the program and show error code
+#define ASSERT_P(c,e) do { \
+ if(!(c)){ \
+ uLCD.printf("\nERROR:%d\n",e); \
+ while(1); \
+ } \
+} while (0)
+
+
+// === [error code] ===
+#define ERROR_MISSILE_INDEX_GET_INFO -1 // make sure your code give the valid index for missile_get_info()
+#define ERROR_MISSILE_INDEX_UPDATE_STATUS -2 // make sure your code give the valid index for missile_update_status()
+#define ERROR_MISSILE_SPEED -3 // missile speed has to be between 1 and 8
+#define ERROR_MISSILE_INTERVAL -4 // missile interval has to be between 1 and 100
+// other missile error code ...
+#define ERROR_CITY_NUMBER -11 // num_city in city_landscape_init() is larger than MAX_NUM_CITY
+#define ERROR_CITY_INDEX_GET_INFO -12 // make sure your code give the valid index for city_get_info()
+#define ERROR_CITY_INDEX_DESTROY -13 // make sure your code give the valid index for city_destory()
+// other player-missile error code ...
+
+#endif //GLOBAL_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,132 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file main.cpp */
+// Include header files for platform
+#include "mbed.h"
+#include "uLCD_4DGL.h"
+#include "wave_player.h"
+#include "SDFileSystem.h"
+#include "segment_display.h"
+
+// Include header files for missile command project
+#include "globals.h"
+#include "city_landscape_public.h"
+#include "missile_public.h"
+#include "player.h"
+
+// Platform initialization
+DigitalIn left_pb(p23); DigitalIn right_pb(p21); DigitalIn fire_pb(p22);
+uLCD_4DGL uLCD(p28,p27,p29);
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
+
+// Example of the decleration of your implementation
+void playSound(char * wav);
+
+/** Main() is where you start your implementation
+ @brief The hints of implementation are in the comments. <br>
+ @brief You are expected to implement your code in main.cpp and player.cpp. But you could modify any code if you want to make the game work better.
+*/
+int main()
+{
+ // [Demo of 7-segment display]
+ // 1.Initialize the segment display
+ setup_sequence();
+ seg_driver_initialize();
+ // 2.show numbers
+ int i;
+ for(i=0;i<10;i++){
+ seg_driver(i);
+ wait(0.2);
+ }
+
+ // [Demo of play sound file]
+ playSound("/sd/wavfiles/BUZZER.wav");
+
+ /// [Example of missile command implementation]
+ /// Here is a rough flow to implement the missile command: <br><br>
+
+ /// 1.Initialize and draw the city landscape
+ city_landscape_init(4);
+ // Initialize the buttons
+ left_pb.mode(PullUp); // The variable left_pb will be zero when the pushbutton for moving the player left is pressed
+ right_pb.mode(PullUp); // The variable rightt_pb will be zero when the pushbutton for moving the player right is pressed
+ fire_pb.mode(PullUp); //the variable fire_pb will be zero when the pushbutton for firing a missile is pressed
+
+ /// 2.Begin the game loop
+ while(1){
+
+ /// 3.Example of drawing the player
+ player_draw(60,100); // draws a player at the center of the screen
+
+ /// 4.Example of calling the missile API.
+ missile_generator(); /// It updates all incoming missiles on the screen
+
+ /// 5.Implement the code to get user input and update the player
+ /// -[Hint] You could see city_landscape.cpp to get some ideas about how to implement your player. <br>
+ if(left_pb == 0){
+ /// -[Hint] Implement the code to move player left <br>
+ }
+ if(right_pb == 0){
+ /// -[Hint] Implement the code to move player right <br>
+ }
+ if(fire_pb == 0){
+ /// -[Hint] Implement the code to fire player-missile <br>
+
+ // [Demo of play sound file]
+ playSound("/sd/wavfiles/BUZZER.wav");
+ }
+
+ /// 6.Implement the code to draw a user missile
+ /// -[Hint] You could see missile.cpp or missile_generator() for your reference <br>
+
+ /// 7.Implement the code to detect the collision between missiles and cities
+ /// -[Hint] You could use city_get_info() and missile_get_info() <br>
+ /// -[Hint] You could use missile_set_exploded() to notify the missile module that the missile was exploded. <br>
+ /// -[Hint] You need to check which city was hit by the missile, and call city_destory() to destroy it. <br>
+ /// -[Hint] You might also check whether the missile hit the land <br>
+
+ /// 8.Implement the code to detect a collision between player-missiles and incoming missiles
+ /// -[Hint] You could use missile_get_info() to get the position of incoming missile <br>
+ /// -[Hint] You could use missile_set_exploded() to notify the missile module that the missile was exploded. <br>
+ /// -[Hint] You might also check whether the missile hit the player <br>
+
+ /// 9.Implement the code to check the end of game
+ /// -[Hint] For example, if there is no more city, it should be gameover. <br>
+
+ }
+}
+
+// Example of implementation of your functions
+void playSound(char * wav)
+{
+ // open wav file
+ FILE *wave_file;
+ wave_file=fopen(wav,"r");
+
+ // play wav file
+ waver.play(wave_file);
+
+ // close wav file
+ fclose(wave_file);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/cb3d968589d8 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/missile/missile.cpp Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,143 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "missile_private.h"
+
+MISSILE missile_record[MAX_NUM_MISSILE];
+int missile_tick=0;
+int missile_interval = 10;
+int missile_speed = 4;
+
+// See the comments in missile_public.h
+void missile_generator(void){
+ missile_tick++;
+ // only fire the missile at certain ticks
+ if((missile_tick % missile_interval)==0 || missile_tick==0){
+ missile_create();
+ }
+
+ // update the missiles and draw them
+ missile_update_position();
+}
+
+// set missile speed (default speed is 4)
+void set_missile_speed(int speed){
+ ASSERT_P(speed>=1 && speed<=8,ERROR_MISSILE_SPEED);
+ if(speed>=1 && speed<=8){
+ missile_speed = speed;
+ }
+}
+
+// set missile interval (default interval is 10)
+void set_missile_interval(int interval){
+ ASSERT_P(interval>=1 && interval<=100,ERROR_MISSILE_INTERVAL);
+ if(interval>=1 && interval<=100){
+ missile_interval = interval;
+ }
+}
+
+// See the comments in missile_public.h
+MISSILE missile_get_info(int index){
+ // All interface for user should have error checking
+ ASSERT_P(index<MAX_NUM_MISSILE,ERROR_MISSILE_INDEX_GET_INFO);
+
+ return missile_record[index];
+}
+
+// See the comments in missile_public.h
+void missile_set_exploded(int index){
+ // All interface for user should have error checking
+ ASSERT_P(index<MAX_NUM_MISSILE,ERROR_MISSILE_INDEX_UPDATE_STATUS);
+
+ missile_record[index].status = MISSILE_EXPLODED;
+}
+
+/** This function finds an empty slot of missile record, and active it.
+*/
+void missile_create(void){
+ int i;
+ for(i=0;i<MAX_NUM_MISSILE;i++){
+ if(missile_record[i].status == MISSILE_DEACTIVE){
+ missile_record[i].y = 0;
+ //each missile has its own tick
+ missile_record[i].tick = 0;
+ //set a random source for the missile
+ missile_record[i].source_x = rand() % SIZE_X;
+ //set a random target for the missile
+ missile_record[i].target_x = rand() % SIZE_X;
+ //the missile starts at its source
+ missile_record[i].x = missile_record[i].source_x;
+ missile_record[i].status = MISSILE_ACTIVE;
+ break;
+ }
+ }
+}
+
+/** This function update the position of all missiles and draw them
+*/
+void missile_update_position(void){
+ int i;
+ //controls how fast the missile will move
+ int rate = missile_speed * 25;
+ //delta_x and delta_y account for the slope of the missile
+ double delta_x,delta_y;
+ for(i=0;i<MAX_NUM_MISSILE;i++){
+ if(missile_record[i].status == MISSILE_ACTIVE){
+ // update missile position
+ delta_y = 200/rate;
+ delta_x = (missile_record[i].target_x - missile_record[i].source_x)/rate;
+ missile_draw(missile_record[i], BACKGROUND_COLOR);
+ missile_record[i].y = (int)(delta_y*(missile_record[i].tick%rate));
+ missile_record[i].x = (int)(missile_record[i].source_x + delta_x*(missile_record[i].tick%rate));
+ // draw missile
+ missile_draw(missile_record[i], MISSILE_COLOR);
+ //update missile's internal tick
+ missile_record[i].tick++;
+ }
+ else if(missile_record[i].status == MISSILE_EXPLODED){
+ // clear the missile on the screen
+ missile_draw(missile_record[i], BACKGROUND_COLOR);
+
+ // we have done with this missile, remove it from record
+ missile_record[i].status = MISSILE_DEACTIVE;
+ //resets the missile's internal tick
+ missile_record[i].tick = 0;
+ }
+
+ }
+}
+
+/** This function draw a missile.
+ @param missile The missile to be drawn
+ @param color The color of the missile
+*/
+void missile_draw(MISSILE missile, int color){
+ int init_x,init_y,current_x,current_y;
+
+ init_x = missile.source_x;
+ init_y = 0;
+ current_x = missile.x;
+ current_y = missile.y;
+ uLCD.line(init_x, init_y, current_x, current_y, color);
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/missile/missile_private.h Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,43 @@ +/* Gatech ECE2035 2014 FALL missile command + * Copyright (c) 2014 Gatech ECE2035 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef MISSILE_PRIVATE_H +#define MISSILE_PRIVATE_H + +#include "mbed.h" +#include "uLCD_4DGL.h" +#include "globals.h" +#include "missile_public.h" + +//==== [private settings] ==== +#define MISSILE_COLOR 0xFF0000 + +//==== [private type] ==== + + +//==== [private function] ==== +void missile_create(void); +void missile_update_position(void); +void missile_draw(MISSILE missile, int color); + +#endif //MISSILE_PRIVATE_H + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/missile/missile_public.h Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,70 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file missile_public.h */
+#ifndef MISSILE_PUBLIC_H
+#define MISSILE_PUBLIC_H
+
+///The missile status
+typedef enum {
+ MISSILE_EXPLODED=2,///<missile has been destroyed
+ MISSILE_ACTIVE=1,///<missile is active
+ MISSILE_DEACTIVE=0///<missile is no longer active
+} MISSILE_STATUS;
+
+/// The structure to store the information of a missile
+typedef struct {
+ int x; ///< The x-coordinate of missile current position
+ int y; ///< The y-coordinate of missile current position
+ double source_x; ///< The x-coordinate of the missile's origin
+ double target_x; ///< The x-coordinate of the missile's target
+ int tick; ///< The missile's internal tick
+ MISSILE_STATUS status; ///< The missile status, see MISSILE_STATUS
+} MISSILE;
+
+#define MAX_NUM_MISSILE 5
+
+/** This function draw the missiles onto the screen
+ Call missile_generator() repeatedly in your game-loop. ex: main()
+*/
+void missile_generator(void);
+
+/** The function set the status of missile to be MISSILE_EXPLODED
+ @param index The index in missile_record. It must be smaller than MAX_NUM_MISSILE.
+*/
+void missile_set_exploded(int index);
+
+/** Get the information of a missile
+ @param index The index in missile_record. It must be smaller than MAX_NUM_MISSILE.
+ @return The structure of missile information
+*/
+MISSILE missile_get_info(int index);
+
+/** Set the speed of missiles, Speed has range of 1-8 with 1 being fastest and 8 being slowest
+*/
+void set_missile_speed(int speed);
+
+/** Set the interval that the missiles fire, interval has range of 1-100 with 1 being fired in
+ very quick succession and 100 being fired very slowly after one another
+*/
+void set_missile_interval(int interval);
+
+#endif //MISSILE_PUBLIC_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/player.cpp Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,37 @@
+/* Gatech ECE2035 2014 FALL missile command
+ * Copyright (c) 2014 Gatech ECE2035
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+// Template of player implementation
+#include "mbed.h"
+#include "uLCD_4DGL.h"
+#include "globals.h"
+#include "player.h"
+
+// Example of drawing the player
+void player_draw(int x, int y) {
+ uLCD.filled_rectangle(x, y, x+PLAYER_WIDTH, y+PLAYER_HEIGHT, PLAYER_COLOR);
+ uLCD.filled_rectangle(x+PLAYER_DELTA, y-PLAYER_DELTA, x+PLAYER_WIDTH-PLAYER_DELTA, y+PLAYER_HEIGHT, PLAYER_COLOR);
+}
+
+// ... You need to implement your own functions for player ...
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/player.h Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,41 @@ +/* Gatech ECE2035 2014 FALL missile command + * Copyright (c) 2014 Gatech ECE2035 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +// Template of player header file +#ifndef PLAYER_H +#define PLAYER_H + +// Example of some player settings +#define PLAYER_WIDTH 10 +#define PLAYER_HEIGHT 3 +#define PLAYER_DELTA 3 +#define PLAYER_COLOR 0x0000FF + + +/** Get the information of city + @brief x and y are the top left corner of the player drawing + @param x x-coordinate + @param y y-coordinate +*/ +void player_draw(int x, int y); + +#endif //PLAYER_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/segment_display/dig_out.s Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,332 @@ + AREA dig_out, CODE, READONLY +;--------------------OVERVIEW------------------------ +; This file contains ARM Assembly language functions to set +; designated pins to General Purpose Output. It uses +; the PINSELx Register to Set the Pin Function to GPIO. +; Then, it uses the FIOxDIR register to set the +; direction of the pin to output. It also contains functions +; to write a digital HIGH or LOW to these output pins. It uses +; the FIOxCLR AND FIOxSET registers to clear/set the +; port bits respectively. Refer to the Pinnames.h +; file to see which LPC1768 pins a given mbed module is +; connected to. Then, refer to Chapters 8 and 9 of the +; LPC1768 User Manual to acquire information on the GPIO +; registers and their addresses. +; +; Example: +; LED1 is on GPIO port 1 bit 18 according to Pinnames.h +; For this bit: -the PINSEL3 register determines its pin function +; -the FIO1DIR register determines its pin direction +; According to the LPC1768 User Manual: -PINSEL3 is located at 0x4002C00C +; -FIO1DIR is located at 0x2009C020 +; Now refer to the dig_out_LED1 function below to see the execution +;------------------------------------------------------ +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_LED1 +dig_out_LED1 +;========dig_out_LED1======== +; LED1 LOCATED AT PORT-1 PIN-18 + LDR R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER + MOV.W R1, #0x00040000 ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + LDR R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER + MOV R3, #0x30 ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits) + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT LED1_write +LED1_write +;========LED1_write========= +; LED1 LOCATED AT PORT-1 PIN-18 + LDR R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER) + MOV.W R2, #0x040000 ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_LED2 +dig_out_LED2 +;========dig_out_LED2======== +; LED2 LOCATED AT PORT-1 PIN-20 + LDR R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER + LDR R1, =0x00100000 ; MOVE BIT MASK (FOR BIT 20) INTO TEMP REGISTER (0x100000 = 0x01 << 20) + LDR R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER + MOV.W R3, #0x300 ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT LED2_write +LED2_write +;========LED2_write========= +; LED2 LOCATED AT PORT-1 PIN-20 + LDR R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER) + LDR R2, =0x0100000 ; MOVE BIT MASK (FOR BIT 20) INTO TEMP REGISTER (0x100000 = 0x01 << 20) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_LED3 +dig_out_LED3 +;========dig_out_LED3======== +; LED3 LOCATED AT PORT-1 PIN-21 + LDR R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER + LDR R1, =0x00200000 ; MOVE BIT MASK (FOR BIT 21) INTO TEMP REGISTER (0x200000 = 0x01 << 21) + LDR R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER + MOV.W R3, #0xC00 ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT LED3_write +LED3_write +;========LED3_write========= +; LED3 LOCATED AT PORT-1 PIN-21 + LDR R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER) + LDR R2, =0x0200000 ; MOVE BIT MASK (FOR BIT 21) INTO TEMP REGISTER (0x200000 = 0x01 << 21) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_LED4 +dig_out_LED4 +;========dig_out_LED4======== +; LED4 LOCATED AT PORT-1 PIN-23 + LDR R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER + LDR R1, =0x00800000 ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x800000 = 0x01 << 23) + LDR R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER + MOV.W R3, #0xC000 ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT LED4_write +LED4_write +;========LED4_write========= +; LED4 LOCATED AT PORT-1 PIN-23 + LDR R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER) + LDR R2, =0x0800000 ; MOVE BIT MASK (FOR BIT 21) INTO TEMP REGISTER (0x800000 = 0x01 << 23) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P11 +dig_out_P11 +;========dig_out_P11======== +; P11 LOCATED AT PORT-0 PIN-18 + LDR R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER + MOV.W R1, #0x00040000 ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + MOV R3, #0x30 ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits) + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P11_write +P11_write +;========P11_write========= +; P11 LOCATED AT PORT-0 PIN-18 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x040000 ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P12 +dig_out_P12 +;========dig_out_P12======== +; P12 LOCATED AT PORT-0 PIN-17 + LDR R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER + MOV.W R1, #0x00020000 ; MOVE BIT MASK (FOR BIT 17) INTO TEMP REGISTER (0x40000 = 0x01 << 18) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + MOV R3, #0xC ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits) + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P12_write +P12_write +;========P12_write========= +; P12 LOCATED AT PORT-0 PIN-17 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x020000 ; MOVE BIT MASK (FOR BIT 17) INTO TEMP REGISTER (0x40000 = 0x01 << 18) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P13 +dig_out_P13 +;========dig_out_P13======== +; P13 LOCATED AT PORT-0 PIN-15 + LDR R0, =0x4002C000 ; LOAD ADDRESS OF PINSEL0 REGISTER + MOV.W R1, #0x00008000 ; MOVE BIT MASK (FOR BIT 15) INTO TEMP REGISTER (0x08000 = 0x01 << 15) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + LDR R3, =0x70000000 ; FORM BITMASK FOR PINSEL0 REGISTER (clear appropriate bits) + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P13_write +P13_write +;========P13_write========= +; P13 LOCATED AT PORT-0 PIN-15 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x008000 ; MOVE BIT MASK (FOR BIT 15) INTO TEMP REGISTER (0x08000 = 0x01 << 15) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P14 +dig_out_P14 +;========dig_out_P14======== +; P14 LOCATED AT PORT-0 PIN-16 + LDR R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER + MOV.W R1, #0x00010000 ; MOVE BIT MASK (FOR BIT 16) INTO TEMP REGISTER (0x10000 = 0x01 << 16) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + MOV R3, #0x03 ; FORM BITMASK FOR PINSEL0 REGISTER (clear appropriate bits) + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P14_write +P14_write +;========P14_write========= +; P14 LOCATED AT PORT-0 PIN-16 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x010000 ; MOVE BIT MASK (FOR BIT 16) INTO TEMP REGISTER (0x10000 = 0x01 << 16) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P15 +dig_out_P15 +;========dig_out_P15======== +; P15 LOCATED AT PORT-0 PIN-23 + LDR R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER + LDR R1, =0x00800000 ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x800000 = 0x01 << 23) + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + MOV.W R3, #0x7000 ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P15_write +P15_write +;========P15_write========= +; P15 LOCATED AT PORT-0 PIN-23 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x0800000 ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x800000 = 0x01 << 23) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P16 +dig_out_P16 +;========dig_out_P16======== +; P16 LOCATED AT PORT-0 PIN-24 + LDR R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER + LDR R1, =0x01000000 ; MOVE BIT MASK (FOR BIT 24) INTO TEMP REGISTER (0x1000000 = 0x01 << 24) + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + MOV.W R3, #0x30000 ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P16_write +P16_write +;========P16_write========= +; P16 LOCATED AT PORT-0 PIN-24 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x1000000 ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x1000000 = 0x01 << 24) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT dig_out_P17 +dig_out_P17 +;========dig_out_P17======== +; P17 LOCATED AT PORT-0 PIN-25 + LDR R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER + MOV.W R1, #0x02000000 ; MOVE BIT MASK (FOR BIT 25) INTO TEMP REGISTER (0x40000 = 0x01 << 25) +; ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER + LDR R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER + MOV R3, #0xC0000 ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits) + B dig_out_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK + EXPORT P17_write +P17_write +;========P17_write========= +; P17 LOCATED AT PORT-0 PIN-25 + LDR R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER) + MOV.W R2, #0x2000000 ; MOVE BIT MASK (FOR BIT 25) INTO TEMP REGISTER (0x1000000 = 0x01 << 25) + B write_exec ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES +; +; +; +dig_out_exec +;========dig_out_execution======== +; SET PIN FUNCTION TO GPIO + LDR R4, [R0] ; \ + BIC R4, R3 ; - APPLY BITMASK FOR PINSELx REGISTER (clear appropriate bits) + STR R4, [R0] ; STORE BITMASK IN PINSELx REGISTER +; +; SET UP GPIO PORT FOR OUTPUT DIRECTION (WITH SPECIFIED BITMASK IN REGISTER R2) + LDR R6, [R2] ; \ + ORR R6, R1 ; - ACQUIRE BITMASK FOR FIOxDIR REGISTER (1 = Output) + STR R6, [R2] ; STORE BITMASK IN FIOxDIR REGISTER +; +;RETURN TO MAIN + BX LR ; RETURN TO MAIN USING LINKER REGISTER +; +; +; +write_exec +;========write_execution========= +; CLEAR/SET BASED ON INPUT VALUE + CMP R0, #0 ; VALUE == 0 ? + ITE EQ ; (IF-THEN-ELSE) ON NEXT TWO INSTRUCTIONS USING "EQ" FLAG + STREQ R2, [R1,#0x1C] ; if==0, CLEAR LED1 BIT + STRNE R2, [R1,#0x18] ; if==1, SET LED1 BIT +; +; RETURN TO MAIN + BX LR ; RETURN TO MAIN USING LINKER REGISTER +; +; +; + ALIGN 4 ; make sure the file is ended with align 4 + NOP + NOP + END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/segment_display/segment_display.h Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,9 @@ +#ifndef SEGMENT_DISPLAY_H +#define SEGMENT_DISPLAY_H + +//declare functions (assembly subroutines) +extern "C" void setup_sequence(void); +extern "C" void seg_driver_initialize(void); +extern "C" void seg_driver(int value); + +#endif //SEGMENT_DISPLAY_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/segment_display/segment_driver.s Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,183 @@
+ AREA segment_driver, CODE, READONLY
+;--------------------OVERVIEW------------------------
+; This file contains ARM Assembly language functions to
+; drive a 7-segment LED Display (Kingbright SA03-11HDB).
+; This library uses a switch statement on the input
+; register (R0) to set or clear each corresponding lead
+; of the display. NOTE: The 7 Segments of the LED display
+; must be connected to pins p11 - p17 of the mbed digital
+; I/O. For further help with understanding this file,
+; please refer to files:
+; dig_in.s
+; dig_out.s
+;------------------------------------------------------
+; Import function locations so that C compiler can find it and link
+ IMPORT dig_out_P11
+ IMPORT P11_write
+ IMPORT dig_out_P12
+ IMPORT P12_write
+ IMPORT dig_out_P13
+ IMPORT P13_write
+ IMPORT dig_out_P14
+ IMPORT P14_write
+ IMPORT dig_out_P15
+ IMPORT P15_write
+ IMPORT dig_out_P16
+ IMPORT P16_write
+ IMPORT dig_out_P17
+ IMPORT P17_write
+; Export function location so that C compiler can find it and link
+ EXPORT seg_driver_initialize
+seg_driver_initialize ;CLEAR DISPLAY
+ PUSH {LR}
+ BL dig_out_P11
+ BL dig_out_P12
+ BL dig_out_P13
+ BL dig_out_P14
+ BL dig_out_P15
+ BL dig_out_P16
+ BL dig_out_P17
+ MOV R0,#1
+ BL P11_write
+ BL P12_write
+ BL P13_write
+ BL P14_write
+ BL P15_write
+ BL P16_write
+ BL P17_write
+ POP {LR}
+ BX LR
+
+; Export function location so that C compiler can find it and link
+ EXPORT seg_driver
+seg_driver ;SWITCH STATEMENT
+ PUSH {LR}
+ ADR R2,switchpool
+ LDR PC,[R2,R0,LSL #2]
+ ALIGN
+switchpool
+ DCD case0
+ DCD case1
+ DCD case2
+ DCD case3
+ DCD case4
+ DCD case5
+ DCD case6
+ DCD case7
+ DCD case8
+ DCD case9
+case0
+ MOV R0,#0
+ BL P11_write
+ BL P12_write
+ BL P13_write
+ BL P14_write
+ BL P15_write
+ BL P16_write
+ MOV R0,#1
+ BL P17_write
+ B end
+case1
+ MOV R0,#0
+ BL P12_write
+ BL P13_write
+ MOV R0,#1
+ BL P11_write
+ BL P14_write
+ BL P15_write
+ BL P16_write
+ BL P17_write
+ B end
+case2
+ MOV R0,#0
+ BL P11_write
+ BL P12_write
+ BL P14_write
+ BL P15_write
+ BL P17_write
+ MOV R0,#1
+ BL P13_write
+ BL P16_write
+ B end
+case3
+ MOV R0,#0
+ BL P11_write
+ BL P12_write
+ BL P13_write
+ BL P14_write
+ BL P17_write
+ MOV R0,#1
+ BL P15_write
+ BL P16_write
+ B end
+case4
+ MOV R0,#0
+ BL P12_write
+ BL P13_write
+ BL P16_write
+ BL P17_write
+ MOV R0,#1
+ BL P11_write
+ BL P14_write
+ BL P15_write
+ B end
+case5
+ MOV R0,#0
+ BL P11_write
+ BL P13_write
+ BL P14_write
+ BL P16_write
+ BL P17_write
+ MOV R0,#1
+ BL P12_write
+ BL P15_write
+ B end
+case6
+ MOV R0,#0
+ BL P11_write
+ BL P13_write
+ BL P14_write
+ BL P15_write
+ BL P16_write
+ BL P17_write
+ MOV R0,#1
+ BL P12_write
+ B end
+case7
+ MOV R0,#0
+ BL P11_write
+ BL P12_write
+ BL P13_write
+ MOV R0,#1
+ BL P14_write
+ BL P15_write
+ BL P16_write
+ BL P17_write
+ B end
+case8
+ MOV R0,#0
+ BL P11_write
+ BL P12_write
+ BL P13_write
+ BL P14_write
+ BL P15_write
+ BL P16_write
+ BL P17_write
+ B end
+case9
+ MOV R0,#0
+ BL P11_write
+ BL P12_write
+ BL P13_write
+ BL P16_write
+ BL P17_write
+ MOV R0,#1
+ BL P14_write
+ BL P15_write
+ B end
+end
+ POP {LR}
+ BX LR
+;
+ END
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/segment_display/setup.s Wed Oct 29 01:21:34 2014 +0000
@@ -0,0 +1,42 @@
+ AREA setup, CODE, READONLY
+;--------------------OVERVIEW------------------------
+; This file contains ARM Assembly language functions to
+; initialize select registers/memory-locations in the
+; LPC1768 to predetermined values. This startup sequence
+; will be used to test the integrity of your program, and
+; IT SHOULD NOT BE ALTERED BY ANY MEANS. Any student
+; attempting to alter this file will be subject to academic
+; dishonesty and any disciplinary actions pertaining
+; thereto.
+;------------------------------------------------------
+; Export function location so that C compiler can find it and link
+ EXPORT setup_sequence
+setup_sequence
+ ;PUSH LINK REGISTER TO STACK
+ PUSH {LR}
+
+ ;INIT PINSEL0
+ LDR R0, =0x4002C000 ;LOAD ADDRESS OF PINSEL0 REGISTER
+ LDR R1, =0x40000000 ;LOAD BITMASK FOR PINSEL0 REGISTER
+ LDR R2, [R0] ;\
+ ORR R2, R1 ;- APPLY BITMASK
+ STR R2, [R0] ;/
+
+ ;INIT PINSEL1
+ LDR R0, =0x4002C004 ;LOAD ADDRESS OF PINSEL1 REGISTER
+ LDR R1, =0x00054015 ;LOAD BITMASK FOR PINSEL1 REGISTER
+ LDR R2, [R0] ;\
+ ORR R2, R1 ;- APPLY BITMASK
+ STR R2, [R0] ;/
+
+ ;INIT PINSEL3
+ LDR R0, =0x4002C00C ;LOAD ADDRESS OF PINSEL3 REGISTER
+ LDR R1, =0x00004510 ;LOAD BITMASK FOR PINSEL4 REGISTER
+ LDR R2, [R0] ;\
+ ORR R2, R1 ;- APPLY BITMASK
+ STR R2, [R0] ;/
+
+ ;RETURN TO MAIN
+ POP {LR}
+ BX LR
+ END
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wave_player.lib Wed Oct 29 01:21:34 2014 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/sravet/code/wave_player/#acc3e18e77ad
