五子棋 电子棋盘 单片机8051程序.docx

上传人:b****6 文档编号:6173867 上传时间:2023-01-04 格式:DOCX 页数:14 大小:18.80KB
下载 相关 举报
五子棋 电子棋盘 单片机8051程序.docx_第1页
第1页 / 共14页
五子棋 电子棋盘 单片机8051程序.docx_第2页
第2页 / 共14页
五子棋 电子棋盘 单片机8051程序.docx_第3页
第3页 / 共14页
五子棋 电子棋盘 单片机8051程序.docx_第4页
第4页 / 共14页
五子棋 电子棋盘 单片机8051程序.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

五子棋 电子棋盘 单片机8051程序.docx

《五子棋 电子棋盘 单片机8051程序.docx》由会员分享,可在线阅读,更多相关《五子棋 电子棋盘 单片机8051程序.docx(14页珍藏版)》请在冰豆网上搜索。

五子棋 电子棋盘 单片机8051程序.docx

五子棋电子棋盘单片机8051程序

 

简易电子棋盘程序设计

 

ORG0000H

AJMPMAIN

ORG000BH

AJMPONEWIN

ORG001BH

AJMPRING

ORG0030H

;****************定时器T1中断子程序

RING:

INCR0

CJNER0,#7FH,RETU

SETBP1.2;若等待8秒未按键,则蜂鸣器响

MOVR0,#0

RETU:

RETI

;*******************主程序

MAIN:

CLRP1.0;所有T触发器复位,所有LED熄灭

MOVTMOD,#10H

MOVTH1,#0

MOVTL1,#0

SETBEA;中断允许

SETBET1;开定时中断1

SETBET0;开定时中断0

SETBP1.0;置位P1.0,T触发器有效,可以点亮LED

MOVDPTR,#7FFFH;键盘端8255A初始化

MOVR0,0;R0初始化

MOVA,#90H;A口输入模式,B口输出模式

MOVX@DPTR,A

MOVDPTR,#BFFH;LED端8255A初始化

MOVA,#80H;A、B口均为输出模式

MOVX@DPTR,A

