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

📄 ledctrl.c

📁 简单的便协式游戏机的实现
💻 C
字号:
// 8x8 Dot Matrix LED Control(Block Game)+Sound ON
// by Takuya Matsubara

#include "fx2.h"
#include "fx2regs.h"
#include "ledctrl.h"
#include "sound.h"

#define LEDWIDTH 8
#define BLOCKWIDTH 3

BYTE  ledvram[LEDWIDTH];     // LED Bitmap Buffer
BYTE  block[LEDWIDTH];       // 
BYTE  myblock[BLOCKWIDTH];   //儅僀僽儘僢僋忣曬
BYTE level;		// 僎乕儉儗儀儖
BYTE rnd;
char seq;
BYTE x,y;		// 僽儘僢僋嵗昗
int  keycnt;
char dropcnt;	// 棊壓僇僂儞僞
char score;		// 僗僐傾
char row;


#define LEDCOL   IOB		// LED梡億乕僩
#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)

#define KABE	0x81
#define LINE	0x7E

char sw_chk(BYTE bitmask);
void block2vram(BYTE tx,BYTE ty);
void turnblock(void);
void newblock(void);
BYTE hitcheck(BYTE cx, BYTE cy);
void fixblock(BYTE tx, BYTE ty);
void hex2vram(char tx,char ty,char ch);

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
};

