在16*16点阵,俄罗斯方块的基础上,花了一下午的时间,做了一个飞机游戏!请各位大虾指导!拜谢! ;/////////////////////////////////////////// ;王筝 QQ:408864998 ;本程序利用LED点阵实现飞机游戏 ;/////////开始自定义及初始化//////////////// SHUJU EQU P0 ;数据口高电平亮 PIANXUAN EQU P1 ; 已经外接154 LATCH_H EQU P3.0 ;上锁存信号 1表示片选 不片选的时候输出低电平 LATCH_L EQU P3.1 ;下锁存信号 XUANJIAN EQU P2.5 ;旋转按键 ZUOJIAN EQU P2.7 ;左移按键 YOUJIAN EQU P2.6 ;右移按键 XIAJIAN EQU P2.4 ;下移按键 CBUFTH0 EQU 75H ;定时器TH0基数存储单元 CBUFTL0 EQU 76H ;定时器TL0基数存储单元 XUAN0 EQU 20H ;第0列旋转数据 XUAN1 EQU 21H ;第1列旋转数据 XUAN2 EQU 22H ;第2列旋转数据 XUAN3 EQU 23H ;第3列旋转数据 XUAN11 EQU 25H XUAN12 EQU 26H XUAN13 EQU 27H
X_X EQU 6CH ;异地旋转X-X Y_Y EQU 6DH ;异地旋转Y-Y HANGSHU EQU 2BH BT0 BIT 2FH.0 ;节拍法标志位 SANFEIJI BIT 2FH.1 ;闪烁标志位 CHONGTU BIT 2FH.2 ;冲突标志位,冲突就合成 HANZI BIT 2FH.3 ;显示汉字标志位 GUANSHU EQU 2DH ANJIAN1 BIT 2FH.4 ANJIAN2 BIT 2FH.5 ANJIAN3 BIT 2FH.6 ANJIAN4 BIT 2FH.7 TINGZHI BIT 2EH.2 ;停止标志位 ZANTING BIT 2EH.3 ;加速标志位 GUOGUAN BIT 2EH.4
FENSHUZHI EQU 6EH FENSHUZHI1 EQU 78H SUDU EQU 79H SUIJISHU EQU 6FH FXUAN EQU 24H ;用来存储旋转溢出 BEI0 EQU 30H ;第0列数据 BEI1 EQU 31H ;第1列数据 BEI2 EQU 32H ;第2列数据 BEI3 EQU 33H ;第3列数据 BEI4 EQU 34H ;第4列数据 BEI5 EQU 35H ;第5列数据 BEI6 EQU 36H ;第6列数据 BEI7 EQU 37H ;第7列数据 BEI8 EQU 38H ;第8列数据 BEI9 EQU 39H ;第9列数据 背景数据 上面两排左边10列 BEI10 EQU 3AH ;第0列数据 BEI11 EQU 3BH ;第1列数据 BEI12 EQU 3CH ;第2列数据 BEI13 EQU 3DH ;第3列数据 BEI14 EQU 3EH ;第4列数据 BEI15 EQU 3FH ;第5列数据 BEI16 EQU 40H ;第6列数据 BEI17 EQU 41H ;第7列数据 BEI18 EQU 42H ;第8列数据 BEI19 EQU 43H ;第9列数据 背景数据 下面两排左边10列 XIAN0 EQU 44H ;第0列显示数据 XIAN1 EQU 45H ;第1列显示数据 XIAN2 EQU 46H ;第2列显示数据 XIAN3 EQU 47H ;第3列显示数据 XIAN4 EQU 48H ;第4列显示数据 XIAN5 EQU 49H ;第5列显示数据 XIAN6 EQU 4AH ;第6列显示数据 XIAN7 EQU 4BH ;第7列显示数据 XIAN8 EQU 4CH ;第8列显示数据 XIAN9 EQU 4DH ;第9列显示数据 显示数据 上面两排左边10列 XIAN10 EQU 4EH ;第0列显示数据 XIAN11 EQU 4FH ;第1列显示数据 XIAN12 EQU 50H ;第2列显示数据 XIAN13 EQU 51H ;第3列显示数据 XIAN14 EQU 52H ;第4列显示数据 XIAN15 EQU 53H ;第5列显示数据 XIAN16 EQU 54H ;第6列显示数据 XIAN17 EQU 55H ;第7列显示数据 XIAN18 EQU 56H ;第8列显示数据 XIAN19 EQU 57H ;第9列显示数据 显示数据 下面两排左边10列 YIDONG0 EQU 58H ;第0列移动数据 YIDONG1 EQU 59H ;第1列移动数据 YIDONG2 EQU 5AH ;第2列移动数据 YIDONG3 EQU 5BH ;第3列移动数据 YIDONG4 EQU 5CH ;第4列移动数据 YIDONG5 EQU 5DH ;第5列移动数据 YIDONG6 EQU 5EH ;第6列移动数据 YIDONG7 EQU 5FH ;第7列移动数据 YIDONG8 EQU 60H ;第8列移动数据 YIDONG9 EQU 61H ;第9列移动数据 YIDONG10 EQU 62H ;第0列移动数据 YIDONG11 EQU 63H ;第1列移动数据 YIDONG12 EQU 64H ;第2列移动数据 YIDONG13 EQU 65H ;第3列移动数据 YIDONG14 EQU 66H ;第4列移动数据 YIDONG15 EQU 67H ;第5列移动数据 YIDONG16 EQU 68H ;第6列移动数据 YIDONG17 EQU 69H ;第7列移动数据 YIDONG18 EQU 6AH ;第8列移动数据 YIDONG19 EQU 6BH ;第9列移动数据 ORG 00H LJMP START ORG 000BH JMP T_0 START: MOV R0,#7FH FUWEI: MOV @R0,#00H DJNZ R0,FUWEI MOV FENSHUZHI,#00 ;最开始的时候分数为0 MOV FENSHUZHI1,#00 MOV GUANSHU,#0 MOV SUDU,#50 START1: CALL CHUZHI1 CALL CHUZHI2 ;最开始的时候产生的积木 ; MOV SUIJISHU,#6 ;最开始的时候产生的随机数为6(随机产生积木) CLR HANZI ;在最开始的时候,把HANZI置成1用来显示汉字 MAIN1: MOV SP,#79H MOV TMOD,#01H MOV DPTR,#65536-20000 MOV TH0,DPH MOV TL0,DPL MOV CBUFTH0,DPH MOV CBUFTL0,DPL SETB EA SETB ET0 SETB TR0 CLR BT0 ;中断标志位 ;CLR CHONGTU ;数据冲突标志位,等于0表示不冲突,能选择等 CLR ANJIAN1 ;按键1已经按下的的标志位 CLR ANJIAN2 ;按键2已经按下的的标志位 CLR ANJIAN3 ;按键3已经按下的的标志位 CLR ANJIAN4 ;按键4已经按下的的标志位 CLR ZANTING CLR GUOGUAN ; CLR CHONGHE ;用来出1S的标志 MOV R2,#0 MOV R3,#0 ;X坐标 MOV 73H,#0 ;显示汉字的初始值 MOV R0,73H MOV 74H,#0 MAIN: JNB BT0,MAIN ;等待中断的到来(执行中断返回后,BT0等于1) CLR BT0 JNB HANZI,HUNAN ;HANZI等于0就去显示汉字 LJMP YUANDIAN HUNAN: MOV R0,73H LCALL KAISHIXIANSHI jb xuanjian,taiqi44 jb anjian1,taiqi44 setb anjian1 SETB HANZI ;旋转键按下就开始游戏 LJMP MAIN1 taiqi44: jnb xuanjian,GGG clr anjian1 GGG: INC R2 CJNE R2,#5,MAIN MOV R2,#0 INC 73H INC 73H MOV A,73H CJNE A,#228,MAIN MOV 73H,#0 LJMP MAIN YUANDIAN: CALL FENSHU CALL FENSHU1 JNB GUOGUAN,CCRR ;是否过关 MOV FENSHUZHI,#0 LCALL FUWEI4 MOV A,SUDU ;过关后速度加快 CJNE A,#5,HHRR MOV A,#50 HHRR: SUBB A,#5 MOV SUDU,A LJMP START1 CCRR: CALL CHUFEIJI CALL HECHENG ;背景合成显示 CALL XIANSHI ;调用显示子程序 CALL JIANPAN ;按键判断子程序 JNB ZANTING,MAIN JB HANZI,HHH LCALL FUWEI4 LCALL BAOCUN LJMP START1 HHH: INC R2 MOV A,R2 ;判断是否来了 CJNE A,SUDU,MAIN ;1S没有来什么事情都不干 MOV R2,#0 ;来了 CALL XIAYI ;下移子程序 JNB HANZI,JJJ LJMP MAIN JJJ: LCALL FUWEI4 LCALL BAOCUN LJMP START1 BAOCUN: MOV A,GUANSHU MOV B,#10 MUL AB MOV FENSHUZHI1,A RET
CHUSUIJI: MOV A,TL0 MOV B,#08 DIV AB MOV A,B MOV SUIJISHU,A RET CHUFEIJI: CLR PSW.7 MOV A,R3 SUBB A,#8 JB PSW.7,III MOV R3,#0 ; CJNE R3,#8,III ; MOV R3,#0 ; CPL SANFEIJI ; JNB SANFEIJI,III CALL CHUSUIJI CALL SUIJI III: RET
SUIJI: MOV A,SUIJISHU CLR C RLC A MOV DPTR,#TAB JMP @A+DPTR TAB: AJMP SUB0 AJMP SUB1 AJMP SUB2 AJMP SUB3 AJMP SUB4 AJMP SUB5 AJMP SUB6 AJMP SUB7 SUB0: ORL YIDONG0,#0AH ORL YIDONG1,#0FH ORL YIDONG2,#0AH RET SUB1: ORL YIDONG1,#0AH ORL YIDONG2,#0FH ORL YIDONG3,#0AH RET SUB2: ORL YIDONG2,#0AH ORL YIDONG3,#0FH ORL YIDONG4,#0AH RET SUB3: ORL YIDONG3,#0AH ORL YIDONG4,#0FH ORL YIDONG5,#0AH RET SUB4: ORL YIDONG4,#0AH ORL YIDONG5,#0FH ORL YIDONG6,#0AH RET SUB5: ORL YIDONG5,#0AH ORL YIDONG6,#0FH ORL YIDONG7,#0AH RET SUB6: ORL YIDONG6,#0AH ORL YIDONG7,#0FH ORL YIDONG8,#0AH RET SUB7: ORL YIDONG7,#0AH ORL YIDONG8,#0FH ORL YIDONG9,#0AH RET FUWEI4: MOV R0,#6BH FUWEI78:MOV @R0,#00h DEC R0 CJNE R0,#2FH,FUWEI78 RET ;///////////////替换子程序//////////////////// ;输入:"" ;输出: "" ;实现的功能:将飞机模型载入BEI里面 TIHUAN1: MOV BEI13,XUAN1 MOV BEI14,XUAN2 MOV BEI15,XUAN3 RET ;///////////////替换子程序//////////////////// ;输入:"" ;输出: "" ;实现的功能:将飞机模型载入BEI里面 TIHUAN2: MOV YIDONG3,XUAN1 MOV YIDONG4,XUAN2 MOV YIDONG5,XUAN3 RET ;///////////////初值1子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能:产生飞机模型2 CHUZHI1:MOV XUAN1,#0A0H MOV XUAN2,#0F0H MOV XUAN3,#0A0H CALL TIHUAN1 RET ;///////////////初值1子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能:产生飞机模型 CHUZHI2:MOV XUAN1,#0AH MOV XUAN2,#0FH MOV XUAN3,#0AH CALL TIHUAN2 RET ;///////////////合成子程序/////////////////// ;输入:"背景与移动" ;输出: "显示" ;实现的功能:把背景与移动合成到显示 HECHENG:MOV 73H,#XIAN0 MOV R0,#BEI0 MOV 74H,#YIDONG0 WANG1: MOV A,@R0 MOV R1,74H ORL A,@R1 MOV R1,73H MOV @R1,A INC R0 INC 74H INC 73H CJNE R0,#44H,WANG1 RET ;///////////////显示子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能:显示 XIAN0- XIAN9 XIAN10- XIAN19的内容 XIANSHI: MOV SHUJU,#00H CLR LATCH_L ;下面的两个点阵不亮 SETB LATCH_H ;开上面的两个点阵 MOV R0,#XIAN0 MOV R1,#00 WANG: MOV PIANXUAN,R1 ;片选 MOV SHUJU,@R0 ;数据 CALL DELAY ;延时 MOV SHUJU,#00 ;关屏幕 INC R0 INC R1 CJNE R0,#4EH,WANG MOV PIANXUAN,#10 MOV SHUJU,#0FFH CALL DELAY MOV SHUJU,#00 ;显示分数 LCALL FENSHU1 LCALL FENSHU2 MOV PIANXUAN,#12 MOV SHUJU,44H CALL DELAY MOV SHUJU,#00 MOV PIANXUAN,#13 MOV SHUJU,45H CALL DELAY MOV SHUJU,#00 ; MOV PIANXUAN,#14 MOV SHUJU,46H CALL DELAY MOV SHUJU,#00 MOV PIANXUAN,#15 MOV SHUJU,47H CALL DELAY MOV SHUJU,#00 CLR LATCH_H SETB LATCH_L MOV R0,#XIAN10 MOV R1,#00 ZHENG: MOV PIANXUAN,R1 MOV SHUJU,@R0 ;数据 CALL DELAY ;延时 MOV SHUJU,#00 ;关屏幕 INC R0 INC R1 CJNE R0,#58H,ZHENG MOV PIANXUAN,#10 MOV SHUJU,#0FFH CALL DELAY MOV SHUJU,#00H LCALL FENSHU1 MOV A,B LCALL FENSHU2 MOV PIANXUAN,#12 MOV SHUJU,44H CALL DELAY MOV SHUJU,#00 MOV PIANXUAN,#13 MOV SHUJU,45H CALL DELAY MOV SHUJU,#00 MOV PIANXUAN,#14 MOV SHUJU,46H CALL DELAY MOV SHUJU,#00 MOV PIANXUAN,#15 MOV SHUJU,47H CALL DELAY MOV SHUJU,#00 RET ;///////////////显示汉字子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能:滚动显示湖南源点教育 KAISHIXIANSHI: LOOP: MOV SHUJU,#00H CLR LATCH_H ;下面的两个点阵不亮 SETB LATCH_L ;开上面的两个点阵 MOV PIANXUAN,74H MOV DPTR,#TAB4 MOV A,R0 MOVC A,@A+DPTR MOV SHUJU,A CALL DELAY MOV SHUJU,#00 CLR LATCH_L SETB LATCH_H INC R0 MOV PIANXUAN,74H MOV DPTR,#TAB4 MOV A,R0 MOVC A,@A+DPTR MOV SHUJU,A CALL DELAY MOV SHUJU,#00
INC R0 INC 74H MOV A,74H CJNE A,#16,LOOP MOV 74H,#0 OUT3: RET TAB4: DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h ;湖[16*16]下上列排 DB 04h, 10h, 0FCh, 21h, 02h, 62h, 01h, 16h DB 7Fh, 90h, 20h, 90h, 20h, 0FFh, 20h, 90h DB 0BFh, 0D0h, 40h, 90h, 3Fh, 0FEh, 42h, 22h DB 82h, 22h, 7Fh, 0FFh, 00h, 02h, 00h, 00h ;南[16*16]下上列排 DB 00h, 04h, 0FFh, 0E4h, 00h, 24h, 09h, 24h DB 09h, 64h, 09h, 0A4h, 09h, 24h, 7Fh, 3Fh DB 09h, 24h, 09h, 0A4h, 09h, 64h, 49h, 24h DB 80h, 24h, 7Fh, 0F6h, 00h, 24h, 00h, 00h ;源[16*16]下上列排 DB 04h, 10h, 04h, 22h, 0FEh, 64h, 41h, 0Ch DB 30h, 80h, 0Fh, 0FEh, 20h, 02h, 13h, 0E2h DB 5Ah, 0A2h, 82h, 0B2h, 7Eh, 0AEh, 02h, 0A2h DB 0Ah, 0A2h, 13h, 0F3h, 30h, 22h, 00h, 00h ;点[16*16]下上列排 DB 80h, 00h, 40h, 00h, 37h, 0C0h, 04h, 40h DB 14h, 40h, 64h, 40h, 04h, 7Fh, 14h, 48h DB 24h, 48h, 64h, 48h, 04h, 48h, 17h, 0E8h DB 20h, 4Ch, 0C0h, 08h, 00h, 00h, 00h, 00h ;教[16*16]下上列排 DB 02h, 20h, 12h, 24h, 51h, 24h, 90h, 0A4h DB 7Eh, 0FFh, 0Ah, 0A4h, 89h, 0B4h, 40h, 0ACh DB 20h, 20h, 0Bh, 9Fh, 04h, 10h, 0Bh, 10h DB 60h, 0F0h, 0C0h, 18h, 40h, 10h, 00h, 00h ;育[16*16]下上列排 DB 00h, 04h, 00h, 04h, 00h, 24h, 0FFh, 0A4h DB 0Ah, 0B4h, 0Ah, 0ACh, 0Ah, 0A5h, 0Ah, 0A6h DB 0Ah, 0A4h, 4Ah, 0A4h, 8Ah, 0A4h, 7Fh, 0B4h DB 00h, 64h, 00h, 06h, 00h, 04h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
FENSHU: CLR PSW.7 MOV A,FENSHUZHI SUBB A,#9 JB PSW.7,TTTT INC FENSHUZHI1 MOV FENSHUZHI,#0 TTTT: RET
FENSHU1: MOV B,#10 MOV A,FENSHUZHI1 DIV AB CJNE A,GUANSHU,VVVV RET VVVV: MOV GUANSHU,A SETB GUOGUAN RET FENSHU2: CLR C RLC A MOV DPTR,#TAB1 JMP @A+DPTR TAB1: AJMP SUB00 AJMP SUB10 AJMP SUB20 AJMP SUB30 AJMP SUB40 AJMP SUB50 AJMP SUB60 AJMP SUB70 AJMP SUB80 AJMP SUB90 SUB00: MOV 44H,#70H ;分数0的显示 MOV 45H,#88H MOV 46H,#88H MOV 47H,#70H RET SUB10: MOV 44H,#00H MOV 45H,#00H MOV 46H,#00H MOV 47H,#0F8H RET SUB20: MOV 44H,#0E8H MOV 45H,#0A8H MOV 46H,#0A8H MOV 47H,#0B8H RET SUB30: MOV 44H,#0A8H MOV 45H,#0A8H MOV 46H,#0A8H MOV 47H,#0F8H RET SUB40: MOV 44H,#38H MOV 45H,#20H MOV 46H,#20H MOV 47H,#0F8H RET SUB50: MOV 44H,#0B8H MOV 45H,#0A8H MOV 46H,#0A8H MOV 47H,#0E8H RET SUB60: MOV 44H,#0F8H MOV 45H,#0A8H MOV 46H,#0A8H MOV 47H,#0E8H RET SUB70: MOV 44H,#08H MOV 45H,#08H MOV 46H,#08H MOV 47H,#0F8H RET SUB80: MOV 44H,#0F8H MOV 45H,#0A8H MOV 46H,#0A8H MOV 47H,#0F8H RET SUB90: MOV 44H,#0B8H MOV 45H,#0A8H MOV 46H,#0A8H MOV 47H,#0F8H RET ;///////////////下移子程序//////////////////// ;输入:"" ;输出: "" ;实现的功能:将BEI1-BEI9里面的数左移 XIAYI: CALL XIAYI3 ;先下移 INC R3 INC FENSHUZHI CALL CHONGTUPANDUAN ;是否能下移 CCCC: RET XIAYI3: MOV R0,#YIDONG0 MOV R1,#YIDONG10 WANG3: CLR C MOV A,@R0 RLC A MOV @R0,A MOV A,@R1 RLC A MOV @R1,A INC R0 INC R1 CJNE R0,#62H,WANG3 RET ;///////////////左移子程序//////////////////// ;输入:"" ;输出: "" ;实现的功能: ZUOYI: MOV A,BEI0 ;判断能不能左移 JZ ZUOYI1 RET ZUOYI1: MOV A,BEI10 JZ ZUOYI2 RET ZUOYI2: MOV 73H,BEI0 ;30H-3DH MOV R0,#31H WANG4: MOV A,@R0 ;31H-30H DEC R0 MOV @R0,A INC R0 INC R0 CJNE R0,#44H,WANG4 MOV 43H,73H CALL CHONGTUPANDUAN ;是否能下移 WANG50: RET ;///////////////右移子程序//////////////////// ;输入:"" ;输出: "" ;实现的功能: YOUYI: MOV A,BEI9 ;判断能不能再右移 JZ YOUYI1 RET YOUYI1: MOV A,BEI19 JZ YOUYI2 RET YOUYI2: INC X_X CALL YOUYI3 ;坐标加一用于异地旋转 RET YOUYI3: CALL YOUYI4 CALL CHONGTUPANDUAN ;是否能下移 WANG51: RET YOUYI4: MOV 73H,BEI19 ;30H-3DH MOV R0,#42H WANG5: MOV A,@R0 ;31H-30H INC R0 MOV @R0,A DEC R0 DEC R0 CJNE R0,#2FH,WANG5 MOV 30H,73H RET ;///////////////判断按键子程序/////////////////// ;输入:"无" ;输出: "" ;实现的功能: jianpan: jb xuanjian,taiqi ;设置按键 jb anjian1,taiqi ;有键按下R4加1(设置那个部分) setb anjian1 ;把ANJIAN1设置为1(防止1次按键 多次响应) CPL zanting taiqi: jnb xuanjian,panzuo ;抬起后anjina1等于0 clr anjian1 JNB ZANTING,outtT panzuo: ;加按键 jb zuojian,taiqi2 CPL ANJIAN2 jb anjian2,taiqi2 ;setb anjian2 call zuoyi taiqi2: ;jnb zuojian,panyou ; clr anjian2 panyou: jb youjian,taiqi3 ;减按键 ; jb anjian3,taiqi3 ; setb anjian3 call youyi taiqi3: ;jnb youjian,panxia ; clr anjian3 panxia: jb xiajian,taiqi5 ;转换按键 ;jb anjian4,taiqi5 ;有键按下R4加1(设置那个部分) ;setb anjian4 call xiayi taiqi5: ;jnb xiajian,outtt ;clr anjian4 outtt: ret
;///////////////冲突判断子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能:判断两个飞机是否相撞,相撞后冲突变为0 CHONGTUPANDUAN: MOV R0,#BEI0 MOV R1,#YIDONG0 WANG34: MOV A,@R0 ANL A,@R1 JZ ZHENG34 ZHENG334: CLR HANZI ;相撞了 RET ZHENG34: INC R0 INC R1 CJNE R0,#44H,WANG34 SETB HANZI ;没相撞 RET ;///////////////中断子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能:把A的数输出到P2口显示 T_0: MOV TL0,CBUFTL0 MOV TH0,CBUFTH0 SETB BT0 RETI ;///////////////延时子程序/////////////////// ;输入:"" ;输出: "" ;实现的功能: DELAY: MOV R6,#8 DD1: MOV R7,#40 DJNZ R7,$ DJNZ R6,DD1 RET ;///////////////结束子程序/////////////////// END
|