一、功能简介
本项目使用STM32F103C8T6单片机控制器,使用8*8LED点阵模块、按键、LED等。
主要功能:
系统运行后,弹弹球开始以默认速度运行,可通过K1、K3键控制球拍移动,支持连按操作。
游戏过程中还可通过K2键调节弹球运行速度,游戏过程中可按下K4键暂停或开始,处于暂停状态时,
D1指示灯闪烁,当游戏结束后,D1指示灯亮。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//球方向控制
void ball_dir_control(void)
{
if(ball_struct.flag)//控制球的运行速度
{
ball_struct.flag=0;
draw_ball(0);//消除之前球的位置
//球运行方向控制、碰到墙壁控制
switch(ball_struct.ball.dir)
{
case BALL_DIR_FOUR:
ball_struct.ball.x+=1;
ball_struct.ball.y+=1;
//碰到右墙壁
if(ball_struct.ball.x==LEDDZ_WIDTH-1)ball_struct.ball.dir=BALL_DIR_THREE;
break;
case BALL_DIR_THREE:
ball_struct.ball.x-=1;
ball_struct.ball.y+=1;
//碰到左墙壁
if(ball_struct.ball.x==0)ball_struct.ball.dir=BALL_DIR_FOUR;
break;
case BALL_DIR_TWO:
ball_struct.ball.x-=1;
ball_struct.ball.y-=1;
//碰到左上角起点位置
if(ball_struct.ball.x==0&&ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_FOUR;
//碰到左墙壁
else if(ball_struct.ball.x==0)ball_struct.ball.dir=BALL_DIR_ONE;
//碰到上墙壁
else if(ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_THREE;
break;
case BALL_DIR_ONE:
ball_struct.ball.x+=1;
ball_struct.ball.y-=1;
//碰到右上角起点位置
if(ball_struct.ball.x==LEDDZ_WIDTH-1&&ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_THREE;
//碰到上墙壁
else if(ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_FOUR;
//碰到右墙壁
else if(ball_struct.ball.x==LEDDZ_WIDTH-1)ball_struct.ball.dir=BALL_DIR_TWO;
break;
}
draw_ball(1);//显示新球的位置
//判断球拍是否接到球
if(ball_struct.ball.y==ball_struct.bat.y-1)
{
//球拍接到球
if(ball_struct.ball.x>=ball_struct.bat.x && ball_struct.ball.x<=ball_struct.bat.x+ball_struct.bat.len-1)
{
ball_struct.score+=GET_SCORE_RATIO;//得分
if(ball_struct.score>=100)ball_struct.score=0;
if(ball_struct.ball.dir==BALL_DIR_FOUR)
ball_struct.ball.dir=BALL_DIR_ONE;
else if(ball_struct.ball.dir==BALL_DIR_THREE)
ball_struct.ball.dir=BALL_DIR_TWO;
}
//球拍未接到球
else
{
ball_struct.status=3;//游戏停止状态
game_over();//游戏结束
}
}
}
}
//应用控制系统
void app_sys_ctrl_demo(void)
{
u8 key=0;
LED_Init();
USART1_Init(115200);
KEY_Init();
LEDDZ_Init();
ball_init();//参数初始化
TIM3_Init(20,36000-1);//定时10ms
TIM4_Init(20,36000-1);//定时10ms
TIM_Cmd(TIM3,ENABLE);//打开定时器
TIM_Cmd(TIM4,ENABLE);//打开定时器
while(1)
{
if(ball_struct.status==0)//运行中
{
key=KEY_Scan(0);
if(key==KEY1_PRESS)//球拍左移
{
draw_bat(0);//清除上次的球拍
if(ball_struct.bat.x>=1)
ball_struct.bat.x-=1;
}
else if(key==KEY3_PRESS)//球拍右移
{
draw_bat(0);//清除上次的球拍
if(ball_struct.bat.x<=LEDDZ_WIDTH-ball_struct.bat.len-1)
ball_struct.bat.x+=1;
}
else if(key==KEY2_PRESS)//调速
{
ball_struct.speed-=5;
if(ball_struct.speed<SPEED_HIGH)ball_struct.speed=SPEED_NORMAL;
}
else if(key==KEY4_PRESS)
{
ball_struct.status=1;
}
draw_bat(1);//绘制新球拍
draw_ball(1);//显示新球的位置
ball_dir_control();
}
else if(ball_struct.status==1)//游戏暂停状态
{
TIM_Cmd(TIM4,DISABLE);
while(1)//暂停
{
LED0=!LED0;
delay_ms(100);
if(KEY_Scan(0)==KEY4_PRESS)
{
LED0=1;
ball_struct.status=0;
TIM_Cmd(TIM4,ENABLE);
break;
}
}
}
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。