HUNAN UNIVERSITY
创新设计
(大作业)报告
课程名称: 电子系统设计与创新基础训练
实验项目名称: 坦克大战游戏
专 业 班 级: 通信工程1901
姓 名: 吴华
学 号: 201908030121
指 导 教 师: 骆坚
选题时间: 2021 年9月 8日
项目设计时间:2021 年9月 8日 至 2021 年9月 14日
报告完成时间:2021 年9月 15日
目录
1 设计概述 3
1.1设计目的 3
1.2设计任务 3
1.3设计要求 3
2 总体方案设计 4
3 实验过程与测试 7
4 设计总结与心得 9
4.1 设计总结 9
4.1设计心得 10
题目: 坦克大战游戏
------基于BSP完成
1、项目概述
在我小时候流行一款名叫“小霸王”的小游戏机,里面的有一款游戏叫坦克大战让我印象深刻,一直想重温这个小游戏。这次实验项目采用的STC-B学习板制作,我发现上面的八位数码管似乎可以完成我的这个想法,也就是利用八位数码管作为显示屏完成这个坦克大战小游戏的制作。设计预想是设置进攻方与防守方两辆坦克,而八位数码管可以提供3条弹道作为炮弹发射的轨道,双方坦克都应该能够进行上下位移进行闪避。
另外,由于设置了进攻与防守两方,为了显示区别,也为了充分利用显示空间,我的想法就是设置一方可以进行上下与前后移动,发炮为手动控制,为进攻方;另一方只能进行上下位移,但是可以完成自动发炮,此为防守方。
1.1设计目的
在对小学期学习内容进行实际运用的同时,完成对童年记忆游戏的重温,希望设计出一款可以与当年小游戏机上面的坦克大战类似的游戏,引进音效以及增加移动与闪避功能,并且也可以记录实时得分与暂停游戏。
1.2设计任务
基于课程群中发出的DEMO文件,也就是基于BSP制作,在原有代码框架下,删除与我本次实验项目无关的部分功能和模块,同时根据我的需要,对原有函数进行必要改写,如八位数码管的译码表decode_table[],如用于显示的dealwithDisp()函数等等,我需要调用到包括导航键在内的全部按键,因此需要对可能用到的按键进行功能编写,并且将冲突的部分删除。
1.3设计要求
1)由于炮弹的轨迹必须可见,并且按固定的速度向前发射,所以要对其进行时间上的回调,并且场上可以同时存在3条弹道的炮弹,因此需要对每一类型的炮弹进行分类;
2)同一弹道上的两枚炮弹相遇就会引爆,也要分情况讨论;
3)而不同弹道上面的炮弹互不影响,相遇后仍然可以正常向原有方向前进;
4)防守方坦克Tank1需要完成自动发炮
5)进攻方坦克Tank2发炮后仍然可以前后位移
6)双方坦克均可以对来自上下两个方向到来的敌方炮弹进行“闪避”,需要显示出炮弹与坦克擦肩而过的瞬间状态
7)击中对方坦克可以计分,用LED二极管进行临时计分可以供游戏过程中实时查看,另外还要设置暂停功能,按下某个按键可以暂停游戏,并且可以在数码管上以阿拉伯数字表示双方得分,此外,还要设置一个按键回到游戏
8)游戏音效设计,炮弹与炮弹相遇会引爆,炮弹击中对方坦克也会引爆,此外,先得3分的一方设置为获胜方,游戏结束后播放专属音乐
2、总体方案设计
首先是关于导航按键,它用于控制进攻方坦克Tank2的前后上下移动,其中导航键的enter键进行Tank2的发炮动作;
我这里设置Key3按键对防守方坦克Tank1进行上下的位移,并且在位移动作的同时向前发射出一枚炮弹;
Key1按键我设置为查看当前得分,按下key1可以中断当前游戏,查看得分,key2按键则是返回游戏并对双方状态进行初始化,但并不改变双方得分;
关于数码管的译码表,我根据我的需要进行了添加,加入了我的坦克状态,炮弹状态,炮弹与坦克的叠加态等;
因为我的炮弹都是分类写的,每一枚炮弹之间互不影响,所以理论上场上是可以同时存在6枚炮弹,但是实际上由于数码管长度太短,而每一发炮弹需要占用一个格子,炮弹与炮弹之间也要有间隔,所以在操作时只能同时有4枚炮弹在显示屏上;
整体思路肯定是基于1S的时间回调函数去做,炮弹的自动前进与状态改变,还有弹道的区别都要分情况讨论,同时,在炮弹命中对方坦克后,发射炮弹的一方会得一分,以二进制的方式显示在LED二极管上,前4位为Tank1的得分,后4位为Tank2的得分,按下key1键可以中断游戏并且在数码管上查看实时分数;
关于坦克闪避炮弹的二者“擦肩而过”的状态也要添加,同样基于现有的1S时间回调函数,进行2S的刷新回调用于显示这个叠加态;
音效的加入,我选择了频率1350,时长100ms的短促音效作为炮弹引爆的声音,此外我还调用了上半学期自己编写的一段乐曲《old memory》作为获胜时的背景音乐;
3、 实验过程与测试
1) 炮弹与炮弹相遇引爆
因为我用的是全局的数组,所以我会在炮弹行进过程中进行一次判断,若前进方向的下一个数值与当前数值相同(即炮弹类型相同)则两枚炮弹均被引爆置零,显示为空
2)不同弹道炮弹相遇
在炮弹行进过程中进行判断,若前进方向的下一个数值与当前数值不同(即炮弹类型不同或前方净空)
则令两个数值进行交换,这就完成了炮弹的前进工作
3)同一坦克发射多枚炮弹
按照我的设计思路,一条弹道上面不允许同时存在两枚同一坦克发射的炮弹,这个设计是因为显示空间实在有限,如果在当前炮弹还未引爆前再次发射同一类型炮弹,那么前一枚炮弹将会停留在原地。当然,游戏过程中可以利用这一特性进行“防御”,这一停留在场上的炮弹会变成“屏障”,无论哪一方的炮弹击中都会引爆。
虽然不能在同一弹道发射多枚炮弹,但是可以“打一炮换一个阵地”,连续打出3枚炮弹,对方将会难于应付,很难全部挡下或闪避。
4)闪避
坦克本身是占满数码管的纵向两格的,如一个横向的大写字母T,但可以通过上下位移将一部分车身“躲起来”,这样就意味着可以闪避上下两个方向飞来的敌方炮弹(也就是说中间飞来的炮弹只能通过发射炮弹进行拦截)。
在数码管的译码表我添加了4个闪避状态,并且在判断到闪避现象发生的情况下送出一个判断值,用于对坦克与炮弹在一个数码管内“擦肩而过”的暂态的显示,这时候需要用上一个“2S的时间回调函数”,
这里就是利用原有1S时间回调函数对一个变量进行+1操作,判断能否被2整除即可。
5)计分
设置两个全局变量lc与rc,分别记录双方得分,由于用到LED二极管显示,所以分前四位与后四位,
Tank1每次击中lc自加16,Tank2每次击中lc自加1,将lc与rc相加 表示为LedPrint(lc+rc)即可同时显示双方得分。
按下key1查看分数时,调用一个函数将lc与rc代表的实际得分显示在数码管上即可。
6)音效
炮击音效为频率1350,时长100ms的短促声音,直接使用SetBeep(1350,10);
一方获胜后,播放背景音乐《old memory》,这是上半学期自己编写的一段乐曲,改写入原DEMO的song.c文件中,因此我可以直接调用。
7)关于Tank2的“闪回”的加入
在实际游戏过程中,我发现按键的响应常常不够及时,常常Tank2还没来得及后退就被击中了,于是我决定把导航右键设置为“闪回”键,可以理解为一个极限闪避,按下一次即可直达数码管最右侧也就是d7位置,最大限度保证进攻方Tank2的安全,增加了游戏的可玩性。
4、 设计总结与心得
4.1设计总结
我个人很乐观地认为我已经完成了实验预期目标,这个坦克大战小游戏是完全可玩的,炮弹的相遇引爆,炮弹的击中效果已经坦克对炮弹的闪避,这些是原本游戏的规则,其实也就是最基础的规则,在此之外,我设置的进攻方与防守方概念是因为受限于数码管长度而做的变通,让一方不能左右移动,可以减少空间浪费,让进攻方Tank2拥有更多的空间发挥,为此我给防守方Tank1增加“自动发炮”的技能,算是让游戏变得相对公平。
但因为Tank1的“自动发炮”可以做到极限防御,并且体验后发现导航键不够灵敏,导致在游戏过程中进攻方Tank2常常因为后撤(也就是连续按导航Right键)不及时导致被击中,为此我冒出给Tank2增加“闪回”键的想法,只需要按一次Right键就能回到初始最右点,极大地提高了Tank2的生存能力。
暂停功能的设置其实一开始并没有,我使用Key1按键是为了查看准确的得分(LED虽然也在实时显示但毕竟是二进制不好看),但其实看得分的时候游戏就是中断状态,我一想干脆就做成key2恢复初始状态算了,这样当场面上出现大量敌方炮弹自己不能拦截或闪躲的情况下,可以通过按key1与key2进行一次初始化,这大概算一个作弊功能,但我认为为了游戏的进行(也为了同学的心情)应该加入的功能,这样游戏可以玩得更久也更快乐。我本来设置先得15分一方胜利,因为4位二进制的LED最多能显示15,但实际上很难打到15分,大概就是因为我加入了这些奇奇怪怪的功能吧,为此我最后把游戏规则改为先得3分胜利。
4.2设计心得
1) 我是基于给的DEMO进行改写,进行了大量删除工作,因为我的炮弹就是基于1S时间回调函数才能显示炮弹轨迹,但一开始不熟悉回调的含义,我把发射炮弹这个事件写成函数,再在my1S_callback()的里面调用,导致了各种奇奇怪怪的乱码,其实就是炮弹自己已经在走了,通过请教同学以及查看源文件代码,我发现了这个问题,于是把所有关于炮弹的情况都写进my1S_callback()里面,我在外面改变某一全局变量的值,然后引起my1S_callback() 内关于这种情况的反映,这就解决了困扰多天的乱码bug问题。同学间的讨论也帮助我解决了很多问题。
2) 学会变通也是这次实验给我的一个收获:
数码管长度有限,那就让Tank1不能左右移动;
Tank1不能左右移动似乎不公平,那就给它加上一个“自动发炮”技能;
连续按导航Right键不能快速反应,那就新增“闪回”功能;
多枚炮弹打来拦不住又不想输,那就给一个“作弊”的机会吧。
3)充分利用材料,我在这个游戏里面把能用上的模块都用上了,数码管、LED、3个key以及5个导航按键,如果数码管长度够以及还有空余按键,或许我想加上2枚炮弹的连发,或者双弹道同时发射炮弹这种技能,实际上我的这个小游戏已经比小时候玩的“坦克大战”功能丰富了。
main.c部分
#include "main.H" //±ØÐë¡£±àдӦÓóÌÐòʱ£¬½öÐè¸Äд main.h ºÍ main.cÎļþ
#include "song.c" //¾ÙÀý¡£song.cÖбàдÁËÒôÀÖ£¨Í¬Ò»Ê׸裩±àÂë
#include "music.h"
struct_ADC ADCresult; //¾ÙÀý¡£ ÈÈÃô¡¢¹âÃô²âÁ¿ADÖµ
unsigned char Music_tone,Music_PM; //¾ÙÀý¡£ ÒôÀÖ²¥·ÅÒôµ÷¡¢½Ú´Õ£¨Ã¿·ÖÖÓ½ÚÅÄÊý£©
unsigned char rxd[8]; //¾ÙÀý¡£Í¨ÐÅ£¨´®¿Ú1¡¢´®¿Ú2¡¢ºìÍâ¹²Óã©»º³åÇø8×Ö½Ú
unsigned char rxdhead[2]={0xAA,0x55}; //¾ÙÀý¡£Í¨ÐÅ£¨´®¿Ú1¡¢´®¿Ú2£©½ÓÊÕ°üÍ·Æ¥Åä×Ö·û2×Ö½Ú£º£¨0xzu[3]£¬0x55£©
unsigned char Tank1=0;
unsigned char Tank2=3;
int q,ll;int w=1;
unsigned char plm=0;
unsigned char pl[6]={0,0,0,0,0,0};
unsigned char key[6]={0,0,0,0,0,0};
unsigned char paodan[6]={9,9,9,9,9,9};//ÅÚµ¯µÄϱê
unsigned char zu[6]={0,0,0,0,0,0}; //ϱê´úÊý
unsigned char flag[6]={1,1,1,1,1,1}; //6¸öÅжÏÖµ
unsigned char t[8]={0,16,16,16,16,16,16,3};
unsigned char lc=0,rc=0;
/*
unsigned char funcmode; //¾ÙÀý¡£¶¨ÒåÏÔʾ¡¢°´¼ü¹¦ÄÜģʽ
enum funcname {
Tank_Battle=1,
Rt_Rop, // ÈÈÃô¹âÃô²âÁ¿
Music, // ÒôÀÖ²¥·Å
FMradio, // FMÊÕÒô»ú
UltroSonic, // ³¬Éù²¨²â¾à
Weight}; // µç×Ó³Ó
unsigned char tempadj; //¾ÙÀý¡£³ÌÐò±äÁ¿¡£µ÷ÕûʱÖÓʱÓãº=1 µ÷Äê»òʱ£»=2 µ÷Ô»ò·Ö =3 µ÷ÈÕ »òÃë
*/
//******* Óû§³ÌÐò¶Î4£ºÓû§×Ô¶¨Ò庯ÊýÔÐÍ *************//
#include "function.c"
void myUart1Rxd_callback() //¾ÙÀý¡£´®¿Ú1ÊÕµ½ºÏ·¨Êý¾Ý°ü»Øµ÷º¯Êý¡££¨ºÏ·¨Êý¾Ý°ü£ºzu[3]£¬55£¬......¡£¹²8×Ö½Ú£©
{ if ( GetUart2TxStatus() == enumUart2TxFree )
{ (*(rxd+6)) += 1; //µÚ7×Ö½Ú¼Ó1
Uart2Print(&rxd, sizeof(rxd)); //½«Êý¾Ý°ü´Ó´®¿Ú2(485¡¢»òEXTÀ©Õ¹½Ó¿ÚÉÏ)·¢ËͳöÈ¥
}
}
void myUart2Rxd_callback() //¾ÙÀý¡£´®¿Ú2ÊÕµ½ºÏ·¨Êý¾Ý°ü»Øµ÷º¯Êý¡££¨ºÏ·¨Êý¾Ý°ü£ºzu[3]£¬55£¬......¡£¹²8×Ö½Ú£©
{ if ( GetIrStatus() == enumIrFree )
{ (*(rxd+6)) += 2; //µÚ7×Ö½Ú¼Ó2
IrPrint(&rxd, sizeof(rxd)); //½«Êý¾Ý°ü´ÓºìÍâ·¢ËͳöÈ¥
}
}
void my1mS_callback() //¾ÙÀý¡£1mSʼþ»Øµ÷º¯Êý
{
}
void my10mS_callback() //¾ÙÀý¡£10mSʼþ»Øµ÷º¯Êý
{ dealwithDisp();
}
void my100mS_callback() //¾ÙÀý¡£100mSʼþ»Øµ÷º¯Êý
{
}
void my1S_callback() //¾ÙÀý¡£1Sʼþ»Øµ÷º¯Êý
{
LedPrint(lc+rc); //LED¼Ç¼µÃ·Ö
if(flag[0]==0){//×óÖз¢Éä
zu[0]=paodan[0];paodan[0]++;
if(t[zu[0]+1]==Tank2){Tank2=14;t[zu[0]+1]=14;t[zu[0]]=16;flag[0]=1;lc=lc+16;SetBeep(1350,10);}//ÃüÖÐ ÓÒ±ß̹¿Ë
else if(t[zu[0]+1]==t[zu[0]]) {t[zu[0]]=16;t[zu[0]+1]=16; flag[0]=1;} //ÅÚµ¯ÏàÓö
else if(t[zu[0]+1]==16){pl[0]=t[zu[0]+1];t[zu[0]+1]=t[zu[0]];t[zu[0]]=pl[0]; flag[0]=0;}//ÅÚµ¯Î´ÏàÓö»òÅÚµ¯ÀàÐͲ»Í¬
}
if(flag[1]==0){//×óÉÏ·¢Éä
zu[1]=paodan[1];paodan[1]++;
if(t[zu[1]+1]==Tank2&&Tank2==5){Tank2=25;t[zu[1]+1]=25;key[1]=zu[1]+1;t[zu[1]]=16;flag[1]=1;}// ÓÒ±ß̹¿Ë¶ã±ÜÅÚµ¯
else if(t[zu[1]+1]==Tank2){Tank2=14;t[zu[1]+1]=14;t[zu[1]]=16;flag[1]=1;lc=lc+16;SetBeep(1350,10);}//ÃüÖÐ ÓÒ±ß̹¿Ë
else if(t[zu[1]+1]==t[zu[1]]) {t[zu[1]]=16;t[zu[1]+1]=16; flag[1]=1;} //ÅÚµ¯ÏàÓö
else if(zu[1]+1>=8){t[zu[1]]=16;}
else if(t[zu[1]+1]==16){pl[1]=t[zu[1]+1];t[zu[1]+1]=t[zu[1]];t[zu[1]]=pl[1]; flag[1]=0;}//ÅÚµ¯Î´ÏàÓö»òÅÚµ¯ÀàÐͲ»Í¬
}
if(flag[2]==0){//×óÏ·¢Éä
zu[2]=paodan[2];paodan[2]++;
if(t[zu[2]+1]==Tank2&&Tank2==4){Tank2=26;t[zu[2]+1]=26;key[2]=zu[2]+1;t[zu[2]]=16;flag[2]=1;}// ÓÒ±ß̹¿Ë¶ã±ÜÅÚµ¯
else if(t[zu[2]+1]==Tank2){Tank2=14;t[zu[2]+1]=14;t[zu[2]]=16;flag[2]=1;lc=lc+16;SetBeep(1350,10);}//ÃüÖÐ ÓÒ±ß̹¿Ë
else if(t[zu[2]+1]==t[zu[2]]) {t[zu[2]]=16;t[zu[2]+1]=16; flag[2]=1;} //ÅÚµ¯ÏàÓö
else if(zu[2]+1>=8){t[zu[2]]=16;}
else if(t[zu[2]+1]==16){pl[2]=t[zu[2]+1];t[zu[2]+1]=t[zu[2]];t[zu[2]]=pl[2]; flag[2]=0;}//ÅÚµ¯Î´ÏàÓö»òÅÚµ¯ÀàÐͲ»Í¬
}
if(flag[3]==0){//ÓÒÏ·¢Éä
zu[3]=paodan[3];paodan[3]--;
if(t[zu[3]-1]==Tank1&&Tank1==1){Tank1=24;t[0]=24;t[1]=16;key[3]=1;flag[3]=1;}//×ó±ß̹¿Ë¶ã±ÜÅÚµ¯
else if(t[zu[3]-1]==Tank1){Tank1=14;t[zu[3]-1]=14;t[zu[3]]=16;flag[3]=1;rc=rc+1;SetBeep(1350,10);}//ÃüÖÐ ×ó±ß̹¿Ë
else if(t[zu[3]-1]==t[zu[3]]){t[zu[3]-1]=16;t[zu[3]]=16;flag[3]=1;SetBeep(1350,10);}//Á½·¢ÅÚµ¯ÏàÓöÒý±¬£¬·µ»ØÒ»¸öÅжÏÖµ
else if(t[zu[3]-1]!=t[zu[3]]){pl[3]=t[zu[3]-1];t[zu[3]-1]=t[zu[3]];t[zu[3]]=pl[3];flag[3]=0;}//ÅÚµ¯Î´ÏàÓö
}
if(flag[4]==0){//ÓÒÉÏ·¢Éä
zu[4]=paodan[4];paodan[4]--;
if(t[zu[4]-1]==Tank1&&Tank1==2){Tank1=23;t[zu[4]-1]=23;t[zu[4]]=16;key[4]=1;flag[4]=1;}//×ó±ß̹¿Ë¶ã±ÜÅÚµ¯
else if(t[zu[4]-1]==Tank1){Tank1=14;t[zu[4]-1]=14;t[zu[4]]=16;flag[4]=1;rc=rc+1;SetBeep(1350,10);}//ÃüÖÐ ×ó±ß̹¿Ë
else if(t[zu[4]-1]==t[zu[4]]){t[zu[4]-1]=16;t[zu[4]]=16;flag[4]=1;SetBeep(1350,10);}//Á½·¢ÅÚµ¯ÏàÓöÒý±¬£¬·µ»ØÒ»¸öÅжÏÖµ
else if(t[zu[4]-1]!=t[zu[4]]){pl[4]=t[zu[4]-1];t[zu[4]-1]=t[zu[4]];t[zu[4]]=pl[4];flag[4]=0;}//ÅÚµ¯Î´ÏàÓö
}
if(flag[5]==0){//ÓÒÖз¢Éä //ÏÂ17 ÖÐ18 ÉÏ19 ÉÏÖÐ20 ÉÏÏÂ21 ÖÐÏÂ22
zu[5]=paodan[5];paodan[5]--;
if(t[zu[5]-1]==Tank1){Tank1=14;t[0]=14;t[zu[5]]=16;flag[5]=1;rc=rc+1; SetBeep(1350,10);} //ÃüÖÐ ×ó±ß̹¿Ë
else if(t[zu[5]-1]==t[zu[5]]){t[zu[5]-1]=16;t[zu[5]]=16;flag[5]=1;SetBeep(1350,10);}//Á½·¢ÅÚµ¯ÏàÓöÒý±¬£¬·µ»ØÒ»¸öÅжÏÖµ
else if(t[zu[5]-1]!=t[zu[5]]){pl[5]=t[zu[5]-1];t[zu[5]-1]=t[zu[5]];t[zu[5]]=pl[5];flag[5]=0;}//ÅÚµ¯Î´ÏàÓö
}
plm++;
if(plm%2==0)//Tank¶ã±ÜÅÚµ¯µÄ״̬ÏÔʾ
{ if(key[4]!=0){Tank1=2;t[0]=2;key[4]=0;}
if(key[3]!=0){Tank1=1;t[0]=1;key[3]=0;}
if(key[2]!=0){Tank2=4;t[key[2]]=4;paodan[2]=key[2]+1;t[key[2]+1]=17;flag[2]=0;key[2]=0;}
if(key[1]!=0){Tank2=5;t[key[1]]=5;paodan[1]=key[1]+1;t[key[1]+1]=19;flag[1]=0;key[1]=0;}}
}
void myADC_callback() //¾ÙÀý¡£ADCʼþ»Øµ÷º¯Êý
{
}
void myKN_callback() //¾ÙÀý¡£µ¼º½°´¼üʼþ»Øµ÷º¯Êý
{ dealwithmyKN();
}
void myhall_callback() //ʾÀý¡£ÓÐhallʼþ»Øµ÷º¯Êý£º·¢Éù±¨¾¯
{ if(GetHallAct() == enumHallGetClose) SetBeep(1350,100);
}
void mykey_callback() // °´¼ü£¨Key1¡¢Key2£©Ê¼þ»Øµ÷º¯Êý
{ dealwithmykey();
}
void mySV_callback() //ʾÀý: Õñ¶¯Ê¼þ»Øµ÷º¯Êý£º¿ØÖÆÒôÀÖ²¥·Å/ÔÝÍ£
{ if(GetVibAct())
if (GetPlayerMode() == enumModePause) SetPlayerMode(enumModePlay);
else SetPlayerMode(enumModePause);
}
//******* main()º¯Êý *************//
void main() { //Ö÷º¯Êý main() ¿ªÊ¼ //´ËÐбØÐ룡£¡£¡
Key_Init(); //¾ÙÀý£¬ÐèÒªÓõ½µÄÄ£¿é¼°Æ亯Êý¡¢·½·¨£¬±ØÐë¶ÔÆä³õʼ»¯£¨ÈÃÆä×¼±¸¡¢¾ÍÐ÷ºÍÏìÓ¦×öºǫ́·þÎñ£©
HallInit(); //¾ÙÀý
VibInit(); //¾ÙÀý
DisplayerInit(); //¾ÙÀý
BeepInit(); //¾ÙÀý
MusicPlayerInit(); //¾ÙÀý
AdcInit(ADCexpEXT); //¾ÙÀý£¬ADCÄ£¿é³õʼ»¯£¬ÓвÎÊý£¬Ñ¡ÔñÀ©Õ¹½Ó¿ÚEXTÉÏP1.0¡¢P1.1ÊÇ·ñÒ²×öADC¹¦ÄÜ
IrInit(NEC_R05d); //¾ÙÀý£¬ºìÍâ½Ó¿ÚÉèÖÃ
Uart1Init(1200); //¾ÙÀý£¬´®¿Ú1³õʼ»¯£¬ÓвÎÊý£¬ÉèÖÃUart1ͨÐŲ¨ÌØÂÊ
/******* ÒÔÏ¿É2Ñ¡1£º¼ÓÔØ´®¿Ú2 ********/
Uart2Init(2400,Uart2Usedfor485); //¾ÙÀý£¬´®¿Ú2³õʼ»¯µ½485½Ó¿Ú£¨RS485¹¤ÒµÏÖ³¡×ÜÏߣ¬°ëË«¹¤£©
//2,ÉèÖÃʼþ»Øµ÷º¯Êý(ÓÉsysÌṩÉèÖú¯ÊýSetEventCallBack())
SetEventCallBack(enumEventKey, mykey_callback); //¾ÙÀý
SetEventCallBack(enumEventSys1mS, my1mS_callback); //¾ÙÀý
SetEventCallBack(enumEventSys10mS, my10mS_callback); //¾ÙÀý
SetEventCallBack(enumEventSys100mS, my100mS_callback); //¾ÙÀý
SetEventCallBack(enumEventSys1S, my1S_callback); //¾ÙÀý
SetEventCallBack(enumEventHall, myhall_callback); //¾ÙÀý
SetEventCallBack(enumEventVib, mySV_callback); //¾ÙÀý
SetEventCallBack(enumEventNav, myKN_callback); //¾ÙÀý£¬ÉèÖõ¼º½°´¼ü»Øµ÷º¯Êý
SetEventCallBack(enumEventUart1Rxd, myUart1Rxd_callback); //¾ÙÀý£¬ÉèÖô®¿Ú1½ÓÊջص÷º¯Êý
SetEventCallBack(enumEventUart2Rxd, myUart2Rxd_callback); //¾ÙÀý£¬ÉèÖô®¿Ú2½ÓÊջص÷º¯Êý
SetEventCallBack(enumEventXADC,myADC_callback); //À©Õ¹½Ó¿ÚÉÏеÄADֵʼþ
//3,Óû§³ÌÐò״̬³õʼ»¯
SetDisplayerArea(0,7); //¾ÙÀý
SetUart1Rxd(&rxd, sizeof(rxd), rxdhead, sizeof(rxdhead)); //ÉèÖô®¿Ú½ÓÊÕ·½Ê½£ºÊý¾Ý°üÌõ¼þ£º½ÓÊÕÊý¾Ý°ü·ÅÖÃÔÚrxdÖУ¬Êý¾Ý°ü´óСrxd´óС£¬Êý¾Ý°üÍ·ÐèÒªÓërxdheadÆ¥Å䣬ƥÅäÊýÁ¿rxdhead´óС
SetUart2Rxd(&rxd, sizeof(rxd), rxdhead, sizeof(rxdhead));
SetIrRxd(&rxd); //¾ÙÀý
LedPrint(0);
/***************** MySTC_OS ³õʼ»¯Óë¼ÓÔØ¿ªÊ¼ ********************************/
MySTC_Init(); // MySTC_OS ³õʼ»¯ //´ËÐбØÐ룡£¡£¡
while(1) // ϵͳÖ÷Ñ»· //´ËÐбØÐ룡£¡£¡
{ MySTC_OS(); // MySTC_OS ¼ÓÔØ //´ËÐбØÐ룡£¡£¡
if(lc==48||rc==3){SetMusic(Music_PM, Music_tone, &song, sizeof(song), enumMscNull);
SetPlayerMode(enumModePlay);}
if(lc==48||rc==3){lost();}
} //Ö÷Ñ»·while(1)½áÊø //´ËÐбØÐ룡£¡£¡
} //Ö÷º¯Êý main() ½áÊø //´ËÐбØÐ룡£¡£¡
function.c部分
void dealwithDisp(){ Seg7Print(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7]);}
void lost(){t[0]=(lc/16)/10+6;t[1]=(lc/16)%10+6;//¼ÆËãË«·½µÃ·Ö
t[2]=18;t[3]=18;t[4]=18;t[5]=18;t[6]=rc/10+6;t[7]=rc%10+6;}
void dealwithmyKN()
{
if(GetAdcNavAct(enumAdcNavKey3) == enumKeyPress) //°´¼ü3¿ØÖÆ×ó±ß£¬Í¬Ê±×Ô¶¯·¢ÅÚ
{
if((Tank1++)>=2)Tank1=0;t[0]=Tank1;
if(t[0]==0){paodan[0]=1;t[1]=18;flag[0]=0;
}
if(t[0]==1){paodan[1]=1;t[1]=19;flag[1]=0;
}
if(t[0]==2){paodan[2]=1;t[1]=17;flag[2]=0;
}
}
if(GetAdcNavAct(enumAdcNavKeyUp)== enumKeyPress) {
//µ¼º½¼üÉÏÏ¿ØÖÆTank2ÉÏÏÂλÒÆ
for(q=0;q<8;q++){ if(Tank2==t[q]){
if((Tank2++) >=5) Tank2 =3;
t[q]=Tank2;dealwithDisp();}}}
if(GetAdcNavAct(enumAdcNavKeyDown)== enumKeyPress) {
for(q=0;q<8;q++){ if(Tank2==t[q]){
if((Tank2--) <=3) Tank2 =5;
t[q]=Tank2;dealwithDisp();}}}
if(GetAdcNavAct(enumAdcNavKeyRight) == enumKeyPress){
//µ¼º½¼ü×óÓÒ¿ØÖÆÇ°ºóλÒÆ£¬ÉèÖÃRightΪÉÁ»Ø¼ü£¬¿ÉÒÔÒ»¼ü»Øµ½×îÓÒλÖÃ
for(q=0;q<8;q++){ ll=q; if(Tank2==t[q]&&(q>=2&&q<=7)){
if((ll++) >=7) ll =7;
t[ll]=Tank2;if(ll!=q)t[q]=16;dealwithDisp();}}}
if(GetAdcNavAct(enumAdcNavKeyLeft) == enumKeyPress){
q=0;for(;q<8;q++){ ll=q; if(Tank2==t[q]&&(q>=2&&q<=7)){
if((ll--)<=2) ll =2;
t[ll]=Tank2;if(ll!=q)t[q]=16;dealwithDisp();}}}
if(GetAdcNavAct(enumAdcNavKeyCenter)== enumKeyPress)//µ¼º½ÖÐÐÄ°´¼ü¿ØÖÆÓұ߷¢ÅÚ
{ w=1;
if(Tank2==3)
for(;w<8;w++)
if(t[w]==Tank2){t[w-1]=18;paodan[5]=w-1;flag[5]=0;}
if(Tank2==4)
for(;w<8;w++)
if(t[w]==Tank2){t[w-1]=19;paodan[4]=w-1;flag[4]=0;}
if(Tank2==5)
for(;w<8;w++)
if(t[w]==Tank2){t[w-1]=17;paodan[3]=w-1;flag[3]=0;}
}
}
void dealwithmykey()
{
if (GetKeyAct(enumKey1)== enumKeyPress) //²é¿´µÃ·Ö
{
lost();
}
if (GetKeyAct(enumKey2)== enumKeyPress) //»Ö¸´ÓÎÏ·
{
Tank1=0;Tank2=3; plm=0;
pl[0]=0;pl[1]=0;pl[2]=0;pl[3]=0;pl[4]=0;pl[5]=0;
key[0]=0;key[1]=0;key[2]=0;key[3]=0;key[4]=0;key[5]=0;
paodan[0]=9;paodan[1]=9;paodan[2]=9;
paodan[3]=9;paodan[4]=9;paodan[5]=9;
zu[0]=0;zu[1]=0;zu[2]=0;zu[3]=0;zu[4]=0;zu[5]=0;
flag[0]=1;flag[1]=1;flag[2]=1;flag[3]=1;flag[4]=1;flag[5]=1;
t[0]=0;t[1]=16;t[2]=16;t[3]=16;t[4]=16;t[5]=16;t[6]=16;t[7]=3;
paodan[0]=1;t[1]=18;flag[0]=0;
}
}
添加链接描述