
//޸ļ¼

//2014.5.6
//޸ַ͵ײ㺯, ȥ˷ѡ˿, ھģװļȥṩӿ
//ȥ˷ʱ, ǼӲĴжַǷԷԼǷ
//˲úΪӿ


	public const int16 max_length = 32;
	public const int32 baud = 9600;
	public [int8*max_length] buffer;
	public int16 length;
	public int16 start;
	public uint8 OS_EventFlag;
	
	public int32 XTAL;
	
	//оƬײ
	#include "$chip$.txt"
	
	unit protocol0
	{
		public link bool IsReady( int32 j ) {}
		public link int8 GetData( int32 i ) {}
		public link void Clear( int32 n) {}
	}
	protocol0.IsReady = is_ready;
	protocol0.GetData = get_data;
	protocol0.Clear = clear;
	
	//----------------------------------------------------
	//ڳʼ,:9600,8λ,1ֹͣλ,ûżУ
	public void init()
	{
		OS_EventFlag = 0;
		
		//io.RDE_DIR = 1;
		//io.RDE_OUT = 0;
		
		//io.RXD_DIR = 0;
		//io.RXD_OUT = 1;
		
		//io.TXD_DIR = 1;
		//io.TXD_OUT = 1;
		
		PORT.D2_DIR = 0;
		PORT.D2_OUT = 1;
		
		PORT.D3_DIR = 1;
		PORT.D3_OUT = 1;
		
		XTAL = 11059200;
		//XTAL = 16000000;
		
		//Ĭϲ
		set_baud( baud );
		
		length = 0;
		start = 0;
	}
	//---------------------------------------------------
	//ȡָλõ
	public int32 get_data( int32 i )
	{
		int16 n = start + (int16)i;
		if( n >= max_length ) n - max_length;
		return buffer[n];
	}
	//---------------------------------------------------
	//жָλõǷЧ
	public bool is_ready( int32 j )
	{
		//ע length ٽ,ֱӷ
		#asm "cli"
		int16 t_length = length;
		#asm "sei"
		
		int16 i = (int16)j;
		if( start == t_length ) return false;
		if( start < t_length ) {
			if( start + i < t_length ) {
				return true;
			} else {
				return false;
			}
		} else {
			if( start + i < t_length + max_length ) {
				return true;
			} else {
				return false;
			}
		}
	}
	//---------------------------------------------------
	//ָĿ
	public void clear( int32 n)
	{
		int16 i = (int16)n;
		start + i;
		if( start >= max_length ) start - max_length;
	}
	//=================================================================================
	
	//һַ
	public void print_string( [int8*?] s )
	{
		uint8 i = 0;
		while( s[i] != 0 ) {
			print_byte( s[i] );
			i + 1;
		}
	}
	//һַ
	public void print_char( int32 data )
	{
		uint32 d = (uint)data;
		print_byte( (int)d.0(uint8) );
	}
	//һ
	[int8*11] number_buffer;
	public void print_number( int32 data0 )
	{
		//
		bool isNeg;
		uint32 data;
		if( data0 >= 0 ) {
			data = (uint)data0;
			isNeg = false;
		} else {
			data = (uint)-data0;
			isNeg = true;
		}
		//ֵ
		int16 i = 0;
		forever {
			int8 ch = '0' + (int)(uint8)(uint16)(data % 10);
			number_buffer[i] = ch;
			i + 1;
			data / 10;
			if( data == 0 ) {
				if( isNeg ) {
					number_buffer[i] = '-';
					i + 1;
				}
				break;
			}
		}
		do {
			i - 1;
			print_byte( number_buffer[i] );
		}
		while( i != 0 );
	}
	//=================================================================================
	//һֽ
	public void print_byte( int8 data )
	{
		WAIT_SEND_OK();
		UDR = (uint)data;
	}
	//ʱ
	void delay()
	{
		loop( 15 ) loop( 100 ) {}
	}
	//ݽж
	INTERRUPT_UART
	void RXC()
	{
		//жϳжȡ UDR,˳½ж
		buffer[length] = (int)UDR;
		length + 1;
		if( length == max_length ) length = 0;
		OS_EventFlag.0(bit) = 1;
	}




	//----------------------------------------------------
	//һַ
//	public void print_char( int8 data )
//	{
//		io.RDE_OUT = 1;
//		delay();
//		CHIP.UDR = (uint)data;
//		repeat until CHIP.UCSRA.5(bit) == 1; {}
//		CHIP.UCSRA.5(bit) = 1;
//		delay();//ʱҪ! ȥ֮ԽյǷд
//		io.RDE_OUT = 0;
//	}















