
//201622 ʼAD9850 DDSģ

//4294927692
//34.359738368
//34359738(4) / 10000000 * f

//= 343597384 / 10000000 * ( H0000000 + G000000 + F00000 + E0000 + D000 + C00 + B0 + A + 0.a + 0.0b );

//= 
//343597384*H
//343597384*G/10
//343597384*F/100
//343597384*E/1000
//343597384*D/10000
//343597384*C/100000
//343597384*B/1000000
//343597384*A/10000000
//343597384*a/100000000
//343597384*b/1000000000

unit AD9850
{
	public const uint16 ID = 0;
	
	public link unit D7 {}
	public link unit WCLK {}
	public link unit FQUD {}
	public link unit REST {}
	
	//---------------------------------------------------
	//[i] function_void OS_init;
	public void OS_init()
	{
		D7.D0_DIR = 1;
		WCLK.D0_DIR = 1;
		FQUD.D0_DIR = 1;
		REST.D0_DIR = 1;
		
		WCLK.D0_OUT = 0;
		FQUD.D0_OUT = 0;
		delay();
		
		REST.D0_OUT = 1;
		delay();
		REST.D0_OUT = 0;
		delay();
		
		WCLK.D0_OUT = 1;
		delay();
		WCLK.D0_OUT = 0;
		delay();
		
		FQUD.D0_OUT = 1;
		delay();
		FQUD.D0_OUT = 0;
		delay();
	}
	
	//---------------------------------------------------
	//[i] function_void set_value int32;
	public void set_value( int32 f )
	{
		//Ƶʼ
		uint32 d = (uint)f;
		
		uint32 R = 343597384;
		
		uint32 A = d % 10; d / 10;
		uint32 B = d % 10; d / 10;
		uint32 C = d % 10; d / 10;
		uint32 D = d % 10; d / 10;
		uint32 E = d % 10; d / 10;
		uint32 F = d % 10; d / 10;
		uint32 G = d % 10; d / 10;
		uint32 H = d % 10; d / 10;
		
		uint32 r = R * H;
		r = r + (R * G) / 10;
		r = r + (R * F) / 100;
		r = r + (R * E) / 1000;
		r = r + (R * D) / 10000;
		r = r + (R * C) / 100000;
		r = r + (R * B) / 1000000;
		r = r + (R * A) / 10000000;
		
		loop( 32 ) {
			D7.D0_OUT = r.0(bit);
			r >> 1;
			WCLK.D0_OUT = 1;
			//delay();
			WCLK.D0_OUT = 0;
			//delay();
		}
		D7.D0_OUT = 0;
		loop( 8 ) {
			WCLK.D0_OUT = 1;
			//delay();
			WCLK.D0_OUT = 0;
			//delay();
		}
		FQUD.D0_OUT = 1;
		//delay();
		FQUD.D0_OUT = 0;
		//delay();
	}
	//---------------------------------------------------
	void delay()
	{
		loop( 10 ) {}
	}
}

