www.pudn.com > zhiliudianliuyuan.rar > MAIN.C


//include 
#include 
#include 
#include 
 
#define uchar unsigned char 
#define uint unsigned int 
#define valve 10 
//sbit dat = P3^5; 
//sbit key = P3^2; 
//sbit cls = P3^4; 
//sbit clk = P3^3; 
sbit dat = P1^4; 
sbit key = P1^5; 
sbit cls = P1^6; 
sbit clk = P1^7; 
sbit DQ  = P1^0; 
sbit ad_busy =P3^3; 
 
uchar A[4]={0,2,0,0}; 
uchar arrAD[4]={0,0,0,0}; 
uchar AIndex=0; 
 
uchar xdata *da=0xA000; 
uchar xdata *ad=0x9FF8; 
 
uchar adin() 
{ 
	uchar i=0; 
	*ad=0; 
	i=1;//for delay 
	i=1;//for delay 
	i=1;//for delay 
	while(ad_busy==1) 
	{;} 
	return *ad; 
} 
void delay(int num) 
{ 
	while(num--); 
} 
 
void delay50us(uint num) 
{ 
	uint i,j; 
	for(i=0;i>7; 
		clk=1; 
		tempdata=tempdata<<1; 
		delay(1); 
		clk=0; 
		delay(1); 
	} 
	dat=0;	 
} 
 
uchar keyscan() 
{ 
	uchar i,tempdata=0; 
	if(key==0) 
	{ 
		senddata(0x15); 
		dat=1; 
		delay50us(1); 
		for(i=0;i<8;i++) 
		{ 
			clk=1; 
			delay(1); 
			tempdata=(tempdata<<1) | dat;	 
			clk=0; 
			delay(1); 
		} 
		dat=0; 
		return tempdata; 
	} 
	else 
		return 0xFF; 
} 
//一些列的延时函数,都是在晶振频率为12MHz的情况下使用的 
void delay1ms(uint num) 
{ 
	uint i; 
	while((num--!=0)&&(keyscan()==0xFF)) 
	{ 
		for(i=0;i<72;i++) 
		; 
	} 
} 
void initkey() 
{ 
	P1=0xFF; 
	delay1ms(25); 
	senddata(0xA4); 
	cls=1; 
} 
//setup at startup 
void Mission1() 
{ 
	uchar key1=0; 
	uchar tmpA[4]={0,0,0,0}; 
	uint tmp=0; 
	A[0]=0; 
	A[1]=2; 
	A[2]=0; 
	A[3]=0; 
	AIndex=0; 
	//send 0 to DA 
	*da=10; 
	while(key1!=0x05) 
    { 
		//show 1D  0200 
		senddata(0xCF); 
		senddata(0x01);//display "1" in the 8th 
		senddata(0xCE); 
		senddata(0x0D);//display "d" in the 7th 
		senddata(0x85); 
		senddata(0x0F);//display " " in the 6th 
		senddata(0x84); 
		senddata(0x0F);//display " " in the 5th 
		senddata(0x83); 
		senddata(A[3]);//display thousand in the 4th 
		senddata(0x82); 
		senddata(A[2]);//display hundred in the 3th 
		senddata(0x81); 
		senddata(A[1]);//display ten in the 2th 
		senddata(0x80); 
		senddata(A[0]);//display one in the 1th 
		 
		senddata(0x88); 
		senddata(~(0x01<=20)) 
					A[AIndex]=tmpA[AIndex]; 
				break; 
			case 2://minus 1 
				if(tmpA[AIndex]==0) 
				{ 
					tmpA[AIndex]=9; 
				} 
				else 
					tmpA[AIndex]=tmpA[AIndex]-1; 
				tmp=tmpA[3]*1000+tmpA[2]*100+tmpA[1]*10+tmpA[0]; 
				if((tmp<=2000)&&(tmp>=20)) 
					A[AIndex]=tmpA[AIndex]; 
				break; 
			case 3://move left 
				if(AIndex==3) 
				{ 
					AIndex=0; 
				} 
				else 
					AIndex=AIndex+1; 
				break; 
			case 4://move right 
				if(AIndex==0) 
				{ 
					AIndex=3; 
				} 
				else 
					AIndex=AIndex-1; 
				break;		 
		} 
	} 
} 
 
void Mission2() 
{ 
	uchar key1=0; 
	uchar cAD=0; 
	uint iAD=0; 
	uint iDA=0; 
	uchar cDA=0; 
	uchar cSendDA=0; 
	senddata(0x88); 
	senddata(0xFF);//stop flash 
	*da=1;//send 10 to DA when the program start run. 
	cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0); 
	while(key1!=0x05) 
    { 
		//get AD0 and show in the 8765 LED 
		delay1ms(500); 
		cAD=adin(); 
		//cAD=cDA; 
		//iAD=(int)((int)cAD/255*2000); 
		//去抖动 
		/*iAD=arrAD[3]*1000+arrAD[2]*100+arrAD[1]*10+arrAD[0]; 
		if(abs(iAD-(int)cAD*10)>valve) 
		{ 
			iAD=cAD*10; 
			arrAD[3]=(uchar)(iAD/1000); 
			iAD=iAD%1000; 
			arrAD[2]=(uchar)(iAD/100); 
			iAD=iAD%100; 
			arrAD[1]=(uchar)(iAD/10); 
			iAD=iAD%10; 
			arrAD[0]=(uchar)iAD; 
		} 
		*/ 
		iAD=cAD*10; 
		arrAD[3]=(uchar)(iAD/1000); 
		iAD=iAD%1000; 
		arrAD[2]=(uchar)(iAD/100); 
		iAD=iAD%100; 
		arrAD[1]=(uchar)(iAD/10); 
		iAD=iAD%10; 
		arrAD[0]=(uchar)iAD; 
		//show AD in 8765 LED 
		senddata(0x87); 
		senddata(arrAD[3]);//display thousand in the 8th 
		senddata(0x86); 
		senddata(arrAD[2]);//display hundred in the 7th 
		senddata(0x85); 
		senddata(arrAD[1]);//display ten in the 6th 
		senddata(0x84); 
		senddata(arrAD[0]);//display one in the 5th 
		senddata(0x83); 
		//show setting in 4321 LED 
		senddata(A[3]);//display thousand in the 4th 
		senddata(0x82); 
		senddata(A[2]);//display hundred in the 3th 
		senddata(0x81); 
		senddata(A[1]);//display ten in the 2th 
		senddata(0x80); 
		senddata(A[0]);//display one in the 1th 
		if(cAD<(A[3]*100+A[2]*10+A[1]+(A[0]>=5?1:0))) 
		{ 
			if(cSendDA<230) 
				cSendDA=cSendDA+1; 
		} 
		else if(cAD>(A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0))) 
		{ 
			if(cSendDA>1) 
				cSendDA=cSendDA-1; 
		} 
		//send to DA 
		iDA=A[3]*1000+A[2]*100+A[1]*10+A[0]; 
		//iDA=A[3]*100+A[2]*10+A[1]; 
		//cDA=iDA/2000*255; 
		//cDA=A[3]*100+A[2]*10+A[1]; 
		*da=cSendDA; 
		key1=keyscan(); 
		if(key1!=0xFF) 
		{ 
			while(keyscan()!=0xFF) 
			; 
 		} 
		switch(key1) 
		{ 
			case 1://add 1mA 
				if(iDA<=1999) 
				{ 
					iDA=iDA+1; 
					A[3]=(uchar)(iDA/1000); 
					iDA=iDA%1000; 
					A[2]=(uchar)(iDA/100); 
					iDA=iDA%100; 
					A[1]=(uchar)(iDA/10); 
					iDA=iDA%10; 
					A[0]=iDA; 
				} 
				cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0);			 
				break; 
			case 2://minus 1mA 
				if(iDA>=21) 
				{ 
					iDA=iDA-1; 
					A[3]=(uchar)(iDA/1000); 
					iDA=iDA%1000; 
					A[2]=(uchar)(iDA/100); 
					iDA=iDA%100; 
					A[1]=(uchar)(iDA/10); 
					iDA=iDA%10; 
					A[0]=iDA; 
				} 
				cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0); 
				break; 
			case 3://add 100mA 
				if(iDA<=1900) 
				{ 
					iDA=iDA+100; 
					A[3]=(uchar)(iDA/1000); 
					iDA=iDA%1000; 
					A[2]=(uchar)(iDA/100); 
					iDA=iDA%100; 
					A[1]=(uchar)(iDA/10); 
					iDA=iDA%10; 
					A[0]=iDA; 
				} 
				cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0); 
				break; 
			case 4://minus 100mA 
				if(iDA>=120) 
				{ 
					iDA=iDA-100; 
					A[3]=(uchar)(iDA/1000); 
					iDA=iDA%1000; 
					A[2]=(uchar)(iDA/100); 
					iDA=iDA%100; 
					A[1]=(uchar)(iDA/10); 
					iDA=iDA%10; 
					A[0]=iDA; 
				} 
				cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0); 
				break; 
			case 6://add 10mA 
				 
				if(iDA<=1990) 
				{ 
					iDA=iDA+10; 
					A[3]=(uchar)(iDA/1000); 
					iDA=iDA%1000; 
					A[2]=(uchar)(iDA/100); 
					iDA=iDA%100; 
					A[1]=(uchar)(iDA/10); 
					iDA=iDA%10; 
					A[0]=iDA; 
				} 
				cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0); 
				break; 
			case 7://minus 10mA 
				if(iDA>=30) 
				{ 
					iDA=iDA-10; 
					A[3]=(uchar)(iDA/1000); 
					iDA=iDA%1000; 
					A[2]=(uchar)(iDA/100); 
					iDA=iDA%100; 
					A[1]=(uchar)(iDA/10); 
					iDA=iDA%10; 
					A[0]=iDA; 
				} 
				cSendDA=A[3]*100+A[2]*10+A[1]+((A[0]>=5)?1:0); 
				break;	 
		} 
	} 
	if(keyscan()!=0xFF) 
	{ 
		while(keyscan()!=0xFF) 
		; 
	} 
	 
} 
void main() 
{ 
	initkey(); 
	while(1) 
	{ 
		Mission1(); 
		Mission2(); 
	} 
}