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

📄 gamegraph.c

📁 由51单片机与12864组成 俄罗斯方块游戏程序 keil工程
💻 C
字号:
//*************************************************************************************************
//*																								  *
//*			 ******************************游戏图像处理程序**************************			  *
//*																								  *
//*************************************************************************************************
#include "includes.h"

#define FRAMELEFT 38				   //边框范围:ucLine:36~127。
#define BLOCKLEFT 40


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<格子状态数组>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uca_BlockMap[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00};

unsigned char code uca_BitSelect[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
								 //用于按位置零。

unsigned char code uca_BlockDisMap[4][4]={
{0x00,0x00,0x00,0x00},{0x0F,0x0B,0x0D,0x0F},
{0xF0,0xB0,0xD0,0xF0},{0xFF,0xBB,0xDD,0xFF}};	 

//*************************************************************************************************
//*																								  *
//*			 **********************************读格子状态**************************				  *
//*																								  *
//*************************************************************************************************
unsigned char ucReadBlock(unsigned char ucRow,unsigned char ucLine)
{
	unsigned char ucResult;	

	if(ucLine<8)
		ucResult=uca_BlockMap[ucRow*2]>>(ucLine);
	else
		ucResult=uca_BlockMap[ucRow*2+1]>>(ucLine-8);

	if(ucResult&0x01)
		return 1;
	else
		return 0;
}

//*************************************************************************************************
//*																								  *
//*			 **********************************写格子状态**************************				  *
//*																								  *
//*************************************************************************************************
void vWriteBlock(unsigned char ucRow,unsigned char ucLine ,unsigned char ucValue)
{
	if(ucValue==1)
		{
		if(ucLine<8)
			uca_BlockMap[ucRow*2]|=(ucValue<<ucLine);
		else
			uca_BlockMap[ucRow*2+1]|=(ucValue<<(ucLine-8));
		}
	else
		{
		if(ucLine<8)
			uca_BlockMap[ucRow*2]&=uca_BitSelect[ucLine];
		else
			uca_BlockMap[ucRow*2+1]&=uca_BitSelect[ucLine-8];		
		}

}
//*************************************************************************************************
//*																								  *
//*			 **********************************显示一个方块****************************			  *
//*																								  *
//*************************************************************************************************
void vShowBlock(unsigned char ucRow,unsigned char ucLine)
{
	vWriteBlock(ucRow,ucLine,1);
	if(ucLine%2)
		vShowCustomRow(ucLine/2+1,BLOCKLEFT+ucRow*4,4,uca_BlockDisMap[ucReadBlock(ucRow,ucLine-1)+2]);
	else
		vShowCustomRow(ucLine/2+1,BLOCKLEFT+ucRow*4,4,uca_BlockDisMap[ucReadBlock(ucRow,ucLine+1)*2+1]);

}

//*************************************************************************************************
//*																								  *
//*			 **********************************清除一个方块****************************			  *
//*																								  *
//*************************************************************************************************
void vCleanBlock(unsigned char ucRow,unsigned char ucLine)
{
	vWriteBlock(ucRow,ucLine,0);
	if(ucLine%2)
		vShowCustomRow(ucLine/2+1,BLOCKLEFT+ucRow*4,4,uca_BlockDisMap[ucReadBlock(ucRow,ucLine-1)]);
	else
		{
		if(ucReadBlock(ucRow,ucLine+1))
			vShowCustomRow(ucLine/2+1,BLOCKLEFT+ucRow*4,4,uca_BlockDisMap[2]);
		else
			vShowCustomRow(ucLine/2+1,BLOCKLEFT+ucRow*4,4,uca_BlockDisMap[0]);	 
//		vShowCustomRow(ucLine/2+1,BLOCKLEFT+ucRow*4,4,uca_BlockDisMap[ucReadBlock(ucRow,ucLine+1)*2]);
			
		}
}
//*************************************************************************************************
//*																								  *
//*			 **********************************清空游戏区域************************				  *
//*																								  *
//*************************************************************************************************
void vCleanAllBlock()
{
	unsigned char ucCountOne,ucCountTwo;
	for(ucCountOne=0;ucCountOne<21;ucCountOne++)
		for(ucCountTwo=0;ucCountTwo<12;ucCountTwo++)
			vCleanBlock(ucCountOne,ucCountTwo);
}

//*************************************************************************************************
//*																								  *
//*			 **********************************方块显示扩展************************				  *
//*																								  *
//*************************************************************************************************
//可在LCD任何地方显示方块,注意:其中ucRow,ucLine为LCD坐标。
void vShowBlockEx(unsigned char ucRow,unsigned char ucLine,BLOCK *pstBlockType)
{
	unsigned char ucCount;
	for(ucCount=0;ucCount<8;ucCount++)
		vShowCustomRow(ucRow+ucCount%2,ucLine+(ucCount/2)*4,4,\
				uca_BlockDisMap[0x03&(unsigned char)((pstBlockType->uiBlockMap)>>(ucCount*2))]);
}
				 
//*************************************************************************************************
//*																								  *
//*			 ******************************游戏区域边框绘制函数**************************		  *
//*																								  *
//*************************************************************************************************
void vShowFrame()
{
	unsigned char ucCount;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<绘制左半屏>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	CS1=1;
	CS2=0;
	vWriteCMD(LCDPAGE);
	vWriteCMD(LCDLINE+FRAMELEFT);
	for(ucCount=FRAMELEFT;ucCount<64;ucCount++)
		vWriteData(0xC0);

	for(ucCount=1;ucCount<7;ucCount++)
		{
		vWriteCMD(LCDPAGE+ucCount);
		vWriteCMD(LCDLINE+FRAMELEFT);
		vWriteData(0xFF);
		vWriteData(0xFF);
		}

	vWriteCMD(LCDPAGE+7);
	vWriteCMD(LCDLINE+FRAMELEFT);
	for(ucCount=FRAMELEFT;ucCount<64;ucCount++)
		vWriteData(0x03);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<绘制右半屏>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	CS1=0;
	CS2=1;
	vWriteCMD(LCDPAGE);
	vWriteCMD(LCDLINE);
	for(ucCount=0;ucCount<62;ucCount++)
		vWriteData(0xC0);

	for(ucCount=1;ucCount<7;ucCount++)
		{
		vWriteCMD(LCDPAGE+ucCount);
		vWriteCMD(LCDLINE+60);
		vWriteData(0xFF);
		vWriteData(0xFF);
		}

	vWriteCMD(LCDPAGE+7);
	vWriteCMD(LCDLINE);
	for(ucCount=0;ucCount<62;ucCount++)
		vWriteData(0x03);	 
}		 

⌨️ 快捷键说明

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