




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机的贪食蛇设计一题目要求:使用8051单片机和点阵显示屏实现贪吃蛇的根本功能二题目分析:1,贪吃蛇的根本功能:A,能够蛇形移动B,能够任意改变方向C,能够吃到食物并增长D,撞到四边的墙蛇死F,吃到自己蛇死E,放置新的食物2,拓展局部:A,能够过关B,在游戏开始和结束都显示一些相关把戏C,过关能显示关数D,增加串口通信功能F,增加红外遥控功能3,贪吃蛇关键算法分析:A,蛇身的形成:使用20个RAM来存储蛇身X坐标,20个RAM来存储蛇身Y坐标显示时只须将X坐标输出到行,Y坐标输出列即可B,蛇的方向:使用两个存储单元分别来存储代表方向的X坐标和Y坐标向上:X=0,Y=1向下:X=0,Y=-1向左:X=-1,Y=0向右:X=1,Y=0C,蛇的移动:只须将蛇头的X坐标和Y坐标分别与方向的X坐标和Y坐标相加原来蛇身各节的前一节X从标和Y坐标分别与后一节的X坐标和Y坐标交换即可D,吃食物:只要判断蛇头的X,Y坐标是否与食物的X,Y坐标相同,相同那么判断吃到食物,反之,没吃到食物F,吃到食物蛇增长一节:当判断为吃到食物后只须让蛇移动时多交换一次即可实现G,判断蛇是否撞墙:只要判断蛇头的X坐标或Y坐标是否等于点阵最外边时的X或Y坐标H,判断蛇是否吃到自己:只须将蛇头X,Y坐标与每一节蛇身的X,Y坐标进行比拟如果相等到那么视为吃到自己I,放置新的食物:根据游戏者控制蛇吃到食物的时间的不同而产生的坐标,是随机的食物三功能描述:开机即显示“SNAKE〞,当按下KEY5那么显示蛇的形状,再按下KEY5进入游戏,即可开始游戏,此时即可通按下KEY1,KEY2,KEY3,KEY4来控制上,下,左,右,此时按下KEY5可退出游戏,上述按键也可用红外遥控来实现.此时吃到食物即可增长一节,撞到边框即蛇死,吃到自己蛇死,死亡那么显示〞GAMEOVER〞,长到20节即过一关,并显示关数,10过完那么重新开始.四系统硬件设计:系统主原理图:五系统软件设计:A流程序图设计1,系统主流程图:2,按键子程序流程图:3,蛇移动子程序流程图:4,判断蛇是否死亡子程序流程图:5,蛇吃食物子程序流程图:6,过关子程序流程图:7,蛇显示子程序流程图:六程序清单:;=================================================================================================;红外遥控--串口--贪吃蛇;---------2008/9/1--------------------;=================================================================================================;硬件:P0,P2显示码输出---行,P1.0-P1.3接74LS154为点阵列扫描信号;P1.4-P1.7为4个独立键盘;P3.2INT0为启停键;P3.3INT1为红外接收;P3.0P3.1为串口;=================================================================================================;字节定义区;=================================================================================================SNAKE_TAIL_XEQU27H;蛇尾X坐标暂存器 SNAKE_TAIL_YEQU28H;蛇尾Y坐标暂存器FOOD_XEQU29H;食物X坐标FOOD_YEQU2AH;食物Y坐标 SNAKE_CHANGEQU2BH;蛇的节数 PUT_FOODEQU2CH;放食物随机码产生器 PASS_NUMEQU2DH;过关数目 TIMEEQU2EH;过关时间调节暂存器TIME_400EQU32H;400延时 XXEQU33H;方向X坐标暂存 YYEQU34H;方向Y坐标暂存 XEQU35H;方向X坐标 YEQU36H;方向Y坐标SNAKE_TOU_XEQU40H;蛇头X坐标存储单元SNAKE_TOU_YEQU54H;蛇头Y坐标存储单元 SNAKE_SHEN1_XEQU41H;蛇身第一节X坐标存储单元SNAKE_SHEN1_YEQU55H;蛇身第一节Y坐标存储单元 SNAKE_SHEN2_XEQU42H;蛇身第二节X坐标存储单元 SNAKE_SHEN2_YEQU56H;蛇身第二节Y坐标存储单元 H_Y_8EQU37H;Y坐标大于8的存放器 L_Y_8EQU38H;Y坐标小于8的存放器 IR_COM1EQU39H;红外接收操作码存放器 IR_COM2EQU3AH;红外接收操作反码存放器;=================================================================================================;位定义区;================================================================================================B_GAME_ON_OFFBIT00H;启停标志位 BT0BIT01H;定时器0中断标志 B_KEYTESTBIT02H;有键按下标志位 B_SNAKE_DEDBIT03H;蛇死亡标志位 B_SNAKE_FOODBIT04H;蛇吃到实物标志位B_PASSBIT05H;过关标志位 IRINBITP3.3;===============================================================================================;游戏开始;=============================================================================================== ORG00H JMPSTART_1 ORG03H JMPGAME_ON_OFF;INT0启停中断 ORG0BH JMPT0_SET;定时器T0中断 ORG13H JMPIR_IN;INT1红外接收ORG23HJMPRI_SET;串口通信 ORG30H;===============================================================================================;初始化蛇总长20节;===============================================================================================START_1:MOVPASS_NUM,#0MOVTIME,#20;20*20MS=400MS移动一次 CLRB_PASSSTART:MOVTIME_400,TIMEMOVSNAKE_TOU_X,#8;刚进入游戏模式时蛇为三节,初始X,Y坐标 MOVSNAKE_TOU_Y,#8 MOVSNAKE_SHEN1_X,#7 MOVSNAKE_SHEN1_Y,#8 MOVSNAKE_SHEN2_X,#6 MOVSNAKE_SHEN2_Y,#8 MOVR0,#SNAKE_SHEN2_X;第三节之后的蛇身X,Y坐标清0CLE_SNAKE_SHEN_X_17: INCR0 MOV@R0,#0 CJNER0,#53H,CLE_SNAKE_SHEN_X_17 MOVR0,#SNAKE_SHEN2_YCLE_SNAKE_SHEN_Y_17: INCR0 MOV@R0,#0 CJNER0,#67H,CLE_SNAKE_SHEN_Y_17MOVIR_COM1,#00H;红外接收存放器MOVIR_COM2,#00HMOVPUT_FOOD,#0;初始化随机码产生器归0MOVX,#1;初始化方向向右 MOVY,#0 MOVFOOD_X,#4;第一颗食物X,Y坐标 MOVFOOD_Y,#13 MOVSNAKE_CHANG,#3;初始化蛇长为3节CLRBT0;T0中断标志位初始化 CLRB_KEYTEST;键盘测试标志位初始化 CLRB_SNAKE_DED;蛇死亡标志位初始化 CLRB_SNAKE_FOOD;蛇吃到食物标志位初始化 CLRB_GAME_ON_OFF;启停位清零 SETBEA;开中断 SETBEX0;开INT0中断 SETBEX1;开外部中断INT1 SETBIT0;INT0负边缘触发 CLRIT1;INT1边缘触发方式 MOVTMOD,#01H;定时器0工作方式 SETBET0;开定时器0 SETBES;开串口中断MOVTMOD,#20H;定时器1用作串口通信波特率产生器 ANLPCON,#3FH;SMOD=0波特率不倍增MOVTH1,#0FDH;波特率为9600 MOVTL1,#0FDH SETBTR1;开始定时 MOVSCON,#50H;串口设为工作模式1接收MOVSP,#70H;堆栈初始化 JBB_PASS,GOTO_GAME;过关那么直接跳入游戏;==============================================================================================;等待游戏开始并显示SNAKE启停键按下那么显示PLAYGAME并进入游戏模式;==============================================================================================SNAKE: CALLDISP_SNAKE;等待开始时显示SNAKE JNBB_GAME_ON_OFF,SNAKE;启停标志位为0表示启停键没按下继续等待CLRB_GAME_ON_OFF;去除启停标志位SHEXIN: CALLDISP_SHEXIN;启停键按下显示PLAYGAME进入游戏 JNBB_GAME_ON_OFF,SHEXINCLRB_GAME_ON_OFF ;去除启停标志位GOTO_GAME:CLRB_PASSMOVDPTR,#65536-20000;定时器0定时初值 MOVTH0,DPH MOVTL0,DPLSETBTR0;开定时器;==============================================================================================;游戏主程序判断键盘,移动,是否死亡,吃食,显示;==============================================================================================MAIN_GAME:JNBBT0,MAIN_GAME;等待T0中断 CLRBT0;去除T0中断标志 CALLKEYTEST;调用键盘测试程序 JNBB_KEYTEST,NOKEY;判断是否有键按下 CALLREADKEY_X_Y;有键按下调用键盘操作子程序 CJNEA,#0F0H,XX_X_YY_Y;再次判断是否有键按下 JMPNOKEYXX_X_YY_Y:;有键按下将取得的方向值送入X,YMOVX,XX MOVY,YYNOKEY:DJNZTIME_400,MAINDISP;等待400MS到MOVTIME_400,TIME;重送初值 CLRP3.7 INCPUT_FOOD;对移动次数进行计数从而产生随机码 CALLSNAKE_MOVE;调用蛇身移动子程序==================1 CALLSNAKE_DED;判断蛇是否死亡子程序================2 JBB_SNAKE_DED,GAMEOVER;死亡那么显示GAMEOVER CALLSNAKE_FOOD;判断是否吃到食物子程序==============3 JNBB_SNAKE_FOOD,MAINDISP CALLSNAKE_ZHANGCHANG;吃到食物那么增长一节并重放食物========4 JNBB_PASS,MAINDISP CLRTR0 CALLSNAKE_PASS MOVA,PASS_NUM CJNEA,#10,GOTO_START JMPSTART_1MAINDISP:CALLGAME_DISP;显示蛇==============================5 JBB_GAME_ON_OFF,GAMEOVER JMPMAIN_GAME;继续循环GAMEOVER:CLRTR0 CLRB_GAME_ON_OFF CALLDISP_GAMEOVER;启停键在游戏中按下那么结束显示GAMEOVER JNBB_GAME_ON_OFF,GAMEOVER;再次按下启停键那么进入SNAKE进行等待 CLRB_GAME_ON_OFF;去除启停标志位GOTO_START: JMPSTART;===============================================================================================;T0中断效劳子程序重送初值置标志位;===============================================================================================T0_SET:MOVDPTR,#65536-20000 MOVTH0,DPH MOVTL0,DPL SETBBT0 RETI;================================================================================================;INTO中断效劳子程序启,停;================================================================================================GAME_ON_OFF:;INTO中断效劳子程序CLREX0 JBP3.2,OUTCALLDEL_10MS JBP3.2,OUTSETBB_GAME_ON_OFF;置启停标志位为1表示按下OUT:SETBEX0 RETI;===============================================================================================;键盘测试子程序有键按下那么B_KEYTEST=1;==============================================================================================KEYTEST:SETBB_KEYTESTMOVA,P1 ANLA,#0F0HCJNEA,#0F0H,KEYTEST_OUT CLRB_KEYTESTKEYTEST_OUT:RET;===============================================================================================;读键值并得出方向,即X,Y的值;===============================================================================================READKEY_X_Y:JNBP1.4,PD_UP_DOWN1;判断是否为向上键按下 JMPKEY_DOWNPD_UP_DOWN1:MOVA,YCJNEA,#0,KEY_DOWN MOVYY,#1;向上键按下那么置方向标志MOVXX,#0JMPREADKEY_OUTKEY_DOWN:JNBP1.7,PD_UP_DOWN2;判断是否为向下键按下 JMPKEY_LEFTPD_UP_DOWN2:MOVA,YCJNEA,#0,KEY_LEFT MOVYY,#-1;向下键按下那么置方向标志MOVXX,#0JMPREADKEY_OUTKEY_LEFT:JNBP1.5,PD_LEFT_RIGHT1;判断是否为向左键按下 JMPKEY_RIGHTPD_LEFT_RIGHT1:MOVA,XCJNEA,#0,KEY_RIGHT MOVXX,#-1;向左键按下那么置方向标志MOVYY,#0JMPREADKEY_OUTKEY_RIGHT:JNBP1.6,PD_LEFT_RIGHT2;判断是否为向右键按下 JMPREADKEY_OUTPD_LEFT_RIGHT2:MOVA,XCJNEA,#0,READKEY_OUT MOVXX,#1;向右键按下那么置方向标志MOVYY,#0READKEY_OUT:MOVA,P1;去抖 ANLA,#0F0H RET;===============================================================================================;蛇移动子程序;===============================================================================================SNAKE_MOVE:MOVR1,SNAKE_CHANGMOVA,SNAKE_TOU_X ADDA,X;蛇头X坐标加上方向X坐标 MOVR0,#SNAKE_TOU_XMOVE_CHANGE_X:;依次将前一个蛇身X坐标转向下一蛇身X坐标XCHA,@R0 INCR0 DJNZR1,MOVE_CHANGE_X ;MOVSNAKE_TAIL_X,AMOVR1,SNAKE_CHANG MOVA,SNAKE_TOU_Y ADDA,Y;蛇头Y坐标加上方向Y坐标 MOVR0,#SNAKE_TOU_YMOVE_CHANGE_Y:;依次将前一个蛇身Y坐标转向下一蛇身Y坐标XCHA,@R0 INCR0 DJNZR1,MOVE_CHANGE_Y ;MOVSNAKE_TAIL_Y,A RET;===============================================================================================;蛇显示子程序;===============================================================================================GAME_DISP:MOVR0,#SNAKE_TOU_X;从蛇头开始显示 MOVR1,#SNAKE_TOU_YGAME_DISP_20:MOVA,@R0;取X坐标 ORLA,#0F0H;高位为键盘因此屏蔽掉 MOVP1,A;X坐标输出 INCR0;下一节蛇身的X坐标 MOVA,@R1;Y坐标到R2 MOVR2,A CALLCOUNT_Y;计算出Y坐标的高8位和低8位 MOVP0,H_Y_8;输出Y坐标的高8位 MOVP2,L_Y_8;输出Y坐标的低8位 INCR1;取下一节的Y坐标 CALLDEL;延时 MOVP0,#00H MOVP2,#00H CJNER0,#53H,GAME_DISP_20;20节蛇身是否全部显示完 MOVA,FOOD_X;显示食物 ORLA,#0F0H MOVP1,A MOVR2,FOOD_Y CALLCOUNT_Y MOVP0,H_Y_8 MOVP2,L_Y_8 CALLDEL MOVP0,#00H MOVP2,#00H RET;==============================================================================================;Y坐标计算子程序Y坐标大于8的存在H_Y_8中,小于8的存在L_Y_8中;================================================================================================COUNT_Y:MOVH_Y_8,#00H;初始化Y坐标的高8位和低8位 MOVL_Y_8,#00H CJNER2,#0,COUNT_Y_H;Y坐标为0那么不要调整 JMPCOUNT_Y_OUTCOUNT_Y_H:CLRC MOVA,#8 SUBBA,R2JNCCOUNT_Y_L;判断Y坐标是否大于8 CLRC;大于8那么调整 MOVA,R2 SUBBA,#8MOVR2,A;调整后的Y坐标存回R2 SETBC MOVA,#00HCOUNT_Y_H_1:;将Y坐标高8位转化为可输出的字节存入H_Y_8 RLCA DJNZR2,COUNT_Y_H_1 MOVH_Y_8,A JMPCOUNT_Y_OUTCOUNT_Y_L:;Y坐标小于8那么执行下面的操作SETBC MOVA,#00HCOUNT_Y_L_1:;将Y坐标低8位转化为可输出的字节存入L_Y_8 RLCA DJNZR2,COUNT_Y_L_1 MOVL_Y_8,ACOUNT_Y_OUT:RET;===============================================================================================;判断蛇是否死亡子程序死亡那么置位B_SNAKE_DED=1;================================================================================================SNAKE_DED:SETBB_SNAKE_DEDMOVA,#-1;判断蛇头是否撞到左边的墙 CJNEA,SNAKE_TOU_X,X_16 JMPSNAKE_DED_OUTX_16:MOVA,#16;判断蛇头是否撞到右边的墙 CJNEA,SNAKE_TOU_X,Y_0 JMPSNAKE_DED_OUTY_0:MOVA,#0;判断蛇头是否撞到下边的墙 CJNEA,SNAKE_TOU_Y,Y_17 JMPSNAKE_DED_OUTY_17:MOVA,#17;判断蛇头是否撞到上边的墙 CJNEA,SNAKE_TOU_Y,SNAKE_DED_ZISHEN JMPSNAKE_DED_OUTSNAKE_DED_ZISHEN:;没撞到墙那么判断是否撞到自已MOVR0,#SNAKE_TOU_X MOVR1,#SNAKE_TOU_YSNAKE_DED_1:INCR1 INCR0 MOVA,@R0 CJNEA,SNAKE_TOU_X,SNAKE_DED_19 MOVA,@R1 CJNEA,SNAKE_TOU_Y,SNAKE_DED_19 JMPSNAKE_DED_OUTSNAKE_DED_19:CJNER0,#53H,SNAKE_DED_1SNAKE_NDED_OUT:CLRB_SNAKE_DEDSNAKE_DED_OUT:RET;================================================================================================;判断蛇是否吃到食物吃到食物B_SNAKE_FOOD=1;================================================================================================SNAKE_FOOD:CLRB_SNAKE_FOODMOVA,FOOD_X CJNEA,SNAKE_TOU_X,SNAKE_FOOD_OUT;食物的X坐标是否与蛇头X坐标重合 MOVA,FOOD_Y CJNEA,SNAKE_TOU_Y,SNAKE_FOOD_OUT;食物的Y坐标是否与蛇头Y坐标重合 SETBB_SNAKE_FOODSNAKE_FOOD_OUT:RET;================================================================================================;吃到食物子程序增加一节并重新放食;================================================================================================SNAKE_ZHANGCHANG:CLRB_PASSINCSNAKE_CHANG;吃到实物增长一节 MOVFOOD_X,#0;消掉实物 MOVFOOD_Y,#0 MOVA,SNAKE_CHANG CJNEA,#20,PUT_FOOD_COUNTSETBB_PASS;放新的食物PUT_FOOD_COUNT:;放新食物SETBP3.7 MOVA,PUT_FOOD;随机码即移动次数到AMOVB,#10 DIVAB;随机数除10取余 MOVR3,A;整数局部存入A,便于下一次除 MOVA,#2 MULAB;余数乘以2 MOVR2,A;存入R2SUBB_1_X: MOVA,R2 SUBBA,#17;得到的余数不能大于15 DECR2 JNCSUBB_1_X CJNER2,#-1,R2_FOOD_X INCR2R2_FOOD_X: MOVFOOD_X,R2;将算得的随机数存入食物的X坐标;得出食物Y坐标 MOVA,R3;将上一次除完后的整数放入AMOVB,#10 DIVAB;再除以10取余 MOVA,#2 MULAB;余数乘以2 MOVR2,A;存入R2 CJNEA,#0,SUBB_1_Y;Y坐标不能等于0 INCR2;等于0那么将其加1 JMPR2_FOOD_Y SUBB_1_Y:MOVA,R2 SUBBA,#18;y坐标不能大于16DECR2 JNCSUBB_1_YCJNER2,#0,R2_FOOD_Y;防止Y坐标变0 INCR2R2_FOOD_y:MOVFOOD_Y,R2;将算得的随机数存入食物的Y坐标;判断食物是否与蛇身重叠 MOVR0,#SNAKE_TOU_X;将蛇头的坐标转入R0,R1 MOVR1,#SNAKE_TOU_YPD_FOOD: MOVA,@R0 MOVB,@R1 INCR0 INCR1 CJNER0,#53H,PD_FOOD_1;蛇身是否都比拟完 JMPPUT_FOOD_OUTPD_FOOD_1: CJNEA,FOOD_X,PD_FOOD;依次取出各节蛇身与食物坐标进行比拟,重叠那么重放食物 MOVA,B CJNEA,FOOD_Y,PD_FOOD MOVA,#13ADDA,PUT_FOOD;重放食物时修正随机数MOVPUT_FOOD,A CJNEA,#255,PUT_FOOD_COUNT;修正后的随机数不能等于255,等于那么减1DECA MOVPUT_FOOD,A JMPPUT_FOOD_COUNTPUT_FOOD_OUT: RET;================================================================================================;过关子程序每过一关显示GOOD并显示关数;================================================================================================SNAKE_PASS: MOVA,TIME SUBBA,#1;每过一关那么提高一点速度 MOVTIME,AINCPASS_NUM;关数加1 MOVA,PASS_NUM CJNEA,#10,PASS_GO;到了10关那么退出 JMPPASS_OUTPASS_GO:;不同的关数显示不同的数字 CLRC RLCA MOVDPTR,#TAB_PASS JMP@A+DPTRTAB_PASS:JMPPASS_OUT JMPPASS_1 JMPPASS_2 JMPPASS_3 JMPPASS_4 JMPPASS_5 JMPPASS_6 JMPPASS_7 JMPPASS_8 JMPPASS_9PASS_1:MOVDPTR,#TAB_PASS_1MOV31H,#42 CALLDISP_MOVE_L JMPPASS_OUTPASS_2:MOVDPTR,#TAB_PASS_2MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_3:MOVDPTR,#TAB_PASS_3MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_4:MOVDPTR,#TAB_PASS_4MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_5:MOVDPTR,#TAB_PASS_5MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_6:MOVDPTR,#TAB_PASS_6MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_7:MOVDPTR,#TAB_PASS_7MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_8:MOVDPTR,#TAB_PASS_8MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_9:MOVDPTR,#TAB_PASS_9MOV31H,#46 CALLDISP_MOVE_L JMPPASS_OUTPASS_OUT:RET;===============================================================================================;串口中断效劳子程序;===============================================================================================RI_SET:CLRRI;去除接收标志MOVA,SBUF;读串口内容CJNEA,#00H,UPSETBB_GAME_ON_OFF;收到00H那么置启停标志JMPRI_OVERUP:;收到01H那么向上CJNEA,#01H,DOWN MOVA,Y CJNEA,#0,DOWNMOVX,#0MOVY,#1JMPRI_OVERDOWN:;收到02H那么向下CJNEA,#02H,LEFT MOVA,Y CJNEA,#0,LEFTMOVX,#0MOVY,#-1JMPRI_OVERLEFT:;收到03H那么向左CJNEA,#03H,RIGHT MOVA,X CJNEA,#0,RIGHTMOVX,#-1MOVY,#0JMPRI_OVERRIGHT:;收到04H那么向右CJNEA,#04H,RI_OVER MOVA,#X CJNEA,#0,RI_OVERMOVX,#1MOVY,#0RI_OVER:RETI;===============================================================================================;外部中断1效劳子程序红外接收;===============================================================================================IR_IN:CLREA;关闭所有中断PUSHACC;保护现场PUSHPSWPUSHDPH;保护DPTR的值PUSHDPLSETBRS0;转入工作存放器区1MOVP0,#00H;清屏MOVP2,#00HMOVR0,#IR_COM1;红外接收数据保存区地址到R0I1:JNBIRIN,I2;等待引导码出现JMPIR_IN_OUTI2:MOVR2,#40;等待2.8MSI2_0:CALLDEL_014DJNZR2,I2_0JBIRIN,I1;IRIN状态为1那么视为不是引导码,那么继续返回等待引导码出现I2_1:JBIRIN,I3;IRIN状态为0那么视为是引导码,等待高电平的结果码出现CALLDEL_014JMPI2_1I3:MOVR3,#0LL:JNBIRIN,I4;等待结果码结束CALLDEL_014JMPI3I4:JBIRIN,I5;结果码结束等待操作码的'0','1'编码的高电平出现;从而根据高电平的长短来判断是0码还是1码CALLDEL_014JMPI4I5:MOVR2,#0;高电平时间0.14MS的计数器,每过0.14MS那么加1LL1:CALLDEL_014JBIRIN,ADD_R2;等待IRIN变为低电平,不为低电平那么R2加1LL2:MOVA,#8CLRCSUBBA,R2;高电平大于1.12MS那么为'1',高电平小于1.12MS那么为'0'MOVA,@R0RRCA;将得到的这位码移入红外接收存储单元MOV@R0,AINCR3CJNER3,#8,LL;判断8次那么接收完1个字节MOVR3,#0INCR0CJNER0,#3BH,LL;总共接收两个码JMPIR_IN_KEY;两个码全部接收完后那么转去执行ADD_R2:INCR2;高电平时间0.14MS的计数器,每过0.14MS那么加1CJNER2,#30,LL1;时间过长那么判为1JMPLL2IR_IN_KEY:;MOVA,IR_COM1;CLRC;SUBBA,#15;JNCIR_IN_OUT;排除其它红外遥控器的干扰MOVA,IR_COM2CPLACJNEA,IR_COM1,IR_IN_OUT;与原码不同那么视为接收出错退出MOVA,IR_COM1CLRC;键值乘2RLCAMOVDPTR,#KEY_TABJMP@A+DPTR;散转分支KEY_TAB:JMPKEY0JMPKEY1JMPKEY2JMPKEY3JMPKEY4JMPKEY5JMPKEY6JMPKEY7JMPKEY8JMPKEY9JMPKEY10JMPKEY11JMPKEY12JMPKEY13JMPKEY14KEY0:SETBB_GAME_ON_OFF;0键设启停JMPIR_IN_OUTKEY1:JMPIR_IN_OUTKEY2:MOVA,X;2键向右CJNEA,#0,IR_IN_OUTMOVX,#1MOVY,#0JMPIR_IN_OUTKEY3:JMPIR_IN_OUTKEY4:JMPIR_IN_OUTKEY5:JMPIR_IN_OUTKEY6:JMPIR_IN_OUTKEY7:MOVA,Y;7键向下CJNEA,#0,IR_IN_OUTMOVX,#0MOVY,#-1JMPIR_IN_OUTKEY8:MOVA,Y;8键向上CJNEA,#0,IR_IN_OUTMOVX,#0MOVY,#1JMPIR_IN_OUTKEY9:JMPIR_IN_OUTKEY10:JMPIR_IN_OUTKEY11:JMPIR_IN_OUTKEY12:MOVA,X;12键向左CJNEA,#0,IR_IN_OUTMOVX,#-1MOVY,#0JMPIR_IN_OUTKEY13:JMPIR_IN_OUTKEY14:JMPIR_IN_OUTIR_IN_OUT:POPDPL;弹出堆栈POPDPHPOPPSWPOPACCCLRRS0;工作存放区转回0SETBEA;开中断RETI;中断返回;================================================================================================;显示SNAKEPLAYGAMEGAMEOVER子程序;====================
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 血糖仪规范使用
- 挫折赋能:3步搭建进步阶梯(修改)
- 建设工程安全月管理汇报
- 胆囊结石围术期护理
- 五年级上册数学一课一练-第五单元 简易方程 第6课时 解稍复杂的方程(含详细解析)人教版
- 孩子胆小怎么变?勇气训练手册
- 保持工作热情与动力的小秘诀计划
- 血标本护理安全警示案例
- 品德必行未来可期计划
- 制定有效的时间管理计划
- 零碳建筑技术标准培训课件
- 盘扣脚手架专项施工方案
- CNG撬车连接安全操作规程
- 地形图的识别与应用-地形图的识别(森林调查技术)
- 科学小报科技小报小学生word手抄报小报模板
- 2022-2023学年天津市南开区七年级(下)期中数学试卷-普通用卷
- DISC职业性格测试(40题,附完整分析)
- 2023年北京定额及计算规则
- 问题解决型护理品管圈QCC成果汇报之降低透析器凝血发生率
- 全自动蜂窝纸板生产线介绍-美迅机械设备制造商
- 药品质量评审实施方案
评论
0/150
提交评论