initial commit
This commit is contained in:
11
sdk/software/examples/pinball_game/Makefile
Normal file
11
sdk/software/examples/pinball_game/Makefile
Normal file
@@ -0,0 +1,11 @@
|
||||
TARGET = pinball_game
|
||||
|
||||
CFLAGS += -O3 -g
|
||||
|
||||
C_SRCS := $(wildcard ./*.c )
|
||||
|
||||
OBJDIR = obj
|
||||
COMMON_DIR = ../../bsp
|
||||
GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0
|
||||
PICOLIBC_DIR=../../../toolchains/picolibc
|
||||
include ../../bsp/common.mk
|
||||
249
sdk/software/examples/pinball_game/main.c
Normal file
249
sdk/software/examples/pinball_game/main.c
Normal file
@@ -0,0 +1,249 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "common_func.h"
|
||||
#include "dvi.h"
|
||||
#include "seg7.h"
|
||||
#include "led.h"
|
||||
#include "core_time.h"
|
||||
|
||||
//BSP板级支持包所需全局变量
|
||||
unsigned long UART_BASE = 0xbf000000; //UART16550的虚地址
|
||||
unsigned long CONFREG_TIMER_BASE = 0xbf20f100; //CONFREG计数器的虚地址
|
||||
unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; //CONFREG时钟频率
|
||||
unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率
|
||||
|
||||
|
||||
int Ball_x = 400;
|
||||
int Ball_y = 100;
|
||||
int Ball_r = 5;
|
||||
|
||||
volatile int Plane_x = 400;
|
||||
int Plane_y = 400;
|
||||
int Plane_l = 100;
|
||||
int Plane_w = 5;
|
||||
|
||||
// ball move direction
|
||||
int Ball_dx = 2;
|
||||
int Ball_dy = 2;
|
||||
|
||||
// ball move direction
|
||||
int Plane_dx = 20;
|
||||
|
||||
int score = 0;
|
||||
|
||||
volatile int delay_time = 0;
|
||||
|
||||
void Timer_IntrHandler(void);
|
||||
void Button_IntrHandler(unsigned char button_state);
|
||||
|
||||
void showGameOver(void);
|
||||
|
||||
int chooseFlag = 1;
|
||||
|
||||
volatile int flag = 1;
|
||||
|
||||
void InterruptInit(void)
|
||||
{
|
||||
// Enable button and timer Interrupt
|
||||
RegWrite(0xbf20f004,0x0f);//edge
|
||||
RegWrite(0xbf20f008,0x1f);//pol
|
||||
RegWrite(0xbf20f00c,0x1f);//clr
|
||||
RegWrite(0xbf20f000,0x1f);//en
|
||||
|
||||
RegWrite(0xbf20f104,25000000);//timercmp 500ms
|
||||
RegWrite(0xbf20f108,0x1);//timeren
|
||||
}
|
||||
|
||||
void showGameOver(void);
|
||||
|
||||
void chooseTime(void)
|
||||
{
|
||||
printf("Please Choosetime !!\n");
|
||||
while (flag);
|
||||
printf("Choosetime:%d\n",delay_time);
|
||||
chooseFlag = 0;
|
||||
setSegNum(0,0,0,0);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
InterruptInit();
|
||||
|
||||
chooseTime();
|
||||
|
||||
while (1) {
|
||||
|
||||
DVI_Draw_Rect(Plane_x,Plane_y,Plane_l,Plane_w);
|
||||
|
||||
DVI_Draw_SQU(Ball_x,Ball_y,Ball_r);
|
||||
|
||||
delay_ms(delay_time);
|
||||
|
||||
// refresh place
|
||||
Ball_x += Ball_dx;
|
||||
Ball_y += Ball_dy;
|
||||
|
||||
delay_ms(delay_time);
|
||||
|
||||
if(Ball_y < 2)
|
||||
{
|
||||
Ball_y = 2;
|
||||
Ball_dy = -Ball_dy;
|
||||
}
|
||||
|
||||
if(Ball_y > 600)
|
||||
{
|
||||
Ball_y = 600;
|
||||
Ball_dy = -Ball_dy;
|
||||
}
|
||||
|
||||
if(Ball_x < 2)
|
||||
{
|
||||
Ball_x = 2;
|
||||
Ball_dx = -Ball_dx;
|
||||
}
|
||||
|
||||
if(Ball_x > 800)
|
||||
{
|
||||
Ball_x = 800;
|
||||
Ball_dx = -Ball_dx;
|
||||
}
|
||||
|
||||
if( Ball_y > 410 )
|
||||
break;
|
||||
|
||||
if((Plane_y - Ball_y) < 2 && (Ball_x > (Plane_x - Plane_l)) && (Ball_x < (Plane_x + Plane_l)))
|
||||
{
|
||||
Ball_dy = -Ball_dy;
|
||||
score++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
showGameOver();
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void HWI0_IntrHandler(void)
|
||||
{
|
||||
unsigned int int_state;
|
||||
int_state = RegRead(0xbf20f014);
|
||||
|
||||
if((int_state & 0x10) == 0x10){
|
||||
Timer_IntrHandler();
|
||||
}
|
||||
else if(int_state & 0xf){
|
||||
Button_IntrHandler(int_state & 0xf);
|
||||
}
|
||||
}
|
||||
|
||||
void Timer_IntrHandler(void)
|
||||
{
|
||||
if (!chooseFlag)
|
||||
{
|
||||
// refreshing the DVI output
|
||||
if (score > 9)
|
||||
{
|
||||
setSegNum(1,score/10,1,score%10);
|
||||
}else{
|
||||
setSegNum(0,0,1,score);
|
||||
}
|
||||
}
|
||||
RegWrite(0xbf20f108,0);
|
||||
RegWrite(0xbf20f108,1);
|
||||
}
|
||||
|
||||
void Button_IntrHandler(unsigned char button_state)
|
||||
{
|
||||
if (chooseFlag)
|
||||
{
|
||||
if (button_state & 0b1)
|
||||
{
|
||||
delay_time++;
|
||||
|
||||
if (delay_time > 20)
|
||||
{
|
||||
delay_time = 20;
|
||||
}
|
||||
printf("button1\n");
|
||||
RegWrite(0xbf20f00c,0x1);//clr
|
||||
|
||||
}else if (button_state & 0b1000)
|
||||
{
|
||||
delay_time--;
|
||||
if (delay_time < 1)
|
||||
{
|
||||
delay_time = 1;
|
||||
}
|
||||
printf("button4\n");
|
||||
RegWrite(0xbf20f00c,0x8);//clr
|
||||
}else if (button_state & 0b100)
|
||||
{
|
||||
flag = 0;
|
||||
printf("button3\n");
|
||||
RegWrite(0xbf20f00c,0x4);//clr
|
||||
}else{
|
||||
printf("button2\n");
|
||||
RegWrite(0xbf20f00c,0x2);//clr
|
||||
}
|
||||
|
||||
setSegNum(1,delay_time/10,1,delay_time%10);
|
||||
|
||||
}
|
||||
|
||||
if (!chooseFlag)
|
||||
{
|
||||
|
||||
if (button_state & 0b1)
|
||||
{
|
||||
Plane_x += Plane_dx;
|
||||
if (Plane_x + Plane_l > 800)
|
||||
{
|
||||
Plane_x = 800 - Plane_l;
|
||||
}
|
||||
RegWrite(0xbf20f00c,0x1);//clr
|
||||
}else if (button_state & 0b1000)
|
||||
{
|
||||
Plane_x -= Plane_dx;
|
||||
if (Plane_x - Plane_l < 0)
|
||||
{
|
||||
Plane_x = Plane_l;
|
||||
}
|
||||
RegWrite(0xbf20f00c,0x8);//clr
|
||||
}else if (button_state & 0b0100){
|
||||
RegWrite(0xbf20f00c,0x4);//clr
|
||||
}else if (button_state & 0b0010){
|
||||
RegWrite(0xbf20f00c,0x2);//clr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void showGameOver(void)
|
||||
{
|
||||
|
||||
printf("GameOver\n");
|
||||
|
||||
while (1)
|
||||
{
|
||||
setLedPin(0b1000000000000001);delay_ms(50);
|
||||
setLedPin(0b1100000000000011);delay_ms(50);
|
||||
setLedPin(0b1110000000000111);delay_ms(50);
|
||||
setLedPin(0b1111000000001111);delay_ms(50);
|
||||
setLedPin(0b1111100000011111);delay_ms(50);
|
||||
setLedPin(0b1111110000111111);delay_ms(50);
|
||||
setLedPin(0b1111111001111111);delay_ms(50);
|
||||
setLedPin(0b1111111111111111);delay_ms(50);
|
||||
setLedPin(0b1111111001111111);delay_ms(50);
|
||||
setLedPin(0b1111110000111111);delay_ms(50);
|
||||
setLedPin(0b1111100000011111);delay_ms(50);
|
||||
setLedPin(0b1111000000001111);delay_ms(50);
|
||||
setLedPin(0b1110000000000111);delay_ms(50);
|
||||
setLedPin(0b1100000000000011);delay_ms(50);
|
||||
setLedPin(0b1000000000000001);delay_ms(50);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user