单片机实验课程作业乒乓球.docx
- 文档编号:3648232
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:14
- 大小:18.17KB
单片机实验课程作业乒乓球.docx
《单片机实验课程作业乒乓球.docx》由会员分享,可在线阅读,更多相关《单片机实验课程作业乒乓球.docx(14页珍藏版)》请在冰豆网上搜索。
单片机实验课程作业乒乓球
;系统晶振是11.0592MHz
;R0控制延时程序时间R1标记连续发球次数R3设置球弹跳一次的路程R4储存某些情况下8个LED灯的状态R5设置等待击球的时间R6,R7用于LED数码管显示
AGREENEQUP1.0
BGREENEQUP1.1
AREDEQUP1.2
BREDEQUP1.3
SCOREAEQU70H;A的得分
SCOREBEQU71H;B的得分
BOARDAEQU72H;A的得胜局数
BOARDBEQU73H;B的得胜局数
SPEEDEQU74H;存储球的移动速度
LEDMODEQU00H;左边输入八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQEQU2FH;扫描速率
LEDCLSEQU0C1H;清除显示RAM
LEDWR0EQU80H;设定的将要写入的显示RAM地址
LBOARDEQU02H;三局两胜制
LSCOREEQU0BH;11分制
D8255EQU8406H;8255状态/命令口地址
D8255AEQU8400H;8255PA口地址
D8255BEQU8402H;8255PB口地址
D8255CEQU8404H;8255PC口地址
Z8279EQU0FF82H;8279状态/命令口地址
D8279EQU0FF80H;8279数据口地址
BOUNDEQU05H;发球前弹跳的速度
NUMMOVEEQU07H;球从左到右所走的路程
NUMSHINEEQU03H;闪烁的次数
READKBEQU00H;读FIFORAM地址0的命令字
DELETEEQU0C2H;清除FIFORAM
SRIGTHEQU20H.0;设置此处片内RAM为发球权归属,0->A1->B
ORG0000H
AJMPSTART
ORG0040H
START:
MOVR1,#02H
MOVSP,#60H
MOVR5,#NUMSHINE;设置闪烁三次
CLRSRIGTH;设置A初始发球
MOVDPTR,#D8255
MOVA,#82H
MOVX@DPTR,A;置8255状态,方式0,PA,PC口输出,PB口输入
MOVDPTR,#D8255A;DPTR指向A端口
MOVR3,#NUMMOVE;设置路程
MOVA,#0H
MOVSCOREA,A;初始的分数都为0
MOVSCOREB,A
MOVBOARDA,A
MOVBOARDB,A
;可以设置回球的速度为0.5秒
LCALLINIT_ALL
;初始化8279并显示
LCALLINIT8279
MOVR0,#02H
LCALLDELAY
LCALLDISPLAY
;初始化8279并显示
LJMPREPLAY
;************************************************发球总程序
SERVICE:
MOVC,SRIGTH
JNCASERVICE;如果为0,则A发球
LJMPBSERVICE;否则B发球
;************************************************发球总程序
;************************************************A发球程序
ASERVICE:
CLRAGREEN;首先设置A方为绿灯,A发球
SETBARED
AWAIT:
;以下为等A发球,同时球在弹跳的程序
MOVR0,#BOUND;设置弹跳为0.1秒一次
MOVR4,#01H
MOVA,R4
MOVDPTR,#D8255A
MOVX@DPTR,A
CPLP3.5
LCALLDELAY
MOVA,#00H
MOVX@DPTR,A
CPLP3.5
LCALLDELAY
LCALLGETKEY;循环等待A方发球
CJNEA,#0FFH,AWAIT
MOVA,B
CJNEA,#30H,AWAIT;如果输入的不是A的发球键,继续循环
ASEND:
;A传球程序
CLRAGREEN
CLRARED
SETBBRED
SETBBGREEN
;可以设置回球的速度为0.5秒
MOVA,SPEED
MOVR0,A
;可以设置回球的速度为0.5秒
MOVA,#01H
LCALLROTATE1;调用A传球程序,把球送到B方
CPLP3.5
LCALLINVALID_8279;要求A传球期间B的按键无效
LCALLINIT_8255
LCALLSHINE;shine持续数秒,期间B可以输入
LCALLGETKEY;读取这一期间的输入
CJNEA,#0FFH,AUDITA;如果没有输入,B失球,开始清算!
!
!
MOVA,B
CJNEA,#36H,AUDITA;如果没有输入(输入错误),B失球,开始清算!
!
LJMPBSEND
;************************************************A发球程序
;B发球程序***********************************************
BSERVICE:
CLRBGREEN;首先设置B方为绿灯,B发球
SETBBRED
BWAIT:
;以下为等B发球,同时球在弹跳的程序
MOVR0,#BOUND;设置弹跳为0.2秒一次
MOVR4,#80H
MOVA,R4
MOVDPTR,#D8255A
MOVX@DPTR,A
CPLP3.5
LCALLDELAY
MOVA,#00H
MOVX@DPTR,A
CPLP3.5
LCALLDELAY
LCALLGETKEY;看B方发球有没有发球
CJNEA,#0FFH,BWAIT
MOVA,B
CJNEA,#36H,BWAIT;如果输入的不是B的发球键,继续循环
BSEND:
;B传球程序
CLRBGREEN
CLRBRED
SETBARED
SETBAGREEN
;可以设置回球的速度为0.5秒
MOVA,SPEED
MOVR0,A
;可以设置回球的速度为0.5秒
MOVA,#80H
LCALLROTATE2;调用B传球程序,把球送到B方
CPLP3.5
LCALLINVALID_8279;要求B传球期间A的按键无效
LCALLINIT_8255
LCALLSHINE;shine持续数秒,期间A可以输入
LCALLGETKEY;读取这一期间的输入
CJNEA,#0FFH,AUDITB;如果没有输入,A失球,开始清算!
!
!
MOVA,B
CJNEA,#30H,AUDITB;如果没有输入(输入错误),A失球,开始清算!
!
LJMPASEND
;************************************************B发球程序
REPLAY:
DJNZR1,RESTA
MOVR1,#02H
CPLSRIGTH
RESTA:
LJMPSERVICE
AUDITA:
CLRBRED
SETBBGREEN
SETBAGREEN
SETBARED
LCALLDELAY
MOVA,SCOREA;A的得分加一
INCA
MOVSCOREA,A
;初始化8279并显示
LCALLDISPLAY
NOP
;初始化8279并显示
CJNEA,#LSCORE,REPLAY;没加够11,则继续玩
LJMPCHECKA;加够11,则进入A的2级清算
AUDITB:
CLRARED
SETBAGREEN
SETBBGREEN
SETBBRED
LCALLDELAY
MOVA,SCOREB;B的得分加一
INCA
MOVSCOREB,A
;初始化8279并显示
LCALLDISPLAY
;初始化8279并显示
CJNEA,#LSCORE,REPLAY;没加够11,则继续玩
LJMPCHECKB;加够11,则进入B的2级清算
CHECKA:
MOVA,#0H;AB的得分清零
MOVSCOREA,A
MOVSCOREB,A
MOVA,BOARDA
INCA
MOVBOARDA,A
;初始化8279并显示
LCALLDISPLAY
;初始化8279并显示
CJNEA,#LBOARD,REPLAY
LJMPAWIN
CHECKB:
MOVA,#0H;AB的得分清零
MOVSCOREA,A
MOVSCOREB,A
MOVA,BOARDB
INCA
MOVBOARDB,A
;初始化8279并显示
LCALLDISPLAY
;初始化8279并显示
CJNEA,#LBOARD,REPLAY
LJMPBWIN
AWIN:
CLRAGREEN
SETBARED
SETBBRED
SETBBGREEN
MOVA,#0H
MOVSCOREA,A
MOVSCOREB,A
MOVBOARDB,A
LCALLDISPLAY
SJMP$
BWIN:
CLRBGREEN
SETBARED
SETBBRED
SETBAGREEN
MOVA,#0H
MOVSCOREA,A
MOVSCOREB,A
MOVBOARDA,A
LCALLDISPLAY
SJMP$
;************************************************击球&闪烁程序
ROTATE1:
;从左向右击球的程序
MOVX@DPTR,A;点亮LED
RLA;循环右移
LCALLDELAY;延时
CPLP3.5;接入继电器,然后会哒哒哒的响,酷炫无比
DJNZR3,ROTATE1
MOVR3,#NUMMOVE
MOVR4,A;R4是亮的状态,记下来,待会闪烁的时候要用到
MOVA,#00H;重新设置灯都灭掉
MOVX@DPTR,A
RET
ROTATE2:
;从右向左击球的程序
MOVX@DPTR,A;点亮LED
RRA;循环右移
LCALLDELAY;延时
CPLP3.5;接入继电器,然后会哒哒哒的响,酷炫无比
DJNZR3,ROTATE2
MOVR3,#NUMMOVE
MOVR4,A;R4是亮的状态,记下来,待会闪烁的时候要用到
MOVA,#00H;重新设置灯都灭掉
MOVX@DPTR,A
RET
SHINE:
;当球到达一方之后,会不断地闪烁
MOVA,R4
MOVX@DPTR,A
CPLP3.5
LCALLDELAY
MOVA,#00H
MOVX@DPTR,A
CPLP3.5
LCALLDELAY
DJNZR5,SHINE
MOVR5,#NUMSHINE
RET
;************************************************击球&闪烁程序
;***********************************************显示比分程序
;显示字符子程序
;输入:
R6,位置R7,值
DISLED:
PUSHDPH;保存现场
PUSHDPL
PUSHACC
MOVA,#LEDWR0;置显示起始地址
ADDA,R6;加位置偏移量
MOVDPTR,#Z8279
MOVX@DPTR,A;设定显示位置
MOVDPTR,#LEDSEG;置显示常数表起始位置
MOVA,R7
MOVCA,@A+DPTR;查表
MOVDPTR,#D8279
MOVX@DPTR,A;显示数据
POPACC;恢复现场
POPDPL
POPDPH
RET
DISPLAY:
PUSHACC
MOVA,BOARDB;显示B的得胜局数在0号灯
ANLA,#0FH
MOVR7,A
MOVR6,#0
LCALLDISLED
MOVA,BOARDA;显示A的得胜局数在7号灯
ANLA,#0FH
MOVR7,A
MOVR6,#7
LCALLDISLED
;MOVR0,01H
;LCALLDELAY
MOVA,SCOREA;显示A的得分低位在4号灯
DAA
ANLA,#0FH
MOVR7,A
MOVR6,#4
LCALLDISLED
MOVA,SCOREA;显示A的得分高位在5号灯
DAA
SWAPA
ANLA,#0FH
MOVR7,A
MOVR6,#5
LCALLDISLED
MOVA,SCOREB;显示B的得分低位在2号灯
DAA
ANLA,#0FH
MOVR7,A
MOVR6,#2
LCALLDISLED
MOVA,SCOREB;显示B的得分高位在2号灯
DAA
SWAPA
ANLA,#0FH
MOVR7,A
MOVR6,#3
LCALLDISLED
POPACC
RET
;************************************************显示比分程序
;*读取键盘子程序,鬼才要管里面什么意思呢*******************************
;输入:
无;输出:
B:
读到的键码A:
按键的标志
GETKEY:
PUSHDPH;保存现场
PUSHDPL
PUSHPSW
MOVDPTR,#Z8279
MOVXA,@DPTR;读8279状态
ANLA,#07H;屏蔽D7-D3
JNZGETVAL;判断是否有键输入
MOVA,#0H;置标志(无键输入)
SJMPNKBHIT
GETVAL:
MOVA,#READKB;读FIFORAM命令
MOVX@DPTR,A
MOVDPTR,#D8279
MOVXA,@DPTR;读键
ANLA,#3FH;屏蔽SHIFT和CTRL键
MOVDPTR,#KEYCODE;键码表起始地址
MOVCA,@A+DPTR;查表
MOVB,A;置返回键值
MOVA,#0FFH;置标志(有键输入)
NKBHIT:
POPPSW;恢复现场
POPDPL
POPDPH
RET
;***************************************读取键盘子程序,鬼才要管里面什么意思呢
INIT_ALL:
MOVA,06H
MOVSPEED,A
INIT_8255:
;初始化8255芯片
MOVDPTR,#D8255
MOVA,#82H;置8255状态
;方式0,PA,PC口输出,PB口输入
MOVX@DPTR,A
MOVDPTR,#D8255A
RET
INIT8279:
;8279初始化子程序
PUSHDPH;保存现场
PUSHDPL
PUSHACC
MOVDPTR,#Z8279
MOVA,#LEDMOD;置8279工作方式
MOVX@DPTR,A
MOVA,#LEDFEQ;置键盘扫描速率
MOVX@DPTR,A
MOVA,#LEDCLS;清除LED显示
MOVX@DPTR,A
POPACC;恢复现场
POPDPL
POPDPH
RET
INVALID_8279:
;为了使得球弹跳期间的键盘输入动作无效
MOVDPTR,#Z8279
MOVA,#DELETE
MOVX@DPTR,A
MOVA,#READKB;重新设置
MOVX@DPTR,A
RET
DELAY:
;延时子程序(1秒--A,0.5秒--5)
PUSHR0
PUSHR1
PUSHR2
;MOVR0,#05H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;可以控制回球的速度
DELAY2:
MOVR1,#00H
DELAY3:
MOVR2,#0B2H
DJNZR2,$
DJNZR1,DELAY3
DJNZR0,DELAY2
POPR0
POPR1
POPR2
RET
LEDSEG:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;'0,1,2,3,4,5,6,7'
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H;'8,9,A,B,C,D,E,F'
DB6DH,02H,08H,00H,59H,0FH,76H;'U,-,_,,I,O,P,'
;键盘键码表
KEYCODE:
DB30H,31H,32H,33H,34H,35H,36H,37H;'0,1,2,3,4,5,6,7'
DB38H,39H,3AH,3BH,3CH,3DH,3EH,3FH;'8,9,A,B,C,D,D,F'
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 课程 作业 乒乓球