这段时间学习了LCD12864的无字库使用方法,借此设计了一个单片机跳一跳小游戏
主要功能:控制火材人跳动,判断是否跳在地板上。
不多说直接上图:
仿真原理图如下
总电图图
游戏电路图:
LED控制电路图:
蜂鸣器电路图:
总流程图:
游戏界面:
单片机源程序如下:
#include "main.h"
unsigned char BGM_choose=1;
//人物,地板的信息
/* ***************************************************** */
extern unsigned char mosaic_j1[3];
extern unsigned char mosaic_width1[3];
extern unsigned char mosaic_j2[3];
extern unsigned char mosaic_width2[3];
extern unsigned char NPC_page,NPC_column;
extern bit NPC_xuli_judge; //判断递增与递减
/* ***************************************************** */
void main()
{
unsigned char i=NOSURE;
LCD12864_winit(); //LCD12864初始化
TOOL_randInit(); //随机数初始化
BGM_init(); //BGM初始化
show_start(); //开始界面
//按键按下进入游戏
while(!KEY_Scan()==KEY0SURE);
show_youxi(); //游戏界面
//显示火材人
NPC_page=diban_fir-1;
NPC_column=mosaic_j1[show_judgewei(diban_fir)];
show_NPC(NPC_page,NPC_column,NPC_huo);
//游戏BGM
BGM_choose=2;
while(1)
{
BGM_choose=2;
if(KEY_Scan()==LONGTIME_START)
{
show_NPC(NPC_page,NPC_column,NPC_dun); //火材人蹲
if(KEY0_CLR)
{
i=LONGTIME_START;
while(i!=NOSURE)
{
if(i==KEY0_LSURE)
{
if(NPC_xuli_judge) {show_NPC_xuli(xuli_inc);} //火材人蓄力
else {show_NPC_xuli(xuli_desc);}
}
i=KEY_Scanlongtime();
}
show_NPC(NPC_page,NPC_column,NPC_disp); //火材人消失
NPC_move(); //火材人位置移动
show_NPC(NPC_page,NPC_column,NPC_huo); //火材人显示
show_NPC_xuli(xuli_disp); //火材人蓄力消失
if(!game_judge()) //游戏结束判断
{
BGM_choose=3; //BGM3
game_over(); //游戏结束显示
while(KEY_Scan()==NOSURE);
show_youxi(); //游戏界面刷新
//显示火材人
NPC_page=diban_fir-1;
NPC_column=mosaic_j1[show_judgewei(diban_fir)];
show_NPC(NPC_page,NPC_column,NPC_huo);
}
}
else {show_NPC(NPC_page,NPC_column,NPC_huo);}
}
}
}
//BGM
/* ***************************************************** */
//BGM初始化
void BGM_init()
{
TMOD=0x21; //设置定时器0 16位计数
TL0 =(-1000)%256; //设置定时初值
TH0 =(-1000)/256; //设置定时初值
EA=1;ET0=1;TR0=1;
BGM=0;BGM1=0;
}
void BGM_time0(void) interrupt 1
{
static unsigned char count=0;
if(BGM_choose==1) //游戏开始
{
TL0 =(-30000)%256; //设置定时初值
TH0 =(-30000)/256; //设置定时初值
count++;
if(count==10){BGM=0;BGM1=1;}
if(count==30){BGM=1;BGM1=0;}
if(count==38){BGM=0;BGM1=1;}
if(count==40){BGM=0;BGM1=0;}
if(count==50){BGM=0;BGM1=0;count=0;}
}
if(BGM_choose==2) //游戏
{
TL0 =(-20000)%256; //设置定时初值
TH0 =(-20000)/256; //设置定时初值
count++;
if(count==10){BGM=0;BGM1=1;}
if(count==20){BGM=1;BGM1=0;count=0;}
}
if(BGM_choose==3) //游戏结束
{
TL0 =(-50000)%256; //设置定时初值
TH0 =(-50000)/256; //设置定时初值
count++;
if(count==10){BGM=0;BGM1=1;}
if(count==20){BGM=0;BGM1=0;count=0;}
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』