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

📄 zuoye.c

📁 根据液晶显示器中的提示
💻 C
字号:
#include<avr/io.h>
#include<avr/pgmspace.h>
#include<stdlib.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
#include"start.h"
#include"lose.h"
#include"success.h"
#define PPI_0_PA (unsigned char *)0x5000
#define PPI_0_PB (unsigned char *)0x5001
#define PPI_0_PC (unsigned char *)0x5002
#define PPI_0_CT (unsigned char *)0x5003
#define PPI_1_PB (unsigned char *)0x6001
#define PPI_1_PC (unsigned char *)0x6002
#define PPI_1_CT (unsigned char *)0x6003
#define TLCD_CTRL (unsigned char *)0x7000
#define TLCD_DATA (unsigned char *)0x7001

volatile const char string_data1[] = "START GAME...";
volatile const char string_data2[] = "GAME OVER...";
volatile const char string_data3[] = "YOU WIN...";
volatile const char string_data4[] = "EASY...";
volatile const char string_data5[] = "HARD...";
volatile const char string_data6[] = "EXPERT...";
volatile const char string_data7[] = "CHOOSE THE LEVEL...";
volatile const char string_data8[] = "PLEASE CONFIRM...";

unsigned char unit[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};			//显示点
unsigned char change[]={0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00};		//第一点
unsigned char status[]={0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00};		//状态
unsigned char font[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};    		//随机点
unsigned char eraser[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};		//擦除最后一点
unsigned char win[]={0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00};unsigned char blank[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

unsigned char *line,*green,*red,*ppi_ctrl0,*ppi_ctrl1,*ppi_pb,*key,*lcd_data,*lcd_control;
int leader_i=0,leader_j=0,position_i=7,position_j=6,N=1,color=0,count=0;
unsigned char action[20];
unsigned long cnt;

void initialize_ppi(void);
void delay(int d1,int d2);
void display(unsigned char *code,unsigned char color);
void _rand(void);
unsigned char key_scan(void);
unsigned char test(unsigned char *tester);
void operate(unsigned char in);
void status_save(void);
void join(void);
void eat(unsigned char in);
void _eraser(void);
void renew(unsigned char in);
void lcd_control_wait(void);
void lcd_data_wait(void);
void print_message(char *message);
void start(void);
void _win(void);
void lose(void);
void choose(void);

int main (void)
{
	unsigned char i,in,flag=0;
	MCUCR |=(1<<SRE);
	initialize_ppi();
	for(i=0;i<20;i++)
	action[i]=0;
	do{
		_rand();
		flag = test(font);
		if(flag==1) break;
	}while(1);
	start();
	choose();
	do{
		in = key_scan();
		if(in==0x21||in==0x24||in==0x42||in==0x12){
			operate(in);
			flag = test(change);
			if(flag==2){
				cli();
				break;
			}
			_eraser();
			status_save();
			if(((leader_i+800)%8==position_i)&&((leader_j+800)%8==position_j)){
				eat(in);
				status_save();
			if(N>10){
				cli();
				break;
			}
			}
		}
		join();
		display(unit,color);
	  }while(1);
	if(N>10)
		_win();
	else
		lose();
}

void display(unsigned char *code,unsigned char color)
{
  unsigned char i=0,j=0;
  for(j=0;j<8;j++){
    for(i=0;i<8;i++){
	if(color==1){
		*green=blank[i];
		*red=code[i];
	}
	else if(color==2){
			*green=code[i];
			*red=blank[i];
		}
		else if(color==3){
			*green=code[i];
			*red=code[i];
			}
	*line=(0x01<<i);
	delay(100,70);
	}
 }	
}
 
void delay(int d1,int d2)
{
   int i,j;
   for(i=0;i<d1;i++){
    for(j=0;j<d2;j++);
	}
}

void initialize_ppi(void)
{
	line=PPI_0_PA;							//点阵
	green=PPI_0_PB;
	red=PPI_0_PC;
	ppi_ctrl0=PPI_0_CT;
	*ppi_ctrl0=0x80;
	ppi_ctrl1 = PPI_1_CT;					//键盘
	key = PPI_1_PC;
	*ppi_ctrl1 = 0x90;
	ppi_pb = PPI_1_PB;						//音频
	cli();									//中断
	TCNT3H = 0x00;
	TCNT3L = 0x00;
	TCCR3B = 0x02;
	ETIMSK = 0x04;
	
	*key = 0x00;
	
	lcd_control = TLCD_CTRL;				//LCD初始化
	lcd_data = TLCD_DATA;
	
	lcd_control_wait();
	*lcd_control = 0x38;
	lcd_control_wait();
	
	*lcd_control = 0x02;
	lcd_control_wait();
	
	*lcd_control = 0x01;
	lcd_control_wait();
	
	*lcd_control = 0x06;
	lcd_control_wait();
	
	*lcd_control = 0x0c;
	lcd_control_wait();
}
 
void _rand(void)							//随机产生一个点
{
	position_i = rand()%8;
	position_j = rand()%8;
	font[position_i] = (1<<position_j);
}

unsigned char key_scan(void)				//键扫描
{
	unsigned char save_low,save_high;
	*ppi_ctrl1 = 0x91;
	*key = 0xf0;
	delay(10,10);
	save_low = *key&0x0f;
	*ppi_ctrl1 = 0x90;
	*key = 0x00;
	if(save_low){
	*ppi_ctrl1 = 0x98;
	*key = 0x0f;
	delay(10,10);
	save_high = *key&0xf0;
	*ppi_ctrl1 = 0x90;
	*key = 0x00;
	if(!save_high)
	return 0;
	save_high |= save_low;
	return save_high;
	}
	return 0;
}

void operate(unsigned char in)        			//第一个点的操作
{
	unsigned char i=0,k=0;
	switch(in){
		case 0x21:	k = change[0];						//上
					for(i=0;i<7;i++)
					change[i] = change [i+1];
					change[7] = k;
					leader_i--;
					renew(in);
					break;
		case 0x24:	k = change[7];						//下
					for(i=7;i>0;i--)
					change[i] = change[i-1];
					change[0] = k;
					leader_i++;
					renew(in);
					break;
		case 0x12: 	for(i=0;i<8;i++){					//左
	                if(change[i]==0x01)
					change[i]=0x80;
				    else
					change[i] >>= 1;
					}
					leader_j--;
					renew(in);
		            break;
		case 0x42:	for(i=0;i<8;i++){					//右
					if(change[i]==0x80)
					change[i]=0x01;
					else
					change[i] <<= 1;
					}
					leader_j++;
					renew(in);
					break;
		default: break;
}
}

void _eraser(void)
{
	unsigned n1=0,n2=0,n3=0,n4=0,i,eraser_i,eraser_j;
	for(i=0;i<N;i++){
		if(action[i]==0x21) n1++;								//上
		else 	if(action[i]==0x24) n2++;						//下
				else 	if(action[i]==0x12) n3++;				//左
						else if(action[i]==0x42) n4++;		//右
	}
	eraser_i=leader_i-n2+n1;
	eraser_j=leader_j+n3-n4;
	eraser_i = (eraser_i+800)%8;
	eraser_j = (eraser_j+800)%8;
	eraser[eraser_i]=~(1<<eraser_j);
}

void status_save(void)
{
	unsigned char i;
	for(i=0;i<8;i++){
		status[i] |= change[i];
		status[i] &= eraser[i];
	}
	for(i=0;i<8;i++)
	eraser[i]=0xff;
}

void renew(unsigned char in)				//第一点的操作过程纪录
{	
	unsigned char i;
	for(i=19;i>0;i--)
		action[i]=action[i-1];
	action[0] = in;
}

void eat(unsigned char in)
{
	unsigned char i;
	for(i=0;i<8;i++)
		font[i]=0x00;
	N++;
	operate(in);
	_rand();
}

void join(void)
{
	unsigned char i;
	for(i=0;i<8;i++)
		unit[i]=status[i] | font[i];
}

unsigned char test(unsigned char *tester)
{
	unsigned char i;
	for(i=0;i<8;i++)
		if(status[i] != (status[i] | tester[i]))
		break;
	if(i!=8) return 1;
	else return 2;
}

void print_message(char *message)
{
	unsigned char i;
	for(i=0;;i++){
		if(message[i]=='\0')
		break;
		else if(message[i]=='\r'){
			*lcd_control = 0xc0;
			lcd_control_wait();
			}
			else{
				*lcd_data = message[i];
				lcd_data_wait();
			}
	}
}

void lcd_control_wait(void)
{
	delay(1000,100);
}

void lcd_data_wait(void)
{
	delay(1000,100);
}

void start(void)
{
	print_message((char *)string_data1);
	for(cnt=0;cnt<7087;cnt++){
		*ppi_pb=PRG_RDB(&snd_data1[cnt]);
		delay(10,30);
	}
}

void _win(void)
{
	*lcd_control = 0x01;
	lcd_control_wait();
	print_message((char *)string_data3);
	for(cnt=0;cnt<1179;cnt++){
	*ppi_pb = PRG_RDB(&snd_data3[cnt]);
	delay(10,30);
	}
	do{
		display(win,color);
	}while(1);
}

void lose(void)
{
	*lcd_control = 0x01;
	lcd_control_wait();
	print_message((char *)string_data2);
	for(cnt=0;cnt<23406;cnt++){
		*ppi_pb = PRG_RDB(&snd_data2[cnt]);
		delay(10,30);
	}
	do{
		display(eraser,color);
	}while(1);
}

void choose(void)
{
	unsigned char in;
	color = 0;
	*lcd_control = 0x01;
	lcd_control_wait();
	print_message((char *)string_data7);
	do{
		in = key_scan();
		switch(in){
			case 0x81:	*lcd_control = 0x01;
						lcd_control_wait();
						print_message((char *)string_data4);
						color = 1;
						TCNT3H = 0x27;
						TCNT3L = 0xf5;
						break;
			case 0x82:	*lcd_control = 0x01;
						lcd_control_wait();
						print_message((char *)string_data5);
						color = 2;
						TCNT3H = 0x6f;
						TCNT3L = 0xf5;
						break;
			case 0x84:	*lcd_control = 0x01;
						lcd_control_wait();
						print_message((char *)string_data6);
						color = 3;
						TCNT3H = 0xb7;
						TCNT3L = 0xf6;
						break;
			default: break;
		}
		if(color!=0)
			break;
	}while(1);
	delay(1500,1500);
	*lcd_control = 0x01;
	lcd_control_wait();
	print_message((char *)string_data8);
	do{
		in = key_scan();
		if(in==0x88){
			sei();
			break;
		}
	}while(1);
}

SIGNAL(SIG_OVERFLOW3)
{
	if(color==1)
	{
		TCNT3H = 0x27;
		TCNT3L = 0xf5;
	}
	else if(color==2)
		{
			TCNT3H = 0x6f;
			TCNT3L = 0xf5;
		}
		else if(color==3)
			{
				TCNT3H = 0xb7;
				TCNT3L = 0xf6;
			}
	count++;
	if(count>1000)
		lose();
}

⌨️ 快捷键说明

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