📄 main.c
字号:
#include "reg51.h"
#include "define.h"
#include "function.h"
#include "stdio.h"
unsigned int guess,start,nbit,tmr,nbset,mnset,ynset,repeat;
signed char nn,y[5],m[5],r1[1],r2[1],n[5],r=2,a,c;
//start 开始标志位,当start=3时,双方同意游戏,start=5时,双方就绪,开始通信
//nbit 猜的位数,最大为5,最小为1
//nn 中间变量,用来控制数组y[n]
//y[5] 数组,用来存放对主发过来的数
//m[5] 数组,用来存放已方设置的数
//guess 标志位,判断对方猜了没有,因为这个游戏是回合制的
//r1[1] 数组,用来存放结果,即已方猜对多少个
//r2[1] 数组,用来存放结果,即对方猜对多少个
//r=2 中间变量,用来控制数组r1[1],r2[2]
//c 中间变量,用来控制数字的发送
//nbset 标志位,是否已设置了要猜的位数,只能由提出游戏的人设定
//mnset 标志位,判断已方设置了要给对方猜的数没有
//ynset 标志位,判断对方设置了要给已方猜的数没有
//repeat标志位,判断输入的数字是否有重复,因为这个游戏是由不重复的数字组成的
//a 中间变量,控制数组n[5]
//n[5] 数组,记录输入的一串数字,然后将值传给y[5]或m[5]
//************************外部中断2函数*********************************
//*** 进行时钟数值的设置 ***
//**********************************************************************
void keyboard (void) interrupt 2
{
signed char key_number,b,num,i,p;
//key_number键值
//b 标志,判断是否输入有效的数字
//num 中间变量,用来记录输入的值
//i 中间变量,控制循环,判断输入的数是否和前面输入的数重复
//p 中间变量,和i配合使用
key_number=read7279(CMD_READ);
a=0;
n[0]=0;
n[1]=0;
n[2]=0;
n[3]=0;
n[4]=0;
if (key_number==0x04) //是否邀请或同意游戏***********************************
{
if (start==0)
{start+=2;SBUF=0x11;delay10ms(10);send_byte(CMD_RESET);write7279(DECODE0+6, start);nbset=1;}
if (start==1)
{start+=2;SBUF=0x11;delay10ms(10);send_byte(CMD_RESET);write7279(DECODE0+6, start);}
if (start==3)
write7279(UNDECODE+6, 0x01);
}
if (start>=3 && nbset==1)//输入数值
{
if (guess!=1) guess=0;
if (start>5) start=5;
key_number=0xff;
b=0;
if (nbit==0) {a=1;write7279(UNDECODE+6, 0x01);}
else {a=nbit+1;write7279(DECODE0+6, nbit);}
do//开始输入数值
{
if (!key)
{
key_number=read7279(CMD_READ);
if (guess!=1) guess=0;//有点诡异,guesst和start的值会乱飞,用这两句来控制
if (start>5) start=5;
if (a==nbit+1 && nbit!=0)
{
write7279(UNDECODE+4, 0x00);
write7279(UNDECODE+3, 0x00);
write7279(UNDECODE+2, 0x00);
write7279(UNDECODE+1, 0x00);
write7279(UNDECODE, 0x00);
write7279(DECODE0+6, nbit);
}
if (key_number==0x07) {num=7;a--;b=1;};//是否有效输入及判断数值
if (key_number==0x06) {num=8;a--;b=1;};
if (key_number==0x05) {num=9;a--;b=1;};
if (key_number==0x0F) {num=4;a--;b=1;};
if (key_number==0x0E) {num=5;a--;b=1;};
if (key_number==0x0D) {num=6;a--;b=1;};
if (key_number==0x17) {num=1;a--;b=1;};
if (key_number==0x16) {num=2;a--;b=1;};
if (key_number==0x15) {num=3;a--;b=1;};
if (key_number==0x1f) {num=0;a--;b=1;};
if (b==1)
{
p = a;
for (i=nbit-1;i>p-1;i--)//循环,判断输入的数是否重复
{
if (num==n[i])
{
a++;
repeat=1;
write7279(BLINKCTL,0xe0);
delay10ms(50);
write7279(BLINKCTL,0xff);
break;
}
}
}
if (a!=0 && a!=nbit)
{
if (b==1 && repeat==0)
{
send_byte(RTL_UNCYL);//输入有效数字时左移一位
if (nbit==0)
write7279(UNDECODE+6, 0x01);
else
write7279(DECODE0+6, nbit);
if (start==4) write7279(UNDECODE+5, 0x01);
if (start==5 && guess==0) write7279(UNDECODE+5, 0x48);
if (start==5 && guess==1) write7279(UNDECODE+5, 0x49);
}
}
if (b==1 && repeat==0) write7279(0x80, num);//显示输入的数值
b=0;
if (nbit!=0 && repeat==0)
{
if (a==nbit && a>=0)
n[a-1]=num;
if (a==(nbit-1) && a>=0)
n[a-1]=num;
if (a==(nbit-2) && a>=0)
n[a-1]=num;
if (a==(nbit-3) && a>=0)
n[a-1]=num;
if (a==(nbit-4) && a>=0)
n[a-1]=num;
}
if (key_number==0x14) //如果设置不好,可以退回重新设置上一个
{
write7279(UNDECODE+6, 0x00);
write7279(UNDECODE+5, 0x00);
send_byte(RTR_UNCYL);
a++;
if (nbit==0)
write7279(UNDECODE+6, 0x01);
else
write7279(DECODE0+6, nbit);
if (start==4) write7279(UNDECODE+5, 0x01);
if (start==5 && guess==0) write7279(UNDECODE+5, 0x48);
if (start==5 && guess==1) write7279(UNDECODE+5, 0x49);
}
while (!key);//等待键盘扫描结束以便输入下个数值
if (a<1)
a=1;//控制a的范围
if (nbit!=0 && a>nbit+1)
a=nbit+1;
repeat=0;
}
}
while (key_number!=0x0c && key_number!=0x1c);//确认发送或投降认输
if (key_number==0x0c)//确定或发送
{
if (nbit!=0 && a==1)//输入了完整的数组
{
if (mnset!=0 && ynset==0)
{
write7279(BLINKCTL,0xe0);
delay10ms(50);
write7279(BLINKCTL,0xff);
}
// if (ynset==128)
// {
if (guess!=1) guess=0;
if (start>5) start=5;
if (start==5 && guess==0 )//如果全部就绪,就将数组发给对方去验证
{
c=nbit;
do
{
SBUF=0x50+n[c-1];
delay10ms(10);
c--;
}
while (c>0);
guess=1;
write7279(UNDECODE+5, 0x49);
}
// }
if (start==4 && mnset==0)//如果自己的数组还没设,就将输入的数组赋给它
{
c=nbit;
do
{
m[c-1]=n[c-1];
c--;
}
while (c>0);
write7279(UNDECODE+5,0x48);
start++;
SBUF=0x40;
delay10ms(10);
mnset=1;
}
}
if (nbit==0 && a==1 && num<6) //如果要猜的位数还没设,就把输入的值给nbit
{
nbit=num;
nn=num;
SBUF=0x20+nbit;
delay10ms(10);
send_byte(CMD_RESET);
write7279(UNDECODE+5, 0x01);
write7279(DECODE0+6, nbit);
start++;
};
}
}
if (key_number==0x1c) //投降认输
{
send_byte(CMD_RESET);
SBUF=0x1f;
delay10ms(10);
start=0;
nbit=0;
nbset=0;
mnset=0;
ynset=0;
write7279(DECODE0+3, 0x00);
}
while (!key);//等待键盘扫描结束以便输入下个数值
}
//**********************串口中断*****************************************
//*** 进行两机间的数据交换 ****
//***********************************************************************
void serial(void) interrupt 4
{
signed char h,l,i,j,z;
if (RI==1)
{
h=SBUF>>4;//对收到的数拆分,高位h为标识符,低位l为对应的数值
l=SBUF&0x0f;
if (h==1 && l!=0x0f && start<3) //h=1是否开始,或投降
{
start+=l;
send_byte(CMD_RESET);
write7279(DECODE0+6,start);
if (start==3)
write7279(UNDECODE+6, 0x01);
}
if (h==1 && l==0x0f)//投降
{
start=0;
nbit=0;
nbset=0;
mnset=0;
ynset=0;
send_byte(CMD_RESET);
write7279(DECODE0+3, 0x01);
//
}
if (start>=3)//双方就绪,判断收到的数
{
if (h==2) //h=2 要猜的位数
{
nbit=l;
nn=nbit;
nbset=1;
write7279(DECODE0+6, nbit);
write7279(UNDECODE+5, 0x01);
start++;
}
if (h==4) //h=3 对方是否已设定好要让你猜的数组
{
ynset=128;
write7279(DECODE0+6, nbit+ynset);
start++;
}
if (h==5) //h=5 对方发过来的要让你验证的数组
{
y[nn-1]=l;
nn--;
if (nn==0) //收完了对方发过来的数组,跟自己设好的数组对比一下
{
nn=nbit;
guess=0;
write7279(UNDECODE+5, 0x48);
z=0;
r2[1]=0;
r2[0]=0;
for (i=nbit-1;i>=0;i--)
{
if (y[i]==m[i])
r2[1]++;
}
for (i=nbit-1;i>=0;i--)
{
for (j=0;j<nbit;j++)
if (y[i]==m[j])
z++;
}
r2[0]=z-r2[1];
SBUF=0x60+r2[1];//返回对方猜对的个数
delay10ms(10);
SBUF=0x60+r2[0];
delay10ms(10);
if (r2[1]==nbit) //如果全对,已方认输
{
SBUF=0x1f;
delay10ms(10);
start=0;
nbit=0;
nbset=0;
mnset=0;
ynset=0;
send_byte(CMD_RESET);
write7279(DECODE0+3, 0x00);
}
}
}
if (h==6) //h=6 对方发来的结果,即你猜对了多少个
{
r1[r-1]=l;
r--;
if (r==0)
{
r=2;
a=nbit+1;
write7279(UNDECODE+4,0x00);
write7279(DECODE1,0x0b);
write7279(DECODE0+1,r1[0]);
write7279(DECODE1+2,0x0a);
write7279(DECODE0+3,r1[1]);
}
}
}
RI=0;
}
if (TI==1) //退出中断
TI=0;
}
//**********************主函数************************************
//
//***************************************************************
void main()
{
unsigned int tt;
for (tmr=0;tmr<0x2000;tmr++);//测试
send_byte(CMD_RESET);
send_byte(CMD_TEST);
for (tt=0;tt<2;tt++) {delay10ms(100);}
send_byte(CMD_RESET);
init();//初始化
write7279(DECODE0+6,start);
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -