//-----------------------------------------------------------------------------
// C8051F410-DEMO
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f410.h> // SFR declarations
#include <stdlib.h>
#include <stdio.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F41x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR2RL = 0xCA; // Timer2 Reload Register
sfr16 TMR2 = 0xCC; // Timer2 Register
//-----------------------------------------------------------------------------
// sbit Definitions
//-----------------------------------------------------------------------------
sbit RKEY=P0^1;
sbit ENTER=P0^0;
sbit UP=P1^7;
sbit DOWN=P0^6;
sbit LEFT=P0^7;
sbit RIGHT=P2^0;
sbit LED=P1^6;
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 49000000 // SYSCLK frequency in Hz
#define BAUD_RATE 115200
#define uchar unsigned char
#define uint unsigned int
uint data i,j,k,Xnow,Ynow,Tims;
uchar data bombnum,bf,wf,Tim,start,timf,t,r,a,b,ttmp,rtmp,atmp,btmp,bomball,allf,lostf,keyf,rec_flag,win_flag;
uchar rec[10];
uchar en[4]={0xCC,0x33,0xC3,0x3C};
uchar pic[3]={0xAA,0x70,0x00};
uchar lig[9]={0xAA,0x44,0x00,0x00,0x1E,0x00,0xAA,0x1F,0x1F};
uchar xianxbomb[15]={0xAA,0x71,0x02,0x00,0x1C,0x00,0xFE,0x00,0x44,0x01,0x22,0x00,0x1E,0x00,0xA8};
uchar xianbomb[15]={0xAA,0x71,0x02,0x00,0x1C,0x00,0xA8,0x00,0x44,0x00,0xD0,0x00,0x1E,0x00,0xA8};
uchar xianno[15]={0xAA,0x71,0x02,0x00,0x46,0x01,0x00,0x00,0x6C,0x01,0x28,0x00,0x1E,0x01,0x00};
uchar xiandat[15]={0xAA,0x71,0x02,0x00,0x46,0x00,0xA8,0x00,0x6C,0x00,0xD0,0x00,0x46,0x00,0xA8};
uchar xianflg[15]={0xAA,0x71,0x02,0x01,0x96,0x00,0xA8,0x01,0xBC,0x00,0xD0,0x01,0x96,0x00,0xA8};
uchar xianzi[15]={0xAA,0x71,0x03,0x00,0x010,0x01,0x2C,0x01,0xCA,0x01,0xAE,0x00,0x10,0x01,0x2C};
uchar xianpic[15]={0xAA,0x71,0x04,0x01,0x12,0x00,0x00,0x01,0xDE,0x00,0x98,0x01,0x12,0x00,0x00};
uchar xiantim[15]={0xAA,0x71,0x02,0x00,0x20,0x00,0x60,0x00,0x46,0x00,0x8C,0x00,0x38,0x00,0x60};
uchar xianball[15]={0xAA,0x71,0x02,0x00,0x20,0x00,0x60,0x00,0x46,0x00,0x8C,0x00,0xA2,0x00,0x16};
uchar xianbotton[15]={0xAA,0x71,0x05,0x00,0x20,0x00,0x60,0x00,0x46,0x00,0x8C,0x00,0xA2,0x00,0x16};
uchar beep[3]={0xAA,0x79,0x00};
xdata struct
{
uint x;
uint y;
uchar num;
uchar bomb;
uchar wa;
}di[10][10];
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYS_Init(void);
void Timer2_ISR(void);
void Uart0_transmit(uchar i);
void send_str(uchar *p,uchar s);
void UART0_ISR(void);
void delay_ms(uchar i);
void send_end(void);
void shua(uint o,uint p) reentrant;
void randbomb(void);
void jisuan(void);
uint ch(uchar a,uchar b);
void xianshiall(void);
void check(void);
void win(void);
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40;
EA=0;
PCA0CN=0;
PCA0MD=0;
SYS_Init();
EA=1;
delay_ms(50);
LED=1;
rec_flag=win_flag=0;
send_end();
delay_ms(5);
pic[2]=0;
send_str(pic,3);
send_end();
delay_ms(5);
lig[2]=lig[3]=lig[5]=0x00;
lig[4]=0x1E;
lig[6]=0xAA;
send_end();
bombnum=bf=wf=Tim=Tims=timf=start=a=b=t=r=ttmp=rtmp=atmp=btmp=allf=lostf=keyf=0;
bomball=10;
Xnow=30;
Ynow=170;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
di[i][j].x=i*42+30;
di[i][j].y=j*44+170;
di[i][j].wa=0;
di[i][j].bomb=0;
}
}
randbomb();
jisuan();
delay_ms(50);
while (1)
{
if(timf==1)
{
timf=0;
Tims++;
if(Tims>=10000)
{
TR2 = 0;
lostf=1;
lig[2]=lig[3]=lig[5]=0x00;
lig[4]=0x1E;
lig[6]=0xAA;
send_end();
delay_ms(2);
xianshiall();
xianzi[2]=xianpic[2]=0x04;
send_str(xianpic,15);
send_end();
send_str(xianzi,15);
send_end();
delay_ms(2);
beep[2]=150;
send_str(beep,3);
send_end();
bf=1;
keyf=0;
win_flag=1;
}
a=Tims/1000;
b=(Tims%1000)/100;
t=(Tims%100)/10;
r=Tims%10;
xiantim[3]=(0x20+r*38)/256;
xiantim[4]=(0x20+r*38)%256;
xiantim[7]=(0x20+(r+1)*38)/256;
xiantim[8]=(0x20+(r+1)*38)%256;
if((r==7)||(r==8)){xiantim[8]=xiantim[8]-2;}
xiantim[12]=0xB4;
send_str(xiantim,15);
send_end();
_nop_();
if(t!=ttmp)
{
ttmp=t;
xiantim[3]=(0x20+t*38)/256;
xiantim[4]=(0x20+t*38)%256;
xiantim[7]=(0x20+(t+1)*38)/256;
xiantim[8]=(0x20+(t+1)*38)%256;
if((t==7)||(t==8)){xiantim[8]=xiantim[8]-2;}
xiantim[12]=0x8E;
send_str(xiantim,15);
send_end();
_nop_();
}
if(b!=btmp)
{
btmp=b;
xiantim[3]=(0x20+b*38)/256;
xiantim[4]=(0x20+b*38)%256;
xiantim[7]=(0x20+(b+1)*38)/256;
xiantim[8]=(0x20+(b+1)*38)%256;
if((b==7)||(b==8)){xiantim[8]=xiantim[8]-2;}
xiantim[12]=0x68;
send_str(xiantim,15);
send_end();
_nop_();
}
if(a!=atmp)
{
atmp=a;
xiantim[3]=(0x20+a*38)/256;
xiantim[4]=(0x20+a*38)%256;
xiantim[7]=(0x20+(a+1)*38)/256;
xiantim[8]=(0x20+(a+1)*38)%256;
if((a==7)||(a==8)){xiantim[8]=xiantim[8]-2;}
xiantim[12]=0x42;
send_str(xiantim,15);
send_end();
_nop_();
}
}
if(rec_flag==1)
{
if(win_flag==0)
{
win_flag=1;
pic[2]=1;
send_str(pic,3);
send_end();
xianball[3]=0x00;
xianball[4]=0x46;
xianball[7]=0x00;
xianball[8]=0x6C;
xianball[12]=0xA2;
send_str(xianball,15);
send_end();
delay_ms(5);
xianball[3]=0x00;
xianball[4]=0x20;
xianball[7]=0x00;
xianball[8]=0x46;
xianball[12]=0xC8;
send_str(xianball,15);
send_end();
delay_ms(5);
lig[2]=0x01;
lig[3]=lig[5]=0x00;
lig[4]=0x1E;
lig[6]=0xAA;
send_end();
xianbotton[3]=0x00;xianbotton[4]=0x1A;xianbotton[5]=0x02;xianbotton[6]=0x74;
xianbotton[7]=0x00;xianbotton[8]=0xE9;xianbotton[9]=0x02;xianbotton[10]=0xBF;
xianbotton[11]=0x00;xianbotton[12]=0x1A;xianbotton[13]=0x02;xianbotton[14]=0x74;
send_str(xianbotton,15);
send_end();
}
else if(win_flag==1)
{
if(lostf==0){check();}
else if(lostf==1)
{
TR2 = 0;
a=b=t=r=0;
pic[2]=0;
send_str(pic,3);
send_end();
delay_ms(5);
lig[2]=lig[3]=lig[5]=0x00;
lig[4]=0x1E;
lig[6]=0xAA;
send_end();
rec_flag=win_flag=0;
bombnum=bf=wf=Tim=Tims=timf=start=a=b=t=r=ttmp=rtmp=atmp=btmp=allf=lostf=keyf=0;
bomball=10;
all