📄 fivechess.c
字号:
#include "h\fivechess.h"
void Main(void)
{
rSYSCFG=SYSCFG_8KB;
Isr_Init();
Port_Init();
Uart_Init(0,115200);
LcdInit();
rPDATB =rPDATB|0x400;
Uart_Select(0);
InitScreen();
InitVarible();
DrawCurrentPlayer(Player);
Delay(0); //calibrate Delay()
while(1)
{
Test_Kb();
}
}
void Isr_Init(void)
{
U32 i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI =(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatile unsigned *)i)=0xEA000000+0x1FFE;
}
rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disable
rINTMOD=0x0; // All=IRQ mode
rINTMSK|=BIT_GLOBAL|BIT_EINT3; // All interrupt is masked.
}
void HaltUndef(void)
{
Uart_Printf("Undefined instruction exception!!!\n");
while(1);
}
void HaltSwi(void)
{
Uart_Printf("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{
Uart_Printf("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{
Uart_Printf("Dabort exception!!!\n");
while(1);
}
void keyboard_ISR(void)
{
char x,y,xrecord,yrecord,temp;
rI_ISPC=BIT_EINT0; //clear pending_bit
rPDATG=0X00;
Delay(400); //delay 40ms
if((rPDATF&0x1E0)==0x1E0)
{
return; //no keyboard press,return
}
else
{
x=1;
y=1;
xrecord=~rPDATF>>5&0x0F;
while(xrecord!=0x1) //judge row
{
x=x+1;
xrecord=xrecord>>1;
if(xrecord==0)
{
rPDATG=0X0F; // no ,return
return;}
}
Delay(200); //delay 20ms
rPDATG=0XEF; //input high
while((rPDATF&0x1E0)==0x1E0)
{
rPDATG=rPDATG<<1;
temp=rPDATG;
if((temp&0xf0)==0XF0) //noboard press,return
{
rPDATG=0X0F;
return;}
}
Delay(200); //delay 10ms
yrecord=~rPDATG>>4&0x0F;
while(yrecord!=0x1) // judge line
{
y=y+1;
yrecord=yrecord>>1;
if(yrecord==0)
{
rPDATG=0X0F; //no board press,return
return;}
}
Led_Display(x+(y-1)*4-1);
Uart_Printf("%3d",x+(y-1)*4-1);
KeyAction(x+(y-1)*4-1);
Delay(1200); //delay 40ms
rPDATG=0X0F;
}
}
void Test_Kb(void)
{
pISR_EINT0=(unsigned)keyboard_ISR;
Uart_Printf("keyboard test for S3C44B0X\n");
Uart_Printf("press any key,it will display on 8-SEG\n");
Uart_Printf("Typing any key to exit!!!\n");
rINTMSK =~(BIT_GLOBAL|BIT_EINT0);
while(1);
}
void InitScreen(void)
{
U32 i;
clrscreen();
LCD_DrawRectange(10,20,210,220,FCOLOR);
for(i=1;i<10;i++)
LCD_DrawHLine(10,210,20+i*20,FCOLOR,1);
for(i=1;i<10;i++)
LCD_DrawVLine(20,220,10+i*20,FCOLOR,1);
//draw 'c'
LCD_DrawVLine(200,205,230,FCOLOR,1);
LCD_DrawHLine(230,240,205,FCOLOR,1);
LCD_DrawVLine(200,205,240,FCOLOR,1);
//draw 'p'
LCD_DrawRectange(230,190,240,195,FCOLOR);
LCD_DrawHLine(240,245,195,FCOLOR,1);
//draw ':'
PutPixelColor(233,185,High_Low(FCOLOR));
PutPixelColor(238,185,High_Low(FCOLOR));
}
void InitVarible(void)
{
int i,j;
for(i=ChessLen-1;i>=0;i--)
for(j=ChessWid-1;j>=0;j--)
ChessBG[i][j]=0;
Player=1;
x=5;
y=5;
//init position
//LCD_DrawRetange((10+6*20-ChessR,220-6*20-ChessR,10+6*20+ChessR,220-6*20+ChessR,COLOR3);
DrawChess(10+x*20,220-y*20,COLOR3);
}
void DrawChess(U32 x,U32 y,U8 c)
{
int i;
for(i=ChessR;i>0;i--)
LCD_DrawRectange(x-i,y-i,x+i,y+i,c);
}
void DrawChessBG(void)
{
int i,j;
clrscreen();
InitScreen();
for(i=ChessLen-1;i>=0;i--)
for(j=ChessWid-1;j>=0;j--)
{
switch(ChessBG[i][j])
{
case 1:
DrawChess(10+i*20,220-j*20,COLOR1);
break;
case 2:
DrawChess(10+i*20,220-j*20,COLOR2);
break;
default:
break;
}
}
DrawChess(10+x*20,220-y*20,COLOR3);
}
void KeyAction(U32 key)
{
U32 temp;
temp=ChessBG[x][y];
switch(key)
{
case 6://down
if(x<10)
{
ChessBG[x][y]=temp;
x++;
DrawChessBG();
DrawCurrentPlayer(Player);
DrawChess(10+x*20,220-y*20,COLOR3);
}
break;
case 2://left
if (y>0)
{
ChessBG[x][y]=temp;
y--;
DrawChessBG();
DrawCurrentPlayer(Player);
DrawChess(10+x*20,220-y*20,COLOR3);
}
break;
case 10://right
if (y<10)
{
ChessBG[x][y]=temp;
y++;
DrawChessBG();
DrawCurrentPlayer(Player);
DrawChess(10+x*20,220-y*20,COLOR3);
}
break;
case 5://up
if(x>0)
{
ChessBG[x][y]=temp;
x--;
DrawChessBG();
DrawCurrentPlayer(Player);
DrawChess(10+x*20,220-y*20,COLOR3);
}
break;
case 14://play
if(ChessBG[x][y]==0)
{
ChessBG[x][y]=Player;
DrawChessBG();
DrawChess(10+x*20,220-y*20,COLOR3);
if (IsWin(Player))
{
DrawWinner();
}
Player=3-Player;
DrawCurrentPlayer(Player);
}
break;
case 15://reset
InitScreen();
InitVarible();
break;
default:
break;
}
}
void DrawCurrentPlayer(U32 p)
{
if (p==1)
{
LCD_DrawHLine(230,240,180,FCOLOR,1);
PutPixelColor(231,179,High_Low(FCOLOR));
LCD_DrawVLine(177,182,240,FCOLOR,1);
}
else
{
LCD_DrawVLine(175,180,230,FCOLOR,1);
LCD_DrawVLine(175,180,235,FCOLOR,1);
LCD_DrawVLine(175,180,240,FCOLOR,1);
LCD_DrawHLine(230,235,175,FCOLOR,1);
LCD_DrawHLine(235,240,180,FCOLOR,1);
}
}
unsigned int IsWin(unsigned int p)
{
//U32 cx,cy;
unsigned int i;
U32 count;
//cx=x,cy=y;
count=0;
for(i=0;i<11;i++)
{
if (ChessBG[x][i]==p)
count++;
else
count=0;
}
if (count>WinNum-1) return 1;
count=0;
for(i=0;i<11;i++)
{
if (ChessBG[i][y]==p)
count++;
else
count=0;
}
if (count>WinNum-1) return 1;
return 0;
}
void DrawWinner()
{
unsigned int i,j;
for(i=230,j=120;i<=240;i++)
{
PutPixelColor(i,j,High_Low(BGCOLOR));
if (j<125)j++;
}
for(i=230,j=130;i<=240;i++)
{
PutPixelColor(i,j,High_Low(BGCOLOR));
if (j>125)j--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -