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

📄 main.c

📁 基于AVR单片机(ATMega64)的辞别力拼图游戏
💻 C
字号:
/*电子拼图
  建立时间:     2007 3 9
  最后修改时间: 2007 3 11
  广东工业大学自动化学院自动化04级3班吴子洲 */

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define L_ch() PORTD^=0x10;
#define L_off() PORTD&=~0x10;

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/crc16.h>
#include "lib.c"
#include "lcd_cn.c"
#include "key.c"

uchar val __attribute__((section(".eeprom"))) =0x00; 	// jump over address 000
uint SEEK __attribute__((section(".eeprom")))=0x00;	//seek
uchar va2 __attribute__((section(".eeprom")))=0x00;	//jump over address 0x01

volatile uchar su;


void d_ini(void)
{
 uint tmp;
 sor=0;
 sorf=0;
 su=0;
 tmp=eeprom_read_word(&SEEK);
 srand(tmp); 
 tmp++;		//每次启动+1, 使随机数的种子不同
 eeprom_write_byte(&SEEK,tmp); 
}//*/

void s_ini(void)
{
 PORTD=0x00; 
 DDRD=0xf0;
 PORTC=0x00;
 DDRC=0x03;
 PORTB=0x00;
 DDRB=0xff;
 PORTA=0x00;
 DDRA=0xff;
 d_ini(); 
}

uchar RAND(uchar n)	//
{
 uchar ret;
 ulong tp,tp2;
 //srand(15);
 dy(10);
 tp2=rand(15);
 tp=(tp2*(n))>>15;
 ret=tp;
 return ret;
}

void wash(void)		//洗牌
{
 uchar i,j,tmp;
 clr(3);
 clr(8);
 for(i=0;i<15;i++)
   {
    tmp=RAND(15);
	for(j=0;j<i;)
	  {
	   if(tmp==ss[j])	//数据重复, 重新生成
	      {
		   tmp=RAND(15);
		   j=0;		
		  }	     
		else
		  j++;
	  }
	ss[i]=tmp;
   } 
  ss[15]=0xff;
}



void succ(void)
{
 uchar i,j;
 j=0;
 for(i=0;i<15;i++)
    {
	 if(ss[i]==i)
	     j++;
    }
 if(j==15)
    su=1;
}		//*/


int main(void)
{
 uchar kv=0xff;
 uchar su0=0;
 uchar en=0;
 uchar x,y;
 uchar tmp;
 s_ini();
 delay(10);
 
 lcd_ini();
 delay(10);
 
 wash();
 sorf=0;
 wsor();
 wp();
  
 while(1)
  {
   kv=key();
   
   if(su)
     {
	   if(su0==0)
	     {
		  su0=1;
		  clr(8);
		  wu(CN1[0],CN1[1],CN1[2],CN1[3]);
		 }
	   if(kv==14)
	      {
		   wash();
		   wsor();
		  }
	 }
   else			//
     {
	  x=sor%4;
	  y=sor/4;   
     if(kv==1&&x)		//left
       {
	    if(sorf&&ss[sor-1]==0xff)	//允许左移条件
		   ss[sor-1]=ss[sor], ss[sor]=0xff,sorf=0,sor--,wsor();
	    else if(sorf==0)
	       sor--,wsor();		
	   }
     else if(kv==2&&y<3)	//down
       {
	    if(sorf&&ss[sor+4]==0xff)	//允许下移条件
		   ss[sor+4]=ss[sor],ss[sor]=0xff,sorf=0,sor+=4,wsor();
	    else if(sorf==0)
	       sor+=4,wsor();
	   }
     else if(kv==3&&x<3)	//right
       {
	    if(sorf&&ss[sor+1]==0xff)	//允许右移条件
			ss[sor+1]=ss[sor],ss[sor]=0xff,sorf=0,sor++,wsor();
	    else if(sorf==0)
			sor++,wsor();	  
	   }
     else if(kv==7&&y)	//up
       {
	    if(sorf&&ss[sor-4]==0xff)	//允许上移条析
		      ss[sor-4]=ss[sor],ss[sor]=0xff,sorf=0,sor-=4,wsor();
	    else if(sorf==0)
	          sor-=4,wsor();
	   }
     else if(kv==10)		//选定
       {
	    if(sorf)		//取消选定
		   sorf=0,wsor();
		else
		   {
		    if(x&&ss[sor-1]==0xff)	//可以左移
			   en=1;
			else if(x<3&&ss[sor+1]==0xff)	//可以右移
			   en=1;
			else if(y&&ss[sor-4]==0xff)	//可以上移
			   en=1;
			else if(y<3&&ss[sor+4]==0xff)	//可以下移
			   en=1;
			if(en)
			   {
			    en=0;
				sorf=1;
				wsor();
			   }
		   }
	   }
	 else if(kv==14)
	    {
		 wash();
		 wsor();
		}
	 		//
	 succ();		//判断是否成

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -