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

📄 game_lcd.c

📁 凌阳32位单片机开发的小游戏
💻 C
字号:
#include "Include/Game_LCD.h"

#define PAINTACTOR

#define LCD_BG_ADDR				0xa0260000				//SpriteCell data end at 0xa0c70000

#define LCD_UP_ADDR				(LCD_BG_ADDR + 0x25800)
#define LCD_DOWN_ADDR			(LCD_UP_ADDR + 0x4800)
#define LCD_RIGHT_ADDR			(LCD_DOWN_ADDR + 0x4800)
#define LCD_RIGHTUP_ADDR		(LCD_RIGHT_ADDR + 0x4800)
#define LCD_RIGHTDOWN_ADDR		(LCD_RIGHTUP_ADDR + 0x4800)
#define LCD_MIDDLE_ADDR			(LCD_RIGHTDOWN_ADDR + 0x4800)
#define LCD_LEFT_ADDR			(LCD_MIDDLE_ADDR + 0x4800)
#define LCD_LEFTUP_ADDR			(LCD_LEFT_ADDR + 0x4800)
#define LCD_LEFTDOWN_ADDR		(LCD_LEFTUP_ADDR + 0x4800)

#define LCD_1_1_ADDR			(LCD_LEFTDOWN_ADDR + 0x4800)
#define LCD_1_2_ADDR			(LCD_1_1_ADDR + 0x4800)
#define LCD_1_3_ADDR			(LCD_1_2_ADDR + 0x4800)
#define LCD_2_1_ADDR			(LCD_1_3_ADDR + 0x4800)
#define LCD_2_2_ADDR			(LCD_2_1_ADDR + 0x4800)
#define LCD_3_1_ADDR			(LCD_2_2_ADDR + 0x4800)
#define LCD_3_2_ADDR			(LCD_3_1_ADDR + 0x4800)
#define LCD_4_1_ADDR			(LCD_3_2_ADDR + 0x4800)

#define LCD_1_ADDR				(LCD_4_1_ADDR + 0x4800)
#define LCD_2_ADDR				(LCD_1_ADDR + 0x4800)
#define LCD_3_ADDR				(LCD_2_ADDR + 0x4800)
#define LCD_4_ADDR				(LCD_3_ADDR + 0x4800)
#define LCD_5_ADDR				(LCD_4_ADDR + 0x4800)

const LOAD_INFO LCDDataInfo[] =
{
	{".\\Game\\CeShow\\Game_Sprite.bin"	, SP_PGT_ADDR		, O_RDONLY, 0x480000},//0x479400
	//{".\\Lcd_bg.bin"		, LCD_BG_ADDR		, O_RDONLY,  0x26000 },
	{".\\Game\\CeShow\\Lcd_bg.bin"		, LCD_BUFFER0		, O_RDONLY,  0x26000 },
	{".\\Game\\CeShow\\Lcd_bg.bin"		, LCD_BUFFER1		, O_RDONLY,  0x26000 },

	{".\\Game\\CeShow\\Lcd_Up.bin"		, LCD_UP_ADDR		, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_Down.bin"		, LCD_DOWN_ADDR		, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_Right.bin"		, LCD_RIGHT_ADDR	, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_RightUp.bin"	, LCD_RIGHTUP_ADDR	, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_RightDown.bin"	, LCD_RIGHTDOWN_ADDR, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_Middle.bin"	, LCD_MIDDLE_ADDR   , O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_Left.bin"	 	, LCD_LEFT_ADDR   	, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_LeftUp.bin" 	, LCD_LEFTUP_ADDR	, O_RDONLY, 0x5000  },
	{".\\Game\\CeShow\\Lcd_LeftDown.bin"	, LCD_LEFTDOWN_ADDR	, O_RDONLY, 0x5000  },

	{".\\Game\\CeShow\\Lcd_1_1.bin"		, LCD_1_1_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_1_2.bin"		, LCD_1_2_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_1_3.bin"		, LCD_1_3_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_2_1.bin"		, LCD_2_1_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_2_2.bin"		, LCD_2_2_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_3_1.bin"		, LCD_3_1_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_3_2.bin"		, LCD_3_2_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_4_1.bin"		, LCD_4_1_ADDR		, O_RDONLY, 0x5000 },

	{".\\Game\\CeShow\\Lcd_Actor1.bin"	, LCD_1_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_Actor2.bin"	, LCD_2_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_Actor3.bin"	, LCD_3_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_Actor4.bin"	, LCD_4_ADDR		, O_RDONLY, 0x5000 },
	{".\\Game\\CeShow\\Lcd_Actor5.bin"	, LCD_5_ADDR		, O_RDONLY, 0x5000 },
};

U8	g_nCurrentBuffer=0;
U8	Fish_Index = 0;
U8	Key_Index = 0;
U8	Actor_Index = 0;

void LCD_LoadData(void)
{
	Sys_Load_SDCard(&LCDDataInfo, ASZ(LCDDataInfo));
}

void LCD_InitBG(void)
{
	//init BG
	/* BlnDmaStart_linear2block_Dma(LCD_BG_ADDR, LCD_BUFFER0, 0, 0, 1, 0, 320, 240, 0, 0, 0);
	WaitBlanking();
	WaitBlanking();
	BlnDmaStart_linear2block_Dma(LCD_BG_ADDR, LCD_BUFFER1, 0, 0, 1, 0, 320, 240, 0, 0, 0);
	WaitBlanking();
	WaitBlanking(); */
	Key_Index = LCD_KEYMIDDLE;
	Fish_Index = LCD_1_1;
	Actor_Index = LCD_ACTORFRAME0;
	*P_LCD_FB_ADDR1= LCD_BUFFER0;
	g_nCurrentBuffer = 0;
}

void LCD_Paint(void)
{
	static int count = 0;
	
	if( count++ > 3 )
		count = 0;
	else
		return;

#ifdef PAINTACTOR
	if( Actor_Index > 4 )
		Actor_Index = 0;
#endif
	
	if(g_nCurrentBuffer)
	{
		BlnDmaStart_linear2block_Dma( ((U32)LCD_1_1_ADDR+(0x4800)*Fish_Index),LCD_BUFFER0,189,127,1,0,96,96,0,0,0);
		Paint_Sprite_Onlcd( ((U32)LCD_UP_ADDR+(0x4800)*Key_Index),LCD_BUFFER0,96,96,22,117);
#ifdef PAINTACTOR
		Paint_Sprite_Onlcd( ((U32)LCD_1_ADDR+(0x4800)*(Actor_Index++)),LCD_BUFFER0,96,96,189,10);
#endif
		*P_LCD_FB_ADDR1= LCD_BUFFER0;
		g_nCurrentBuffer=0;
	}
	else
	{
		BlnDmaStart_linear2block_Dma( ((U32)LCD_1_1_ADDR+(0x4800)*Fish_Index),LCD_BUFFER1,189,127,1,0,96,96,0,0,0);
		Paint_Sprite_Onlcd( ((U32)LCD_UP_ADDR+(0x4800)*Key_Index),LCD_BUFFER1,96,96,22,117);
#ifdef PAINTACTOR
		Paint_Sprite_Onlcd( ((U32)LCD_1_ADDR+(0x4800)*(Actor_Index++)),LCD_BUFFER1,96,96,189,10);
#endif
		*P_LCD_FB_ADDR1= LCD_BUFFER1;
		g_nCurrentBuffer=1;
	}
}

void Paint_Sprite_Onlcd(U32 nSrcAddr,U32 nDestAddr,U16 nImageSize_x,U16 nImageSize_y,U16 nLcdScreenPosx,U16 nLcdScreenPosy)
{
	U32 i,j,k=0;
	U32 ntemp0;
    U32 nDestBaseAddr;
    const U16 *nSrcAddrTemp;
    U16 nImageSizex,nImageSizey;
    
    nSrcAddrTemp=nSrcAddr;
    nImageSizex= (nImageSize_x>>1); //one register restores two pixels
    nImageSizey= nImageSize_y;
    nDestBaseAddr=nDestAddr+(((nLcdScreenPosx-(nLcdScreenPosx%2))+320*(nLcdScreenPosy))<<1);
    
	for(j=0; j < nImageSizey; j++)
	{
		for(i=0; i < nImageSizex; i++)     	
		{           
			ntemp0 = nSrcAddrTemp[k] | (nSrcAddrTemp[k+1]<<16);
			//ntemp0 = nSrcAddr[k] | (nSrcAddr[k+1]<<16);
			*((U32*)nDestBaseAddr+i+j*160)=ntemp0;  
			k +=2;
		}
	}
}

/* extern U32 md_frame_int;
extern U32 CSI_MD_DIFFBUF[1200];
extern U32 CSI_KEY[7];

void CSI_MDInit(void)
{
	U32 i;
	*P_CSI_MD_SADDR = CSI_MD_DIFFBUF;
	*P_CSI_MD_CR = MD_DIFF|SAMP_16|FRAME_2|(0x20<<9);
	
	md_frame_int = 0;
	
    *P_CSI_IRQEN = FRAME_LOSS|MD_FRAME|MD_UF;
    for(i=0; i<7; i++)
    	CSI_KEY[i]=0;
}
 */



⌨️ 快捷键说明

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