📄 main.c
字号:
/**************************************
* copyright:tiany
* time:2008-9-20
**************************************/
#include <reg52.h>
#include "lcd.h"
#include "main.h"
#include "speech.h"
uchar button,buttonflag,menuflag,buttonplay,speed,moveflag,pauseflag;//send/*发球标志位*/;
num_info gamenum;//比分信息结构体
///////////////////////////////
//主程序,菜单选项,
///////////////////////////////
void main()
{
uchar wdata;
speed=3;
EA=1;
EX1=1;//int1
IT1=1;
EX0=1;//int0
IT0=1;
LCD_Initial();
LCD_CLR(R);
put_picture_half(Bmp1,L);
Delay_x10ms(100);LCD_CLR(L);
put_picture_half(Bmp1,L);
Delay_x10ms(100);LCD_CLR(L);
put_picture_half(Bmp1,R);
for(;;)
{
button=0;
buttonflag=0;
menuflag=0;
buttonplay=0;
pauseflag=0;
LCD_CLR(L);LCD_CLR(R);
put_picture_half(Bmp1,R);
put_menu(1,0);
put_menu(2,0);
put_menu(3,0);
wdata=0;
gamenum.mark1=0,gamenum.mark2=0,gamenum.game1=0,gamenum.game2=0;//比赛信息初始化
while(!wdata) //主菜单
{
while(!buttonflag); //等待按键
buttonflag=0;
switch(button)//按键查值
{
case DOWN:
{
put_menu(1,0);
put_menu(2,0);
put_menu(3,0);//刷新
if(menuflag==3) menuflag=1;
else menuflag+=1;
put_menu(menuflag,1);//反白现实选中项
break;
}
case UP:
{
put_menu(1,0);
put_menu(2,0);
put_menu(3,0);//刷新
if(menuflag<=1) menuflag=3;
else menuflag-=1;
put_menu(menuflag,1);//反白现实选中项
break;
}
case ENTER:
{
switch(menuflag)
{
case 1://singlaplay
wdata=singlaplay();
break;
case 2://doubleplay
wdata=doubleplay();
break;
case 3://setingmenu
wdata=settingmenu();//进入下级菜单
break;
default:break;
}
break;
}
case EXIT:break;
default:break;
}
}
}
}
/////////////////////////////////////
//设置难度选项菜单
/////////////////////////////////////
uchar settingmenu()
{
LCD_CLR(L);
put_menu(4,0);
put_menu(5,0);
put_menu(6,0);
menuflag=0;
while(1)
{
while(!buttonflag);//等待按键
buttonflag=0;
switch(button) //按键查值
{
case DOWN:
{
put_menu(4,0);
put_menu(5,0);
put_menu(6,0); //刷新
if(menuflag==3) menuflag=1;
else menuflag+=1;
put_menu(menuflag+3,1);//反白现实选中项
break;
}
case UP:
{
put_menu(4,0);
put_menu(5,0);
put_menu(6,0); //刷新
if(menuflag<=1) menuflag=3;
else menuflag-=1;
put_menu(menuflag+3,1);//反白现实选中项
break;
}
case ENTER:
{
switch(menuflag)//速度设置
{
case 1:speed=1;break;
case 2:speed=4;break;
case 3:speed=7;break;
default:break;
}
return 1;
}
case EXIT:
{
return 1;
}
default:break;
}
}
}
/////////////////////////////////////
//选项按键中断
/////////////////////////////////////
void int1() interrupt 2 using 3
{
P2=0xFF;
buttonflag=1;
button=P2&0xF0;
moveflag=P2&0xF0;
pauseflag=P2&0xF0;
}
/////////////////////////////////////
//菜单输出
/////////////////////////////////////
void put_menu(uchar menuid,uchar reverse)
{
switch(menuid)
{
case 1://单人游戏
{
put_chinese(chinese[0],0,0,reverse);
put_chinese(chinese[2],0,16,reverse);
put_chinese(chinese[3],0,32,reverse);
put_chinese(chinese[4],0,48,reverse);break;
}
case 2://双人游戏
{
put_chinese(chinese[1],2,0,reverse);
put_chinese(chinese[2],2,16,reverse);
put_chinese(chinese[3],2,32,reverse);
put_chinese(chinese[4],2,48,reverse);break;
}
case 3://游戏设置
{
put_chinese(chinese[3],4,0,reverse);
put_chinese(chinese[4],4,16,reverse);
put_chinese(chinese[5],4,32,reverse);
put_chinese(chinese[6],4,48,reverse);break;
}
case 4://专家
{
put_chinese(chinese[7],0,16,reverse);
put_chinese(chinese[8],0,32,reverse);break;
}
case 5://高手
{
put_chinese(chinese[9],2,16,reverse);
put_chinese(chinese[10],2,32,reverse);break;
}
case 6://菜鸟
{
put_chinese(chinese[11],4,16,reverse);
put_chinese(chinese[12],4,32,reverse);break;
}
default:
break;
}
}
//=============================================
//斜线移动:向左下移动
//=============================================
uchar Ball_MoveLeftDown(uint speed)
{
uchar j,wdata;
int i;
for(i=8;i>0;i--)
{
wdata=0x03;
for(j=1;j<8;j+=2)
{
if(j)
{
LCD_WriteData(0x00,8-i,64+i*8-j+2);//CLR
LCD_WriteData(0x00,8-i,64+i*8-j+1);
}
LCD_WriteData(wdata,8-i,64+i*8-j);
LCD_WriteData(wdata,8-i,64+i*8-j-1);
wdata=wdata<<2;
Delay_x10ms(speed*10);
pause();
}
if(buttonplay)
{
buttonplay=0;
if((button==0x02)&&(i<=1)) return 0;
else if(button==0x02||button==0x01) return 1;
}
LCD_WriteData(0x00,8-i,64+i*8-j+2);
LCD_WriteData(0x00,8-i,64+i*8-j+1);
}
return 1;
}
//=============================================
//斜线移动:向右上移动
//=============================================
uchar Ball_MoveRightUp(uint speed)
{
uchar i,j,wdata;
for(i=0;i<8;i++)
{
wdata=0xc0;
for(j=0;j<8;j+=2)
{
if(j)
{
LCD_WriteData(0x00,7-i,64+i*8+j-2);//CLR
LCD_WriteData(0x00,7-i,64+i*8+j-1);
}
LCD_WriteData(wdata,7-i,64+i*8+j);
LCD_WriteData(wdata,7-i,64+i*8+j+1);
wdata=wdata>>2;
Delay_x10ms(speed*10);
if(i==7&&j>=4) j=10;
pause();
}
if(buttonplay)
{
buttonplay=0;
if((button==0x08)&&(i>=7)) return 0; //p2.1
else if(button==0x08||button==0x04) return 2;
}
LCD_WriteData(0x00,7-i,64+i*8+j-2);
LCD_WriteData(0x00,7-i,64+i*8+j-1);
}
return 2;
}
//=============================================
//斜线移动:向左上移动
//=============================================
uchar Ball_MoveLeftUp(uint speed)
{
uchar j,wdata;
int i;
for(i=8;i>0;i--)//向左上移动
{
wdata=0xc0;
for(j=1;j<8;j+=2)
{
if(j)
{
LCD_WriteData(0x00,i-1,64+i*8-j+2);//CLR
LCD_WriteData(0x00,i-1,64+i*8-j+1);
}
LCD_WriteData(wdata,i-1,64+i*8-j);
LCD_WriteData(wdata,i-1,64+i*8-j-1);
wdata=wdata>>2;
Delay_x10ms(speed*10);
pause();
}
if(buttonplay)
{
buttonplay=0;
if((button==0x01)&&(i<=1)) return 0; //p2.2
else if(button==0x01||button==0x02) return 1;
}
LCD_WriteData(0x00,i-1,64+i*8-j+2);
LCD_WriteData(0x00,i-1,64+i*8-j+1);
}
return 1;
}
//=============================================
//斜线移动:向右下移动
//=============================================
uchar Ball_MoveRightDown(uint speed)
{
uchar i,j,wdata;
for(i=0;i<8;i++)//向右下移动
{
wdata=0x03;
for(j=0;j<8;j+=2)
{
if(j)
{
LCD_WriteData(0x00,i,64+i*8+j-2);//CLR
LCD_WriteData(0x00,i,64+i*8+j-1);
}
LCD_WriteData(wdata,i,64+i*8+j);
LCD_WriteData(wdata,i,64+i*8+j+1);
wdata=wdata<<2;
Delay_x10ms(speed*10);
if(i==7&&j>=4) j=10;
pause();
}
if(buttonplay)
{
buttonplay=0;
if((button==0x04)&&(i>=7)) return 0; //p2.0
else if(button==0x04||button==0x08) return 2;
}
LCD_WriteData(0x00,i,64+i*8+j-2);
LCD_WriteData(0x00,i,64+i*8+j-1);
}
return 2;
}
//=============================================
//水平移动
//0:-->
//1:<--
//=============================================
uchar Ball_MoveP(uchar Data,uchar direction,uchar hang,uint speed,uchar value)
{
int i;
if(direction)
{
for(i=0;i<62;i++)//-->
{
if(i){
LCD_WriteData(0,hang,64+i-2);LCD_WriteData(0,hang,64+i-1);}
if(buttonplay)
{
buttonplay=0;
if((button==value)&&(i>=51)) return 0;
else if(button==value) return 2;
}
LCD_WriteData(Data,hang,64+i);LCD_WriteData(Data,hang,64+i+1);
Delay_x10ms(speed*10);
i++;
pause();
}
LCD_WriteData(0,hang,64+i-2);LCD_WriteData(0,hang,64+i-1);
return 2;
}
else
{
for(i=62;i>0;i--)//<--
{
if(i!=62){
LCD_WriteData(0,hang,64+i+2);LCD_WriteData(0,hang,64+i+1);}
if(buttonplay)
{
buttonplay=0;
if((button==value)&(i<=10)) return 0;
else if(button==value) return 1;
}
LCD_WriteData(Data,hang,64+i);LCD_WriteData(Data,hang,64+i-1);
Delay_x10ms(speed*10);
i--;
pause();
}
LCD_WriteData(0,hang,64+i+2);LCD_WriteData(0,hang,64+i+1);
return 1;
}
}
void Delay_x10ms(uchar DelayTime) //*******ms延时*****//
{
unsigned char i,j,k;
for(i=0;i<DelayTime;i++){
if(buttonplay) break;
for(j=0;j<10;j++){
if(buttonplay) break;
for(k=0;k<45;k++) {if(buttonplay) break;}
} }
}
/*******************************
双人游戏
********************************/
uchar doubleplay()
{
uchar i,flag,sendball=0,j=0;
uchar a[3]={0,0,0},b[3]={0,0,0};
LCD_CLR(L);LCD_CLR(R);
//画边框
for(i=0;i<8;i++){//球与信息分割线
LCD_WriteData(0xFF,i,63);}
for(i=1;i<7;i++){
LCD_WriteData(0xFF,i,127);}//右边线
put_chinese(chinese[20],0,4,0);//甲
put_chinese(chinese[21],2,4,0);//乙
for(;;) {
LCD_CLR(R);
LCD_WriteData(0xFF,0,127);
LCD_WriteData(0xFF,7,127);
for(i=0;i<8;i++){//球与信息分割线
LCD_WriteData(0xFF,i,63);}
for(i=0;i<8;i++){
LCD_WriteData(0xFF,i,127);}//右边线
infodisplay();
if(double_modle_1(sendball)) return 1;
sendball++;
if(sendball>=4) sendball=0;
infodisplay();
//比分局分控制
if((gamenum.mark1>=11)&&((gamenum.mark1-gamenum.mark2)>=2))
{
a[j]=gamenum.mark1;
b[j]=gamenum.mark2;
gamenum.game1++;
gamenum.mark1=0;
gamenum.mark2=0;
put_chinese(chinese[20],0,64,1);
put_chinese(chinese[13],0,80,1);
enter();LCD_CLR(R);j++;
}
else if((gamenum.mark2>=11)&&((gamenum.mark2-gamenum.mark1)>=2))
{
a[j]=gamenum.mark1;
b[j]=gamenum.mark2;
gamenum.game2++;
gamenum.mark1=0;
gamenum.mark2=0;
put_chinese(chinese[21],0,64,1);
put_chinese(chinese[13],0,80,1);
enter();LCD_CLR(R);j++;
}
if(gamenum.game2>=2) {flag=1;break;}
else if(gamenum.game1>=2) {flag=0;break;}
}
infoflash(a,b,flag);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -