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

📄 ledctrl.c

📁 简单的便协式游戏机的实现
💻 C
字号:
// 8x8 Dot Matrix LED Control(Space Fight Game)+Sound ON
// by Takuya Matsubara
#include "fx2.h"
#include "fx2regs.h"
#include "ledctrl.h"
#include "sound.h"

#define LEDWIDTH 8

BYTE ledvram[LEDWIDTH];	// LED Bitmap Buffer
#define TEKIMAX 6
char tx[TEKIMAX];	//揋嵗昗
char ty[TEKIMAX];
BYTE rnd;	//
char seq;	//
char ttime;	//Enemy Timing
char tmove;	//Enemy Moving
char speed;	//game speed
char score;	//Score
char tnum;	//Enemy Count
char x,y;	//My Ship X,Y
char bx,by;	//My Ship Beam
char cx,cy;	//Enemy Beam
int  keycnt;
char row;

#define LEDCOL     IOB
#define LEDCOLOE   OEB
#define LEDROW     IOD
#define LEDROWOE   OED

#define SW_PORT    IOA	
#define SW_PORTOE  OEA	

#define SW_UP		(1<<0)
#define SW_DOWN		(1<<1)
#define SW_LEFT		(1<<2)
#define SW_RIGHT	(1<<3)
#define SW_A		(1<<4)
#define SW_B		(1<<5)


char sw_chk(BYTE bitmask);
void hex2vram(char tx,char ty,char ch);
void teki_init();

//-------------------------VRAM僨乕僞庢摼
void led_getvram(BYTE *p)
{
	char i;

	for(i=0; i<LEDWIDTH; i++){
		*(p+i) = ledvram[i];
	}
}

void led_init(void)
{
	LEDCOLOE = 0xff; //output
	LEDROWOE = 0x00; //input
 	SW_PORTOE = 0; //input

	row = 0;
	seq = 0;
}

// 僼僅儞僩僨乕僞0乣9
const BYTE ledfont[]={
	0x02,0x55,0x52,
	0x02,0x62,0x22,
	0x06,0x12,0x47,
	0x06,0x12,0x16,
	0x05,0x57,0x11,
	0x07,0x46,0x16,
	0x03,0x46,0x52,
	0x07,0x12,0x44,
	0x02,0x52,0x52,
	0x02,0x53,0x16
};

void hex2vram(char tx,char ty,char ch)
{
	BYTE i;
	WORD bitdata;

	ch *=3;

	for(i=0 ;i<6 ;i++) {
		ledvram[i+ty] &= ~(0xf << (4-tx));
		if(i % 2)
			bitdata = (WORD)(ledfont[ch++] & 0xf);
		else
			bitdata = (WORD)(ledfont[ch] >> 4) & 0xf;

		bitdata <<= (4-tx);
		ledvram[i+ty] |= bitdata;
	}
}

//-----------------僗僀僢僠擖椡
char sw_chk(BYTE bitmask)
{
	if((SW_PORT & bitmask)==0)
		return(1);
	else
		return(0);
}


void clearvram()
{
	char	i;

	for(i=0; i<LEDWIDTH; i++){
		ledvram[i] = 0;
	}
}

//------------------------Enemy init
void teki_init()
{
	char i;

	for(i=0;i<TEKIMAX;i++){
		tx[i]=(i%3)*2;
		ty[i]=(i/3)*2;
	}

	tmove=0;
	ttime=0;
	cx=-1;
	cy=-1;
	tnum=TEKIMAX;
}

//------------------------揋偺堏摦
void teki_move()
{
	#define MOVEPITCH 30	//堏摦僇僂儞僩
	#define MOVESEQ    8	//堏摦僔乕働儞僗
	char i;

	//--------------------Enemy Beam
	if(cy != -1){
		cy ++;
		if(cy >= 8)
			cy = -1;
		
		if((cx==x)&&(cy==y))
			seq=2;
	}else{
		i= rnd%TEKIMAX;
		if(ty[i] != -1) {
			cx = tx[i];
			cy = ty[i];
		}
	}

	ttime = (ttime+1)% speed;
	if(ttime!=0)
		return;

	tmove=(tmove+1) % MOVESEQ;

	for(i=0 ;i<TEKIMAX ;i++) {
		if(ty[i] != -1) {
			switch(tmove){
			case 1:
			case 2:
			case 3:
				tx[i]++;
				break;
			case 4:
			case 0:
				ty[i]++;
				if(y <= ty[i])
					seq=2;
				break;
			case 5:
			case 6:
			case 7:
				tx[i]--;
				break;
			}
		}
	}
}


//-------------------僽儘僢僋傪掕拝

void disp_vram()
{
	LEDCOL = 0x00;
	LEDROWOE = (1<<row);
	LEDROW = 0;
	LEDCOL = ledvram[row];

	row = (row+1) % LEDWIDTH;
}


void led_ctrl(void)
{
	BYTE i;

	disp_vram();
	EZUSB_Delay(1);

	switch(seq)
	{
	case 0:
		x=3;	//僾儗乕儎嵗昗
		y=7;
		bx=0;	//價乕儉嵗昗
		by=-1;
	
		score=0;
		speed=21;
		sound_init();
		teki_init();
		seq++;
		break;

	case 1:
		if(keycnt == 0) {
			rnd++;
			clearvram();

			if((sw_chk(SW_LEFT)) && (x>0)){				// 塃儃僞儞
				rnd+=1;
				x--;
			}
			if((sw_chk(SW_RIGHT)) &&(x<(LEDWIDTH-1))) {	// 嵍儃僞儞
				rnd+=2;
				x++;
			}
			ledvram[y] |= (0x80 >> x);			//------帺婡傪vram偵揮憲

			if(by != -1){
				ledvram[by] |= (0x80 >> bx);	//------帺抏傪vram偵揮憲
				by--;

				for(i=0 ;i<TEKIMAX ;i++) {
					if((ty[i]!=-1)&&(tx[i]==bx)&&(ty[i]==by)){
						sound_set("Z");
						score++;
						if(score>99)score=99;
						speed-=2;
						if(speed < 3)speed=3; 
						by=-1;
						ty[i]=-1;
						tnum--;
						if(tnum==0){	//揋慡柵
							sound_set("VW");
							teki_init();
							speed+=8;
						}
						break;
					}
				}
			}else{
				if (sw_chk(SW_A) || sw_chk(SW_B)){
				 	// A|B儃僞儞=抏敪幩
					sound_set("E");
					rnd+=3;
					bx=x;
					by=y;
				}
			}
			teki_move();

			//---------揋傪vram偵揮憲
			for(i=0; i<TEKIMAX; i++){
				if(ty[i] != -1) {
					ledvram[ty[i]] |= (0x80 >> tx[i]);
				}
			}
			if(cy != -1) ledvram[cy] |= (0x80 >> cx);
		}
		keycnt=(keycnt+1) % 100;
		break;
	case 2:		//僗僐傾昞帵
		sound_set("DCBA");
		clearvram();
		hex2vram(0 ,0 ,score / 10 );
		hex2vram(4 ,0 ,score % 10 );
		keycnt = 0;
		seq++;	
		break;
	case 3:
		keycnt = keycnt+1;
		if(keycnt > 3000) seq=0;
		break;
	}
}

⌨️ 快捷键说明

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