
-----------------------------------------------------FOR TRANSMITTION
#include <stdio.h>
#include <ADuC814.h>

////////// INITIALIZATION //////////
void init(void) {
	/* Serial Setting */
	PLLCON = 0x00;		// 16.777216MHz core clock
	SCON = 0xD2;		// 9-bit, no_parity, 1-stop_bit
	TI = 1;			// ready to transmit

	/* Baud Rate Setting */
	PCON = 0x80;		// double baud rate
	T2CON = 0x34;		// timer2 baud rate generation mode
	RCAP2H = 0xFF;		// for 57,600bps
	RCAP2L = 0xF7;		// for 57,600bps
	TH2 = 0xFF;		// timer2 high byte
	TL2 = 0xF7;		// timer2 low byte

	/* Configure ADC */
	ADCCON1 = 0x90;		// 0x92 for 246.7KHz sampling
	ADCCON2 = 0x40;		// ADCSPI
	ADCDATAH = 0x00;	// ADC high byte
	ADCDATAL = 0x00;	// ADC low byte
}


////////// ADC ROUTINE //////////
void adc(void) {
	unsigned char tmp;

	/* start AD conversion */
	SCONV = 1;	// start ADC
	while(SCONV);	// wait for ADC completion

	/* transmit HHHHLLLL 0 */
	while(!TI);
	TI = 0;
	TB8 = 1;	// 9th bit = 1
	SBUF = ((ADCDATAH&0x0F) << 4) | ((ADCDATAL&0xF0) >> 4);

	/* store bottom 4 bit to tmp and start the next conversion */
	tmp = (ADCDATAL&0x0F) << 4;	// tmp = LLLLXXXX
	SCONV = 1;	// start ADC
	while(SCONV);	// wait for ADC completion

	/* transmit LLLLHHHH 1 */
	while(!TI);
	TI = 0;
	TB8 = 0;	// 9th bit = 0
	SBUF = tmp | (ADCDATAH&0x0F);

	/* transmit LLLLLLLL 0 */
	while(!TI);
	TB8 = 0;	// 9th bit = 0
	SBUF = ADCDATAL;
}

////////// MAIN PROGRAM //////////
void main(void) {
	init();
	while(1) {
		adc();
	}
}

--------------------------------------------------------FOR RECEPTION
#include <stdio.h>
#include <ADuC814.h>

unsigned char a, high, low, flag, nine;

////////// INTIALIZATION //////////
void initialize(void) {
	/* Serial Setting */
	ADCCON1 = 0x80;	// turn on the internal reference
	ADCCON2 = 0x09; // select DAC0 channel
	DACCON = 0x0D;	// configure DAC
	DAC0H = 0x00;	// DAC high byte
	DAC0L = 0x00;	// DAC low byte
	SCON = 0xD2;	// 9-bit, no_parity, 1-stop_bit
	PLLCON = 0x00;	// 16.777216MHz core clock

	/* Baud Rate Setting */
	PCON = 0x80;		// double baud rate
	T2CON = 0x34;		// timer2 baud rate generation mode
	RCAP2H = 0xFF;		// for 57,600bps
	RCAP2L = 0xF7;		// for 57,600bps
	TH2 = 0xFF;		// timer2 high byte
	TL2 = 0xF7;		// timer2 low byte

	high = 0;
	low = 0;
}

////////// DAC ROUTINE //////////
void dac(void) {
	if(RI) {
		a = SBUF;	// read from UART
		nine = RB8;
		RI = 0;

		if(nine) {	// receive HHHHLLLL
			high |= (a&0xF0) >> 4;	// high: 0000HHHH
			low |= (a&0x0F) << 4;	// low: LLLLXXXX
			flag = 1;
		}
		else if(flag) {	// receive LLLLHHHH
			low = (a&0xF0) >> 4;	// low = LLLLLLLL
			DAC0H = high;	// output high 4bits
			DAC0L = low;	// output low 8bits			
			high |= a&0x0F;	// high: 0000HHHH
			flag = 0;
		}
		else {	// receive LLLLLLLL
			low |= a;	// low: LLLLLLLL
			DAC0H = 0x0A;	// output high 4bits
			DAC0L = 0xAA;	// output low 8bits
		}
	}
}

////////// MAIN PROGRAM //////////
void main(void) {
	initialize();
	while(1) {
		dac();
	}
}
