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