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

📄 ledctrl.c

📁 简单的便协式游戏机的实现
💻 C
字号:
// 8x8 Dot Matrix LED Control(Car Race 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
//僐乕僗僨乕僞
BYTE xdata mapdata[]={
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xe1,	/*11100001*/
	0xc3,	/*11100001*/
	0xc3,	/*11000001*/
	0xc3,	/*11000011*/
	0x83,	/*10000011*/
	0x87,	/*10000111*/
	0x87,	/*10000111*/
	0x8f,	/*10001111*/
	0x8f,	/*10001111*/
	0x8f,	/*10001111*/
	0x8f,	/*10001111*/
	0x8f,	/*10001111*/
	0x87,	/*10000111*/
	0x87,	/*10000111*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xe1,	/*11100001*/
	0xe1,	/*11100001*/
	0xc1,	/*11000001*/
	0xc1,	/*11000001*/
	0xc3,	/*11000011*/
	0x83,	/*10000011*/
	0x83,	/*10000011*/
	0xc3,	/*11000011*/
	0xc7,	/*11000111*/
	0xc7,	/*11000111*/
	0x83,	/*10000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xe1,	/*11100001*/
	0xe1,	/*11100001*/
	0xe1,	/*11100001*/
	0xf1,	/*11110001*/
	0xf1,	/*11110001*/
	0xf1,	/*11110001*/
	0xf1,	/*11110001*/
	0xe1,	/*11100001*/
	0xe1,	/*11100001*/
	0xe1,	/*11100001*/
	0xe1,	/*11100001*/
	0xc1,	/*11000001*/
	0xc1,	/*11000001*/
	0xc1,	/*11000001*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0x81,	/*10000001*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0xc3,	/*11000011*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81,	/*10000001*/
	0x81	/*10000001*/
};

#define MAPMAX sizeof(mapdata)

char seq;
char lap;		//廃夞
int speed;		//僗僺乕僪
int speedsum;	//僗僺乕僪壛嶼梡
WORD timecnt;	//僞僀儉梡僇僂儞僞
BYTE time;		//僞僀儉
BYTE map_y;		//儅僢僾嵗昗
BYTE x,y;		//僾儗乕儎嵗昗
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);

//---------------------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 xdata 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);
}

//-------------儅僢僾忣曬傪VRAM偵揮憲
void map2vram(BYTE tx,BYTE ty)
{
	BYTE	i;

	for(i=0; i<LEDWIDTH; i++){
		ledvram[i] = mapdata[map_y + i];
	}
	//	---------帺婡傪vram偵揮憲
	ledvram[ty] |= (0x80 >> tx);
}

//-------------------LED昞帵惂屼
void disp_vram()
{
	LEDCOL = 0x00;
	LEDROWOE = (1<<row);
	LEDROW = 0;
	LEDCOL = ledvram[row];

	row = (row+1) % LEDWIDTH;
}

//-------------------僎乕儉梡惂屼
void led_ctrl(void)
{
	BYTE i;
	char play[2];

	disp_vram();
	EZUSB_Delay(1);

	switch(seq)
	{
	case 0:
		sound_init();
		x=3;	//嵗昗
		y=6;
		lap=0;
		speed = 0;
		speedsum = 0;
		map_y = MAPMAX-LEDWIDTH;
		time=0;
		timecnt=0;
		map2vram(x,y);
		seq++;
		break;

	case 1:
		keycnt=(keycnt+1) % 100;
		if(keycnt == 0) {
			if((sw_chk(SW_LEFT)) && (x>0)){     // 塃儃僞儞
				x--;
				map2vram(x,y);
			}
			if((sw_chk(SW_RIGHT)) &&(x<(LEDWIDTH-1))) {     // 嵍儃僞儞
				x++;
				map2vram(x,y);
			}
		}
		if (sw_chk(SW_A))
		{ 	// A儃僞儞=傾僋僙儖
			speed += 5;
			if(speed > 5000)speed=5000;
		}else{
			if (sw_chk(SW_B))
			{ 	// B儃僞儞=僽儗乕僉
				speed-=5;
			}else{
				speed--;
			}
			if(speed < 0)speed=0;
		}
		speedsum += (speed / 100);	//懍搙壛嶼
		if(speedsum > 1900)
		{
			play[0]='A'+(speed/300);
			play[1]=0;
			sound_set(play);
			speedsum=0;
			map_y--;	//儅僢僾堏摦
			if(map_y <= 0){
				map_y=MAPMAX-LEDWIDTH;
				lap++;
				if(lap>=4)
					seq++;	//僑乕儖
			}
			if(mapdata[map_y+y] & (0x80>>x))
					speed =0;

			map2vram(x,y);
		}
		timecnt++;
		if(timecnt>1000){
			timecnt=0;
			time++;
			if(time>=99)seq++;
		}
		break;
	case 2:		//僞僀儉昞帵
		sound_set("OQS");
		for(i=0; i<LEDWIDTH; i++){
			ledvram[i] = 0;
		}
		hex2vram(0 ,0 ,time / 10 );
		hex2vram(4 ,0 ,time % 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 + -