1、单片机实验课程作业乒乓球;系统晶振是 11.0592 MHz;R0控制延时程序时间 R1标记连续发球次数 R3设置球弹跳一次的路程 R4储存某些情况下8个LED灯的状态 R5设置等待击球的时间 R6,R7用于LED数码管显示AGREEN EQU P1.0BGREEN EQU P1.1ARED EQU P1.2BRED EQU P1.3SCOREA EQU 70H ;A的得分SCOREB EQU 71H ;B的得分BOARDA EQU 72H ;A的得胜局数BOARDB EQU 73H ;B的得胜局数SPEED EQU 74H ;存储球的移动速度LEDMOD EQU 00H ;左边输入 八位字符
2、显示 ;外部译码键扫描方式,双键互锁LEDFEQ EQU 2FH ;扫描速率LEDCLS EQU 0C1H ;清除显示 RAMLEDWR0 EQU 80H ;设定的将要写入的显示RAM地址LBOARD EQU 02H ;三局两胜制LSCORE EQU 0BH ;11分制D8255 EQU 8406H ;8255 状态/命令口地址D8255A EQU 8400H ;8255 PA 口地址D8255B EQU 8402H ;8255 PB 口地址D8255C EQU 8404H ;8255 PC 口地址Z8279 EQU 0FF82H ;8279 状态/命令口地址D8279 EQU 0FF80H
3、;8279 数据口地址BOUND EQU 05H ;发球前弹跳的速度NUMMOVE EQU 07H ;球从左到右所走的路程NUMSHINE EQU 03H ;闪烁的次数READKB EQU 00H ;读 FIFO RAM 地址 0 的命令字DELETE EQU 0C2H ;清除FIFO RAMSRIGTH EQU 20H.0 ;设置此处片内RAM为发球权归属,0-A 1-B ORG 0000H AJMP START ORG 0040HSTART: MOV R1,#02H MOV SP,#60H MOV R5,#NUMSHINE ;设置闪烁三次 CLR SRIGTH ;设置A初始发球 MOV D
4、PTR,#D8255 MOV A,#82H MOVX DPTR,A ;置8255状态,方式0,PA,PC口输出,PB口输入 MOV DPTR,#D8255A ;DPTR指向A端口 MOV R3,#NUMMOVE ;设置路程 MOV A,#0H MOV SCOREA,A ;初始的分数都为0 MOV SCOREB,A MOV BOARDA,A MOV BOARDB,A ;可以设置回球的速度为0.5秒 LCALL INIT_ALL ;初始化8279并显示 LCALL INIT8279 MOV R0,#02H LCALL DELAY LCALL DISPLAY ;初始化8279并显示 LJMP REP
5、LAY ;*发球总程序SERVICE: MOV C,SRIGTH JNC ASERVICE ;如果为0,则A发球 LJMP BSERVICE ;否则B发球;*发球总程序;*A发球程序 ASERVICE: CLR AGREEN ;首先设置A方为绿灯,A发球 SETB AREDAWAIT: ;以下为等A发球,同时球在弹跳的程序 MOV R0,#BOUND ;设置弹跳为0.1秒一次 MOV R4,#01H MOV A,R4 MOV DPTR,#D8255A MOVX DPTR,A CPL P3.5 LCALL DELAY MOV A,#00H MOVX DPTR,A CPL P3.5 LCALL D
6、ELAY LCALL GETKEY ;循环等待A方发球 CJNE A,#0FFH,AWAIT MOV A,B CJNE A,#30H,AWAIT ;如果输入的不是A的发球键,继续循环 ASEND: ;A传球程序 CLR AGREEN CLR ARED SETB BRED SETB BGREEN ;可以设置回球的速度为0.5秒 MOV A,SPEED MOV R0,A ;可以设置回球的速度为0.5秒 MOV A,#01H LCALL ROTATE1 ;调用A传球程序,把球送到B方 CPL P3.5 LCALL INVALID_8279 ;要求A传球期间B的按键无效 LCALL INIT_8255
7、 LCALL SHINE ;shine持续数秒,期间B可以输入 LCALL GETKEY ;读取这一期间的输入 CJNE A,#0FFH,AUDITA ;如果没有输入,B失球,开始清算! MOV A,B CJNE A,#36H,AUDITA ;如果没有输入(输入错误),B失球,开始清算! LJMP BSEND;*A发球程序;B发球程序* BSERVICE: CLR BGREEN ;首先设置B方为绿灯,B发球 SETB BRED BWAIT: ;以下为等B发球,同时球在弹跳的程序 MOV R0,#BOUND ;设置弹跳为0.2秒一次 MOV R4, #80H MOV A,R4 MOV DPTR,
8、#D8255A MOVX DPTR,A CPL P3.5 LCALL DELAY MOV A,#00H MOVX DPTR,A CPL P3.5 LCALL DELAY LCALL GETKEY ;看B方发球有没有发球 CJNE A,#0FFH,BWAIT MOV A,B CJNE A,#36H,BWAIT ;如果输入的不是B的发球键,继续循环 BSEND: ;B传球程序 CLR BGREEN CLR BRED SETB ARED SETB AGREEN ;可以设置回球的速度为0.5秒 MOV A,SPEED MOV R0,A ;可以设置回球的速度为0.5秒 MOV A,#80H LCALL
9、ROTATE2 ;调用B传球程序,把球送到B方 CPL P3.5 LCALL INVALID_8279 ;要求B传球期间A的按键无效 LCALL INIT_8255 LCALL SHINE ;shine持续数秒,期间A可以输入 LCALL GETKEY ;读取这一期间的输入 CJNE A,#0FFH,AUDITB ;如果没有输入,A失球,开始清算! MOV A,B CJNE A,#30H,AUDITB ;如果没有输入(输入错误),A失球,开始清算! LJMP ASEND;*B发球程序 REPLAY: DJNZ R1,RESTA MOV R1,#02H CPL SRIGTHRESTA: LJMP
10、 SERVICE AUDITA: CLR BRED SETB BGREEN SETB AGREEN SETB ARED LCALL DELAY MOV A,SCOREA ;A的得分加一 INC A MOV SCOREA,A ;初始化8279并显示 LCALL DISPLAY NOP ;初始化8279并显示 CJNE A,#LSCORE,REPLAY ;没加够11,则继续玩 LJMP CHECKA ;加够11,则进入A的2级清算 AUDITB: CLR ARED SETB AGREEN SETB BGREEN SETB BRED LCALL DELAY MOV A,SCOREB ;B的得分加一
11、INC A MOV SCOREB,A ;初始化8279并显示 LCALL DISPLAY ;初始化8279并显示 CJNE A,#LSCORE,REPLAY ;没加够11,则继续玩 LJMP CHECKB ;加够11,则进入B的2级清算 CHECKA: MOV A,#0H ;AB的得分清零 MOV SCOREA,A MOV SCOREB,A MOV A,BOARDA INC A MOV BOARDA,A ;初始化8279并显示 LCALL DISPLAY ;初始化8279并显示 CJNE A,#LBOARD,REPLAY LJMP AWINCHECKB: MOV A,#0H ;AB的得分清零
12、MOV SCOREA,A MOV SCOREB,A MOV A,BOARDB INC A MOV BOARDB,A ;初始化8279并显示 LCALL DISPLAY ;初始化8279并显示 CJNE A,#LBOARD,REPLAY LJMP BWIN AWIN: CLR AGREEN SETB ARED SETB BRED SETB BGREEN MOV A,#0H MOV SCOREA,A MOV SCOREB,A MOV BOARDB,A LCALL DISPLAY SJMP $BWIN: CLR BGREEN SETB ARED SETB BRED SETB AGREEN MOV A
13、,#0H MOV SCOREA,A MOV SCOREB,A MOV BOARDA,A LCALL DISPLAY SJMP $ ;*击球&闪烁程序ROTATE1: ;从左向右击球的程序 MOVX DPTR,A ;点亮LED RL A ;循环右移 LCALL DELAY ;延时 CPL P3.5 ;接入继电器,然后会哒哒哒的响,酷炫无比 DJNZ R3,ROTATE1 MOV R3,#NUMMOVE MOV R4,A ;R4是亮的状态,记下来,待会闪烁的时候要用到 MOV A,#00H ;重新设置灯都灭掉 MOVX DPTR,A RETROTATE2: ;从右向左击球的程序 MOVX DPTR
14、,A ;点亮LED RR A ;循环右移 LCALL DELAY ;延时 CPL P3.5 ;接入继电器,然后会哒哒哒的响,酷炫无比 DJNZ R3,ROTATE2 MOV R3,#NUMMOVE MOV R4,A ;R4是亮的状态,记下来,待会闪烁的时候要用到 MOV A,#00H ;重新设置灯都灭掉 MOVX DPTR,A RET SHINE: ;当球到达一方之后,会不断地闪烁 MOV A,R4 MOVX DPTR,A CPL P3.5 LCALL DELAY MOV A,#00H MOVX DPTR,A CPL P3.5 LCALL DELAY DJNZ R5,SHINE MOV R5,
15、#NUMSHINE RET;*击球&闪烁程序 ;*显示比分程序 ;显示字符子程序;输入: R6,位置 R7,值DISLED: PUSH DPH ;保存现场 PUSH DPL PUSH ACC MOV A,#LEDWR0 ;置显示起始地址 ADD A,R6 ;加位置偏移量 MOV DPTR,#Z8279 MOVX DPTR,A ;设定显示位置 MOV DPTR,#LEDSEG ;置显示常数表起始位置 MOV A,R7 MOVC A,A+DPTR ;查表 MOV DPTR,#D8279 MOVX DPTR,A ;显示数据 POP ACC ;恢复现场 POP DPL POP DPH RETDISPL
16、AY: PUSH ACC MOV A,BOARDB ;显示B的得胜局数在0号灯 ANL A,#0FH MOV R7,A MOV R6,#0 LCALL DISLED MOV A,BOARDA ;显示A的得胜局数在7号灯 ANL A,#0FH MOV R7,A MOV R6,#7 LCALL DISLED ;MOV R0,01H ;LCALL DELAY MOV A,SCOREA ;显示A的得分低位在4号灯 DA A ANL A,#0FH MOV R7,A MOV R6,#4 LCALL DISLED MOV A,SCOREA ;显示A的得分高位在5号灯 DA A SWAP A ANL A,#0
17、FH MOV R7,A MOV R6,#5 LCALL DISLED MOV A,SCOREB ;显示B的得分低位在2号灯 DA A ANL A,#0FH MOV R7,A MOV R6,#2 LCALL DISLED MOV A,SCOREB ;显示B的得分高位在2号灯 DA A SWAP A ANL A,#0FH MOV R7,A MOV R6,#3 LCALL DISLED POP ACC RET;*显示比分程序 ;*读取键盘子程序,鬼才要管里面什么意思呢*;输入: 无 ; 输出: B: 读到的键码 A: 按键的标志GETKEY: PUSH DPH ;保存现场 PUSH DPL PUSH
18、 PSW MOV DPTR,#Z8279 MOVX A,DPTR ;读8279状态 ANL A,#07H ;屏蔽D7-D3 JNZ GETVAL ;判断是否有键输入 MOV A,#0H ;置标志(无键输入) SJMP NKBHITGETVAL: MOV A,#READKB ;读 FIFO RAM 命令 MOVX DPTR,A MOV DPTR,#D8279 MOVX A,DPTR ;读键 ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 键 MOV DPTR,#KEYCODE ;键码表起始地址 MOVC A,A+DPTR ;查表 MOV B,A ;置返回键值 MOV A,#0FFH ;置
19、标志(有键输入)NKBHIT: POP PSW ;恢复现场 POP DPL POP DPH RET;*读取键盘子程序,鬼才要管里面什么意思呢 INIT_ALL: MOV A,06H MOV SPEED,A INIT_8255: ;初始化8255芯片 MOV DPTR,#D8255 MOV A,#82H ;置8255状态 ;方式0,PA,PC口输出,PB口输入 MOVX DPTR,A MOV DPTR,#D8255A RETINIT8279: ;8279初始化子程序 PUSH DPH ;保存现场 PUSH DPL PUSH ACC MOV DPTR ,#Z8279 MOV A,#LEDMOD ;
20、置8279工作方式 MOVX DPTR,A MOV A,#LEDFEQ ;置键盘扫描速率 MOVX DPTR,A MOV A,#LEDCLS ;清除 LED 显示 MOVX DPTR,A POP ACC ;恢复现场 POP DPL POP DPH RETINVALID_8279: ;为了使得球弹跳期间的键盘输入动作无效 MOV DPTR,#Z8279 MOV A,#DELETE MOVX DPTR,A MOV A,#READKB ;重新设置 MOVX DPTR,A RET DELAY: ;延时子程序(1秒-A, 0.5秒-5) PUSH R0 PUSH R1 PUSH R2 ;MOV R0,#
21、05H ;可以控制回球的速度DELAY2: MOV R1,#00HDELAY3: MOV R2,#0B2H DJNZ R2,$ DJNZ R1,DELAY3 DJNZ R0,DELAY2 POP R0 POP R1 POP R2 RETLEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,F DB 6DH,02H,08H,00H,59H,0FH,76H ;U,-,_, ,I,O,P, ;键盘键码表KEYCODE:DB 30H,31H,32H,33H,34H,35H,36H,37H ;0,1,2,3,4,5,6,7 DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;8,9,A,B,C,D,D,F END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1