《AVR单片机GCC程序设计》
源代码在线查看: usart.c
/*
文件名:usart.c
功 能:uart通信接口
C P U : ATMega8
编 译: WinAVR-20040404
速 度:外部4MHz
更改记录:
2004-06-22
*/
#include
#include
#include
#include "usart.h"
#include "lp2004.h"
static uchar g_bTxdPos,g_bRxdPos,g_bTxdLen,g_bRxdLen;
//UART缓冲区,是数据包发送/接收缓冲区
static uchar g_aUartBuf[LP_PACKET_SIZE];
void DelayMs(uint t);
//接收完成一字节中断
SIGNAL(SIG_UART_RECV)
{
uchar c=UDR;
if(g_bRxdLen>0)
{
g_aUartBuf[g_bRxdPos++]=c;
g_bRxdLen--;
}
}
//发送完成一字节中断
SIGNAL (SIG_UART_TRANS)
{
if(--g_bTxdLen>0)
UDR=g_aUartBuf[++g_bTxdPos];
else
g_bTxdPos=0;
}
//从UART缓冲区发送指定长度的数据
void UartSend(uchar len)
{
g_bTxdPos=0;
g_bTxdLen=len;
UDR=g_aUartBuf[0];
while(g_bTxdLen>0)
DelayMs(1);
}
//接收指定长度数据到UART缓冲区
void UartRecv(uchar len,uchar waitflag)
{
g_bRxdPos=0;
g_bRxdLen=len;
if(waitflag)
{
while(g_bRxdLen>0)
DelayMs(1);
}
}
//检测异步接收是否完成
uchar UartIsRecvComplate(void)
{
return !g_bRxdLen;
}
//获取UART数据缓冲区
uchar *UartGetBuffer(void)
{
return g_aUartBuf;
}
//初始化通用异步串行通信模块
void UartInit(void)
{
uchar i;
for(i=0;i g_aUartBuf[i]=0;
g_bTxdPos=0;
g_bRxdPos=0;
g_bTxdLen=0;
g_bRxdLen=0;
UCSRB=_BV(RXCIE)|_BV(TXCIE)|_BV(RXEN)|_BV(TXEN);
UBRRH=0;
UBRRL=25;//9600 baud 6MHz:38 4MHz:25
}