?? avr-usart.c
字號:
/*---------------------UART初始化:器件=mega88
幀結構的確定:
起始位1,數據位8,無奇偶校驗,2位停止位
---數據位數8:
UCSZn2 UCSZn1 UCSZn0 字符長度
000 5 位
001 6 位
010 7 位
011 8 位
UCSZn2 位于UCSRnB寄存器,UCSZn1 0位于UCSRnC
setbits2(UCSRnC,UCSZn1,UCSZn0);clrbit(UCSRnB,UCSZn2);
----停止位選擇:
USBSn 停止位
0 1 位
1 2 位
setbit(UCSRnC,USBSn);
-----無奇偶校驗:
UPMn1 UPMn0 校驗模式
00 禁止
clrbits2(UCSRnC,UPMn1,UPMn0);
-----異步模式:
UMSELn1 UMSELn0 模式
0 0 異步操作
clrbits2(UCSRnC,UMSELn1,UMSELn0);
----波特率 9600bps:
clrbit(UCSRnA,U2Xn);//不倍速
UBRRn=Fosc/(16*baud)-1; // 倍速模式則為8 也可查表
-----------------------------------*/
void UartInit(void)
{
UCSRnC=0x0e;
clrbit(UCSRnB,UCSZn2);
clrbit(UCSRnA,U2Xn);
UBRRn=25;//Fosc1/(16*baud)-1;
out(DDRC,5);
out(DDRD,2);//en
out(DDRD,1);//TXD
in(DDRD,0);//RXD
pullup(PORTD,0);//
RXEN;
RXIE;
selectRX;
rxbytescount=0;
rxokflag=0;
}
//-------------------------interrupt handler,commu rx
#pragma vector=USART_RX_vect
__interrupt void rxisr(void)
{
//while(!getbit(UCSRnA,RXCn));//polling method
if(rxbytescount<TOTAL_BYTES_COUNT)
{
rxpackage[rxbytescount++]=UDRn; //or out if
rxtimeoutfactor=1;
RXEN;
RXIE;
}
if(rxbytescount>=TOTAL_BYTES_COUNT) //shouldnot just else
{
rxbytescount=0;rxokflag=1;
}
}
//-----------------------------------------------
void CommuTrans(unsigned char *ptr,unsigned char len){
unchar i;
TXEN;
selectTX;
for(i=0;i<len;i++)
{
while(!getbit(UCSRnA,UDREn));//wait for tx buffer being empty
UDRn=*ptr;ptr++;//txpackage[i];
}//end for
while(!getbit(UCSR0A,TXCn)) ;//wait for tx over //needed?
delayms(10);
selectRX;
}
//-------------------------------------process commu info
void ProcessCommuInfo(void)
{
unsigned char i;
switch(rxokflag)
{
case 0: break;
case 1:
{
//ADD TO DO HERE
rxokflag=0;
}break;//end case 1
default:break;
}//end switch
}//end fun
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -