兵乓球比賽 8255 C語言實現

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章