五子棋 电子棋盘 单片机8051程序.docx
《五子棋 电子棋盘 单片机8051程序.docx》由会员分享,可在线阅读,更多相关《五子棋 电子棋盘 单片机8051程序.docx(14页珍藏版)》请在冰豆网上搜索。
![五子棋 电子棋盘 单片机8051程序.docx](https://file1.bdocx.com/fileroot1/2023-1/4/7abe16df-2bf6-471a-8820-94e9ca5e76bd/7abe16df-2bf6-471a-8820-94e9ca5e76bd1.gif)
五子棋电子棋盘单片机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