📄 zuoye.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 + -