1)基本要求
用8個LED發光管(紅黃綠)的來回滾動顯示來模擬打乒乓球時乒乓球在兩邊球檯上的來回運動。比賽雙方用按鈕/開關(雙方各用1個按鈕/開關)的方法來模擬發球與接球,即發球方按動其控制的按鈕/開關/健,球從發球方一側向對方運動(LED發光管從發球方到對方逐個點亮,滾動顯示),當球運動至接球方時,接球方立即按動其控制的按鈕/開關/鍵,“擊球”使球“彈回”發球方一側,如此周而復始,直至在規定的擊球時間內有一方未能完成擊球動作,從而對方得一分,然後繼續比賽。比賽規則可參照一般的乒乓球比賽規則。
要求:
(1)球以每0.5秒滾過1個LED的速度移動;
(2)回球需在球到達後的0.5秒內進行(按下按鈕),否則按失球計;
(3)球未到達提前按下按鈕按失球處理,不起回球作用;
(4)用擴展的4個七段數碼(小鍵盤上)爲雙方記分(每方2個八段碼, ,按10進制計數,初始值00:00,可自行設計顯示及規則)
2)設計提示
球到達接球方後,立即讀接球方的按鈕狀態,若未按則有效(若已按下則按失球計),然後不斷讀此按鈕狀態,直到按下代表“擊球”動作。(採用中斷,可以用同一個按鍵輪流按動識別)。
3)進一步設計要求
(1)在8×8點陣(虛擬大屏)同步顯示球移動情況,設計顯示輸贏球圖形狀態、效果等;移動、擊球等精確(中斷)計時;
(2)通過撥動開關或鍵盤設定改變球移動速度,即每個LED管點亮時間分別爲0.5秒、0.3秒、0.2秒;通過撥動開關或鍵盤設定改變允許擊球時間0.3秒、0.2秒、0.1秒;球移動速度取決於擊球時間,即球移動速度(每個LED點亮時間)在0.2~0.5秒內可變,具體取決於球到達接球方後擊球所花的時間0~0.5秒如花費的時間短則回球後球移動速度快反之回球後移動
#include "interface.h"
void init8255(void);
const unsigned short Port8255Base=0x288;
const unsigned char ControlWord8255=0x80;
Input/Output.PortA:Output
unsigned char gData=0x80;
int flag=0;
int num=0;
const unsigned char ControlWord8255B = 0x82;
const unsigned char ControlWord8255E = 0x88;
void init8255B(void);
int scoreleft,scoreright;
int speedlamp;
int speed2;
int speed3;
void turnleft()
{
gData=1;
while(1)
{
PortWriteByte(Port8255Base,gData);
if(gData==128)
{
flag=0;
break;
}
gData*=2;
sleep(speedlamp);
}
}
void turnright()
{
gData=128;
while(1)
{
PortWriteByte(Port8255Base,gData);
if(gData==1)
{
flag=1;
break;
}
gData/=2;
sleep(speedlamp);
}
}
unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
BYTE pdata;
BYTE reflect;
void main( )
{
init8255B();
//int speedlamp=500;
BYTE controldudu;
PortReadByte(Port8255Base + 2, &controldudu);
printf("%d \n",controldudu);
controldudu/=32;
int k5=controldudu%2;
controldudu/=2;
int k6=controldudu%2;
if(k6==0)
speedlamp=500;
else
speedlamp=50;
if(k5==0)
speed2=500;
else
speed2=1;
printf("%d %d\n",k6,k5);
pdata/=16;
scoreleft=0;
scoreright=0;
BYTE pdata=0;
int k0=0;
int k7=0;
int score0=0;
int score1=0;
BYTE old=0;
BYTE now;
int k0old,k0new,k7old,k7new;
k0old=old%2;
k7old=old/8;
while(1)
{
printf("\n當前分數:%d : %d\n",scoreleft,scoreright);
int yyy=5;
while(yyy--){
PortWriteByte(Port8255Base+2,0x01);
PortWriteByte(Port8255Base+1,led[scoreright%10]);
sleep(1); //delay 100ms
PortWriteByte(Port8255Base+2,0x02);
PortWriteByte(Port8255Base+1,led[scoreright/10]);
sleep(1);
PortWriteByte(Port8255Base+2,0x04);
PortWriteByte(Port8255Base+1,led[scoreleft%10]);
sleep(1); //delay 100ms
PortWriteByte(Port8255Base+2,0x08);
PortWriteByte(Port8255Base+1,led[scoreleft/10]);
sleep(1);
PortWriteByte(Port8255Base+2,0);
}
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
sleep(500);
printf("--%d",pdata);
printf("old:%d new:%d\n",old,pdata);
if(old==pdata)
{
continue;
}
else
{
k7old=old/8;
k0old=old%2;
k0new=pdata%2;
k7new=pdata/8;
if(k7old!=k7new)
{
//printf("---here---\n");
again:
turnright();
old=pdata;
k0old=old%2;
PortReadByte(Port8255Base + 2, &now);
now/=16;
k0old=now%2;
if(speed2>50)
{
sleep(200);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=200;
goto r1;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=1000;
goto r1;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=4000;
goto r1;
}
else
{
sleep(100);
goto r2;
}
}
}
}
else
sleep(speed2);
r2:
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
r1:
k0new=pdata%2;
printf("speedlamp:%d\n",speedlamp);
if(!(old!=pdata&&k0old!=k0new))
{
printf("\n--right lose--\n");
scoreleft++;
sleep(500);
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
old=pdata;
k7old=old/8;
k0old=old%2;
k0new=pdata%2;
k7new=pdata/8;
}
else
{
printf("\nback\n");
turnleft();
old=pdata;
k7old=old/8;
PortReadByte(Port8255Base + 2, &now);
k7old=now/128;
if(speed2>50)
{
sleep(200);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=200;
goto r3;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=1000;
goto r3;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=4000;
goto r3;
}
else
{
sleep(100);
goto r4;
}
}
}
}
else
sleep(speed2);
r4:
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
r3:
k7new=pdata/8;
if(!(old!=pdata&&k7old!=k7new))
{
printf("\n--left lose--\n");
scoreright++;
}
else
{
goto again;
}
}
}
else if(k0old!=k0new)
{
again2:
turnleft();
old=pdata;
k7old=old/8;
PortReadByte(Port8255Base + 2, &now);
k7old=now/128;
if(speed2>50)
{
sleep(200);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=200;
goto r7;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=1000;
goto r7;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=2000;
goto r7;
}
else
{
sleep(100);
goto r8;
}
}
}
}
sleep(speed2);
r8:
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
r7:
k7new=pdata/8;
if(!(old!=pdata&&k7old!=k7new))
{
printf("\n--left lose--\n");
scoreright++;
sleep(500);
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
old=pdata;
k7old=old/8;
k0old=old%2;
k0new=pdata%2;
k7new=pdata/8;
}
else
{
printf("\nback\n");
turnright();
old=pdata;
k7old=old/8;
PortReadByte(Port8255Base + 2, &now);
now/=16;
k0old=now%2;
if(speed2>50)
{
sleep(200);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=200;
goto r5;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=100;
goto r5;
}
else
{
sleep(100);
PortReadByte(Port8255Base + 2, &reflect);
reflect/=16;
if(!(reflect==pdata))
{
pdata=reflect;
speedlamp=2000;
goto r5;
}
else
{
sleep(100);
goto r6;
}
}
}
}
sleep(speed2);
r6:
PortReadByte(Port8255Base + 2, &pdata);
pdata/=16;
r5:
k7new=pdata/8;
if(!(old!=pdata&&k0old!=k0new))
{
printf("\n--right lose--\n");
scoreleft++;
}
else
{
goto again2;
}
}
}
}
}
Cleanup();
}
void init8255(void)
{
if (!Startup())
{
printf("\n\n ERROR: Open Device Error!請打開實驗箱電源\n");
_getch();
exit(0);
}
PortWriteByte(Port8255Base + 3, ControlWord8255);
}
void init8255B(void)
{
if (!Startup())
{
printf("\n\n ERROR: Open Device Error!請打開實驗箱電源\n");
_getch();
exit(0); // return to Windows
}
PortWriteByte(Port8255Base + 3, ControlWord8255E);
}