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