/*悢抣僉儍儔僋僞傪VRAM揮憲*/
void hex2vram(char tx,char ty,char ch)
{
	BYTE i;
	BYTE bitdata;

	ch *=3;

	for(i=0 ;i<6 ;i++) {
		ledvram[i+ty] &= ~(0xf << (4-tx));
		if(i % 2)
			bitdata = (ledfont[ch++] & 0xf);
		else
			bitdata = (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 block2vram(BYTE tx,BYTE ty)
{
	BYTE	i;

	for(i=0; i<LEDWIDTH; i++){
		ledvram[i] = block[i];
	}
	//	---------儅僀僽儘僢僋傪vram偵揮憲
	for(i=0; i<BLOCKWIDTH; i++){
		ledvram[i+ty] |= (myblock[i]<<((LEDWIDTH-1)-tx));
	}
}


//------------------儅僀僽儘僢僋夞揮
void turnblock(void)
{
	BYTE col,col2;
	BYTE blockbak[BLOCKWIDTH];

	for( col=0; col<BLOCKWIDTH; col++){
		blockbak[col] = myblock[col];
		myblock[col]=0;
	}
	for( col=0; col<BLOCKWIDTH; col++){
		for( col2=0; col2<BLOCKWIDTH; col2++){
			myblock[col] <<= 1;
			myblock[col] |= ((blockbak[col2] >> col) & 1);
		}
	}
}

//---------------------怴婯儅僀僽儘僢僋
void newblock(void)
{
	switch(rnd % 8){
	case 0:
		myblock[0] = 2;	//0b010
		myblock[1] = 4;	//0b100
		myblock[2] = 2;	//0b010
		break;
	case 1:
		myblock[0] = 2;	//0b010
		myblock[1] = 3;	//0b011
		myblock[2] = 4;	//0b100
		break;
	case 2:
		myblock[0] = 0;	//0b000
		myblock[1] = 2;	//0b010
		myblock[2] = 3;	//0b011
		break;
	case 3:
		myblock[0] = 0;	//0b000
		myblock[1] = 5;	//0b101
		myblock[2] = 4;	//0b100
		break;
	case 4:
		myblock[0] = 0;	//0b000
		myblock[1] = 5;	//0b101
		myblock[2] = 0;	//0b000
		break;
	case 5:
		myblock[0] = 3;	//0b011
		myblock[1] = 0;	//0b000
		myblock[2] = 6;	//0b110
		break;
	case 6:
		myblock[0] = 6;	//0b110
		myblock[1] = 6;	//0b110
		myblock[2] = 0;	//0b000
		break;
	case 7:
		myblock[0] = 0;	//0b000
		myblock[1] = 7;	//0b111
		myblock[2] = 0;	//0b000
		break;
	}
	x = 5;
	y = 0;
}
//-------------------僽儘僢僋徴撍僠僃僢僋
BYTE hitcheck(BYTE cx, BYTE cy)
{
	BYTE i;

	for(i=0; i<BLOCKWIDTH; i++){
		if(block[cy+i] & (myblock[i]<<((LEDWIDTH-1)-cx)))
			return(1);
	}

	return(0);
}


//-------------------僽儘僢僋傪掕拝
void fixblock(BYTE tx, BYTE ty)
{
	BYTE col,i;

	sound_set("A");
	for(col=0; col<BLOCKWIDTH; col++){
		block[col+ty] |= (myblock[col]<<((LEDWIDTH-1)-tx));
	}

	//---------偦傠偭偨楍偺僽儘僢僋傪徚偡
	for( col = 0; col<(LEDWIDTH-1); col++)
	{
		if( ledvram[col] == (LINE | KABE) ){
			for( i=col ;i>=1 ;i--){
				block[i] = block[i-1];
			}
			ledvram[0] = KABE;
			if( level > 1 ) level --;
			score++;
			sound_set("YZ");
		}
	}

	newblock();	//怴婯儅僀僽儘僢僋
}

// LED惂屼
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:		//僽儘僢僋弶婜壔
		sound_init();
		for( i=0; i<LEDWIDTH; i++){
			block[i]=KABE;
		}
		block[LEDWIDTH-1] = KABE|LINE;

		newblock();	//怴婯儅僀僽儘僢僋

		dropcnt=1;
		level = 20;	//僎乕儉儗儀儖
		score=0;
		seq++;
		break;

	case 1:		//僎乕儉僾儗僀
		rnd++;

		keycnt=(keycnt+1) % 150;
		if(keycnt != 0) break;

		if (sw_chk(SW_DOWN)) {	// 壓儃僞儞
			sound_set("S");
			dropcnt = 0;		// 僽儘僢僋棊壓
		}else{
			if((sw_chk(SW_LEFT)) && (x>0)){     // 塃儃僞儞
				sound_set("T");
				if(hitcheck(x-1,y)==0) x--;
				block2vram(x,y);
			}
			if((sw_chk(SW_RIGHT)) &&(x<(LEDWIDTH-1))) {     // 嵍儃僞儞
				sound_set("U");
				if(hitcheck(x+1,y)==0) x++;
				block2vram(x,y);
			}
		}

		if (sw_chk(SW_A) || sw_chk(SW_B))
		{ 	// 夞揮儃僞儞
			sound_set("V");
			turnblock();	//儅僀僽儘僢僋夞揮
			//僽儘僢僋徴撍僠僃僢僋
			if(hitcheck(x,y)) {
				//尦偵栠偡
				turnblock();	//儅僀僽儘僢僋夞揮
				turnblock();	//儅僀僽儘僢僋夞揮
				turnblock();	//儅僀僽儘僢僋夞揮
			}else{
				block2vram(x,y);
			}
		}

		//---------儅僀僽儘僢僋偺棊壓丄徴撍敾掕
		if(dropcnt==0)
		{
			dropcnt = level;
			if (y>=(LEDWIDTH-BLOCKWIDTH)) {
				fixblock(x,y);	//僽儘僢僋傪掕拝
			}else{
				//'僽儘僢僋徴撍僠僃僢僋
				if (hitcheck(x,y+1)) {
					fixblock(x,y);		//'僽儘僢僋傪掕拝

					//----------嵟忋抜偺応崌丄僎乕儉僆乕僶乕
					if( block[0] & ~KABE){
						seq++;
						break;
					}
				}else{
					y++;
				}
			}
			block2vram(x,y);
		}
		dropcnt--;
		break;
	case 2:		//僗僐傾昞帵
		sound_set("HDA");
		for(i=0; i<LEDWIDTH; i++){
			ledvram[i] = 0;
		}
		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 + -