📄 ledctrl.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 + -