www.pudn.com > iccavrUCOS_m64.rar > uart._c


#define _UART_C_ 
 
#define BAUD 	19200 
#define CRYSTAL	11059200 
#define BAUD_SETTING	(unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1) 
#define BAUD_H	(unsigned char)(BAUD_SETTING>>8) 
#define BAUD_L	(unsigned char)(BAUD_SETTING) 
 
#include "includes.h" 
extern uint8 isrCount; 
 
void uartInit(uint8 uartNum) 
{ 
	if(1==uartNum) 
	{ 
		 UCSR1B = 0x00; //disable while setting baud rate 
	 	 UCSR1A = 0x00; 
	 	 UCSR1C = 0x06; 
	 	 UBRR1L = BAUD_L; //set baud rate lo 
	 	 UBRR1H = BAUD_H; //set baud rate hi 
	 	 UCSR1B = 0x18; 
	 	 ///共有3个中断源, 接受, 发送, 寄存器空, 对应此寄存器的高3位 
	}	 
	else 
	{ 
		UCSR0B = 0x00; //disable while setting baud rate 
	 	UCSR0A = 0x00; 
		UCSR0C = 0x06;	//set frame format, 8 bits, 2stop] 
		UBRR0H = BAUD_H; 
		UBRR0L = BAUD_L; 
		UCSR0B = 0x18;	//enable receive and transmite 
		 
	}	 
} 
 
void putChar(uint8 num, uint8 dat) 
{ 
	ENTER_CRITICAL(); 
	if(1==num) 
	{ 
		UDR1 = dat; 
		while(!(UCSR1A&BIT(TXC1)));	  //发送寄存器空 
		UCSR1A|=BIT(TXC1); 
	} 
	else 
	{ 
		UDR0 = dat; 
		while(!(UCSR0A&BIT(TXC0))); 
		UCSR0A|=BIT(TXC0); 
	} 
	EXIT_CRITICAL(); 
}	 
 
void putStr(uint8 num, uint8 * str) 
{ 
	ENTER_CRITICAL(); 
	while(*str) 
	{ 
		putChar(num, *str); 
		str++; 
	} 
	EXIT_CRITICAL();	 
}	 
 
void putNum(uint8 port, uint8 num) 
{ 
	if((num>>4)<='9') 
	{ 
		putChar(port, (num>>4)+'0'); 
	} 
	else 
	{ 
		putChar(port, (num>>4)+'A'); 
	} 
	if((num&0x0f)<='9') 
	{ 
		putChar(port, (num&0x0f)+'0'); 
	} 
	else 
	{ 
		putChar(port, (num&0x0f)+'A'); 
	}			 
}	 
 
uint8 getChar(uint8 num)	 
{ 
	uint8 temp=0; 
	ENTER_CRITICAL(); 
	if(1==num) 
	{ 
		if(UCSR1A&BIT(RXC1))	//no data 
		{ 
			temp=UDR1; 
			UCSR1A|=BIT(RXC1); 
		} 
	} 
	else 
	{	 
		if(UCSR0A&BIT(RXC0))	//no data 
		{ 
			temp=UDR0; 
			UCSR0A|=BIT(RXC0); 
		} 
	} 
	EXIT_CRITICAL(); 
	return(temp); 
}	 
 
 
//////////////////////////////////////////////// 
//接受完成中断 
//////////////////////////////////////////////// 
#pragma interrupt_handler uart1_rx_isr:31 
void uart1_rx_isr(void) 
{ 
 	ENTER_CRITICAL();//uart has received a character in UDR 
 	EXIT_CRITICAL(); 
} 
/////////////////////////////////////////////// 
//发送寄存器空中断 
/////////////////////////////////////////////// 
#pragma interrupt_handler uart1_udre_isr:32 
void uart1_udre_isr(void) 
{ 
 	ENTER_CRITICAL();;//character transferred to shift register so UDR is now empty 
 	EXIT_CRITICAL(); 
} 
////////////////////////////////////////////// 
//发送完成中断 
////////////////////////////////////////////// 
#pragma interrupt_handler uart1_tx_isr:33 
void uart1_tx_isr(void) 
{ 
 	ENTER_CRITICAL();;//character has been transmitted 
 	EXIT_CRITICAL(); 
}