⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 我自己写的一个C51双机通信的程序,是一个双人猜数字的小游戏,使用方法见压缩包里的键盘手册
💻 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 + -