`SETBTR1;开始计时

KEYSCAN:

ACALLIFPRESS;检查是否有按键按下

JZKEYSCAN;若无按键按下,返回KEYSCAN继续等待

ACALLD10MS;若有按键,延时10ms去抖动处理

ACALLIFPRESS;再次检查是否有按键

JZKEYSCAN;无按键按下,返回KEYSCAN继续等待

KEY1:

MOVR2,#0FEH;使第0行为低电平

MOVR5,#00H;行寄存器清0

KEY2:

MOVDPTR,#7FFDH;扫描行

MOVA,R2

MOVX@DPTR,A

MOVDPTR,#7FFCH;扫描列

MOVXA,@DPTR

CPLA;按键对应位置为1

ANLA,#0FFH

JNZKEY3;该行有键按下,转KEY3

MOVA,R5;无键按下,行值寄存器R5加1

ADDA,#01H

MOVR5,A

MOVA,R2;该行无键按下,下一行置为低电平

RLA

MOVR2,A

JBACC.0,KEY2;8行未全部扫描完,转KEY2继续扫描

AJMPKEYSCAN;8行已扫描完,转KEYSCAN等待下一次按键

KEY3:

MOVR4,A;将按键列值(按键为1)存入R4

CPLA

KEY4:

ACALLD10MS

ACALLIFPRESS

JNZKEY4;等待按键释放,避免按一次键重复计算

CLRP1.2;关闭蜂鸣器

MOVTH1,#0;定时器1清零

MOVTL1,#0

MOVR0,#0;计数寄存器R0清零

MOVA,R2

CPLA

MOVR2,A;按键对应行值(按键为1)存入R2

;*********************点亮LED灯

LIGHT:

CPLP1.1;P1.1高电平绿灯亮,低电平红灯亮

MOVDPTR,#BFFCH;按键对应LED列置1

MOVA,R4

MOV@DPTR,A

MOVDPTR,#BFFDH;按键对应LED行置1

MOVA,R2

MOV@DPTR,A;本次亮灯完成

;**********************按键对应位置1

JBP1.1,GREEN;判断此次点亮的是红色LED还是绿色LED

RED:

MOVA,#20H;红色LED点亮位置存储在片内RAM20H~27H单元

AJMPLO

GREEN:

MOVA,#28H;绿色LED点亮位置存储在片内RAM28H~2FH单元

LO:

ADDA,R5

MOVR6,A

MOVA,R4

ORLA,@R6;与之前的记录进行“或”处理,屏蔽已置1的位

MOV@R6,A;将此次按键位置对应置1

;**********判断输赢

IFWIN:

CLRC

SETBF0

;******************每行横向检查是否已经获胜,共需3*8=24次

JBP1.1,GREEN1

RED1:

MOVR1,#20H;R1中存检查起始地址

AJMPRUN1

GREEN1:

MOVR1,#28H

RUN1:

MOVR7,#05H;每次检测5个格子,用R7控制

MOVR3,#08H;总共有8行,循环8次,用R3控制

MOVR5,#03H;每行需要检查3次,用R5控制

MOVR4,#01H;初始位需左移次数,保存在寄存器R4中

MOVR2,R4;R2中备份R4起始值

WIN1:

MOVA,@R1

RMOV1:

RLCA

DJNZR4,RMOV1

CHECK1:

JCGO1

CLRF0;本次检查有0,不可能已获胜,置F0为0

AJMPBACK1;此次检查不可能获胜,转下一次检查

GO1:

RLCA;循环移位,依次检查下一位

DJNZR7,CHECK1

JBF0,JWIN1;检查完后F0仍为1,则一方获胜

JNBF0,BACK1

JWIN1:

AJMPWIN;程序较长无法用JB直接跳到WIN,采用间接跳转

BACK1:

SETBF0;未胜利,继续检查

MOVR7,#05H;R7寄存器复位

MOVR4,R2;R4寄存器复位

INCR4;初始位左移次数加1

MOVR2,R4;即从上次开始位的下一位开始顺次检查5位DJNZR5,WIN1

INCR1;检查下一行

MOVR5,#03H;R5寄存器复位

MOVR4,#01H;R4寄存器复位

MOVR2,R4

DJNZR3,WIN1

;******************每列纵向检查是否已经获胜,共需3*8=24次

JBP1.1,GREEN2

RED2:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN2

GREEN2:

MOVR1,#28H

RUN2:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H;每次需要检查连续的5个位,用R7控制

MOVR3,#03H;每列需要检查3次,用R3控制

MOVR4,#01H;记录当前检查的是哪一列

MOVR5,R4;R5中备份R4的值

MOVR6,#08H;总共有8列,需循环8次,用R6控制

CHECK2:

MOVA,@R1

RMOV2:

RLCA

DJNZR4,RMOV2;移位至所要的列

JCGO2

CLRF0

AJMPBACK2;此次检查不可能获胜,转下一次检查

GO2:

INCR1;检查当前列下一位

DJNZR7,CHECK2

JBF0,JWIN2;检查完后F0仍为1,则一方获胜

JNBF0,BACK2

JWIN2:

AJMPWIN;若一方胜利,跳至WIN

BACK2:

SETBF0;未胜利,继续检查

MOVR7,#05;R7复位,控制检查5位

MOVR1,R2;R1复位,指向本次起始行

MOVR4,R5

INCR4;R4加一,检查下一列

MOVR5,R4

DJNZR6,CHECK2

MOVR1,R2

INCR1;起始扫描的行值加一

MOVR2,R1;即从该列上次开始行的下一行开始检查连续五位

MOVR4,#01H;R4值复位,从第一列开始

MOVR5,R4;R5值复位,记录R4的初值

MOVR6,#08H;R6值复位

DJNZR3,CHECK2

;*************整体(右)斜向检查是否已经获胜,共需3*3=9次

;WIN31************************第一轮检查

JBP1.1,GREEN31

RED31:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN31

GREEN31:

MOVR1,#28H

RUN31:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H

MOVR3,#03H

MOVR4,#01H;R4记录要移位的次数

MOVR5,R4;R5中备份R4中上一次的值

CHECK31:

MOVA,@R1

MOVE31:

RLCA

DJNZR4,MOVE31

MOVR4,R5

INCR4;每下移一行,要移的位数就加一

MOVR5,R4

JCGO31

CLRF0

AJMPBACK31;此次检查不可能获胜,转下一次检查

GO31:

INCR1

DJNZR7,CHECK31

JBF0,JWIN31;检查完后F0仍为1,则一方获胜

JNBF0,BACK31

JWIN31:

AJMPWIN;若一方胜利,跳至WIN

BACK31:

SETBF0;未胜利,继续检查

MOVR1,R2

INCR1;

MOVR2,R1

MOVR4,#01H;R4,R5中的值复位

MOVR5,R4

DJNZR3,CHECK31

;WIN32************************第二轮检查

JBP1.1,GREEN32

RED32:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN32

GREEN32:

MOVR1,#28H

RUN32:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H

MOVR3,#03H

MOVR4,#02H;R4记录要移位的次数

MOVR5,R4;R5中备份R4中上一次的值

CHECK32:

MOVA,@R1

MOVE32:

RLCA

DJNZR4,MOVE32

MOVR4,R5

INCR4;每下移一行,要移的位数就加一

MOVR5,R4

JCGO32

CLRF0

AJMPBACK32;此次检查不可能获胜,转下一次检查

GO32:

INCR1

DJNZR7,CHECK32

JBF0,JWIN32;检查完后F0仍为1,则一方获胜

JNBF0,BACK32

JWIN32:

AJMPWIN;若一方胜利,跳至WIN

BACK32:

SETBF0;未胜利,继续检查

MOVR1,R2

INCR1;

MOVR2,R1

MOVR4,#02H;R4,R5中的值复位

MOVR5,R4

DJNZR3,CHECK32

;WIN33************************第三轮检查

JBP1.1,GREEN33

RED33:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN33

GREEN33:

MOVR1,#28H

RUN33:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H

MOVR3,#03H

MOVR4,#03H;R4记录要移位的次数

MOVR5,R4;R5中备份R4中上一次的值

CHECK33:

MOVA,@R1

MOVE33:

RLCA

DJNZR4,MOVE33

MOVR4,R5

INCR4;每下移一行,要移的位数就加一

MOVR5,R4

JCGO33

CLRF0

AJMPBACK33;此次检查不可能获胜,转下一次检查

GO33:

INCR1

DJNZR7,CHECK33

JBF0,JWIN33;检查完后F0仍为1,则一方获胜

JNBF0,BACK3

JWIN33:

AJMPWIN;若一方胜利,跳至WIN

BACK33:

SETBF0;未胜利,继续检查

MOVR1,R2

INCR1;

MOVR2,R1

MOVR4,#03H;R4,R5中的值复位

MOVR5,R4

DJNZR3,CHECK33

;*************整体(左)斜向检查是否已经获胜,共需3*3=9次

;WIN41************************第一轮检查

JBP1.1,GREEN41

RED41:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN41

GREEN41:

MOVR1,#28H

RUN41:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H

MOVR3,#03H

MOVR4,#01H;R4记录要移位的次数

MOVR5,R4;R5中备份R4中上一次的值

CHECK41:

MOVA,@R1

MOVE41:

RRCA

DJNZR4,MOVE41

MOVR4,R5

INCR4;每下移一行,要移的位数就加一

MOVR5,R4

JCGO41

CLRF0

AJMPBACK41;此次检查不可能获胜,转下一次检查

GO41:

INCR1

DJNZR7,CHECK41

JBF0,JWIN41;检查完后F0仍为1,则一方获胜

JNBF0,BACK41

JWIN41:

AJMPWIN;若一方胜利,跳至WIN

BACK41:

SETBF0;未胜利,继续检查

MOVR1,R2

INCR1;

MOVR2,R1

MOVR4,#01H;R4,R5中的值复位

MOVR5,R4

DJNZR3,CHECK41

;WIN42************************第二轮检查

JBP1.1,GREEN42

RED42:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN42

GREEN42:

MOVR1,#28H

RUN42:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H

MOVR3,#03H

MOVR4,#02H;R4记录要移位的次数

MOVR5,R4;R5中备份R4中上一次的值

CHECK42:

MOVA,@R1

MOVE42:

RRCA

DJNZR4,MOVE42

MOVR4,R5

INCR4;每下移一行,要移的位数就加一

MOVR5,R4

JCGO42

CLRF0

AJMPBACK42;此次检查不可能获胜,转下一次检查

GO42:

INCR1

DJNZR7,CHECK42

JBF0,JWIN42;检查完后F0仍为1,则一方获胜

JNBF0,BACK42

JWIN42:

AJMPWIN;若一方胜利,跳至WIN

BACK42:

SETBF0;未胜利,继续检查

MOVR1,R2

INCR1;

MOVR2,R1

MOVR4,#02H;R4,R5中的值复位

MOVR5,R4

DJNZR3,CHECK42

;WIN43************************第三轮检查

JBP1.1,GREEN43

RED43:

MOVR1,#20H;*********R1、R7、R3寄存器赋初值

(1)

AJMPRUN43

GREEN43:

MOVR1,#28H

RUN43:

MOVR2,R1;R2中备份R1起始值

MOVR7,#05H

MOVR3,#03H

MOVR4,#03H;R4记录要移位的次数

MOVR5,R4;R5中备份R4中上一次的值

CHECK43:

MOVA,@R1

MOVE43:

RRCA

DJNZR4,MOVE43

MOVR4,R5

INCR4;每下移一行,要移的位数就加一

MOVR5,R4

JCGO43

CLRF0

AJMPBACK43;此次检查不可能获胜,转下一次检查

GO43:

INCR1

DJNZR7,CHECK43

JBF0,JWIN43;检查完后F0仍为1,则一方获胜

JNBF0,BACK43

JWIN43:

AJMPWIN;若一方胜利,跳至WIN

BACK43:

SETBF0;未胜利,继续检查

MOVR1,R2

INCR1;

MOVR2,R1

MOVR4,#03H;R4,R5中的值复位

MOVR5,R4

DJNZR3,CHECK43;扫描结束

AJMPKEYSCAN;没有获胜,返回等待下一次按键

;*****************某一方获胜

WIN:

SETBP1.2;开蜂鸣器

CLRTR1;关闭T1蜂鸣器计时中断

CLRET1

JBP1.1,GREENW

REDW:

MOVTH0,#0F8H;蜂鸣器以某一个频率响起,表示红方胜

MOVTL0,#8CH

AJMPHERE

GREENW:

MOVTH0,#0FCH;蜂鸣器以另一个频率响起,表示绿方胜

MOVTL0,#44H

HERE:

SETBTR0

SJMP$

;****************定时器T0中断子程序

ONEWIN:

JBP1.1,GREENW

REDW:

MOVTH0,#0F8H

MOVTL0,#8CH

AJMPTIME

GREENW:

MOVTH0,#0FCH

MOVTL0,#44H

TIME:

CPLP1.2

RETI

;**************扫描按键子程序

IFPRESS:

MOVDPTR,#7FFDH

MOVA,#00H

MOVX@DPTR,A;B口置0,即行电位全部置低电平

MOVDPTR,#7FFCH;读A口按键信息

MOVA,@DPTR

CPLA

RET

;**************延时10ms子程序

D10MS:

PUSHR2

PUSHR1

MOVR2,#14H

DL1:

MOVR1,#0FFH

DL2:

DJNZR1,DL2

DJNZR2,DL1

POPR1

POPR2

RET

;****************结束

END

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

当前位置:首页 > 表格模板 > 合同协议

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

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