这段时间学习了LCD12864的无字库使用方法,借此设计了一个单片机跳一跳小游戏
主要功能:控制火材人跳动,判断是否跳在地板上。
不多说直接上图:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
总电图图
游戏电路图:
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;}
- }
- }
复制代码
有什么BUG,欢迎大家提出,一起讨论
单片机跳一跳.rar
(2.75 MB, 下载次数: 86)
|