单片机实验课程作业乒乓球.docx

上传人:b****6 文档编号:3648232 上传时间:2022-11-24 格式:DOCX 页数:14 大小:18.17KB
下载 相关 举报
单片机实验课程作业乒乓球.docx_第1页
第1页 / 共14页
单片机实验课程作业乒乓球.docx_第2页
第2页 / 共14页
单片机实验课程作业乒乓球.docx_第3页
第3页 / 共14页
单片机实验课程作业乒乓球.docx_第4页
第4页 / 共14页
单片机实验课程作业乒乓球.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机实验课程作业乒乓球.docx

《单片机实验课程作业乒乓球.docx》由会员分享,可在线阅读,更多相关《单片机实验课程作业乒乓球.docx(14页珍藏版)》请在冰豆网上搜索。

单片机实验课程作业乒乓球.docx

单片机实验课程作业乒乓球

;系统晶振是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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1