📄 usart1.c
字号:
/*******************************************************************************
**--------------File Info-------------------------------------------------------
** 文 件 名: USART1.c
** 最后修改日期: 2008-3-26
** 版 本: V1.0
** 描 述: M64串口一驱动 header file
**------------------------------------------------------------------------------
** Created by:
** Created date:
**------------------------------------------------------------------------------
*******************************************************************************/
#include <USART1.h>
#if USART1_EN==1
INT8U rx_buffer1[RX_BUFFER_SIZE1];
#if RX_BUFFER_SIZE1<256
INT8U rx_wr_index1,rx_rd_index1,rx_counter1;
#else
INT16U rx_wr_index1,rx_rd_index1,rx_counter1;
#endif
INT8U rx_buffer_overflow1;
INT8U tx_buffer1[TX_BUFFER_SIZE1];
#if TX_BUFFER_SIZE1<256
INT8U tx_wr_index1,tx_rd_index1,tx_counter1;
#else
INT16U tx_wr_index1,tx_rd_index1,tx_counter1;
#endif
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
INT8U status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer1[rx_wr_index1]=data;
if (++rx_wr_index1 == RX_BUFFER_SIZE1)
rx_wr_index1=0;
if (++rx_counter1 == RX_BUFFER_SIZE1)
{
rx_counter1=0;
rx_buffer_overflow1=1;
}
}
}
#pragma interrupt_handler uart1_tx_isr:33
void uart1_tx_isr(void)
{
if (tx_counter1)
{
--tx_counter1;
UDR1=tx_buffer1[tx_rd_index1];
if (++tx_rd_index1 == TX_BUFFER_SIZE1)
tx_rd_index1=0;
}
}
//#pragma used+
void putchar1(INT8U c)
{
while (tx_counter1 == TX_BUFFER_SIZE1);
asm("cli");
if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
{
tx_buffer1[tx_wr_index1]=c;
if (++tx_wr_index1 == TX_BUFFER_SIZE1)
tx_wr_index1=0;
++tx_counter1;
}
else
UDR1=c;
asm("sei");
}
//#pragma used-
//#pragma used+
INT8U getchar1(void)
{
INT8U data;
while (rx_counter1==0);
data=rx_buffer1[rx_rd_index1];
if (++rx_rd_index1 == RX_BUFFER_SIZE1)
rx_rd_index1=0;
asm("cli");
--rx_counter1;
asm("sei");
return data;
}
//#pragma used-
void Uart1_Init(void)
{
// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud rate: 38400 16M osc
UCSR1A=0x00;
UCSR1B=0xD8;
UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x19;
}
void Uart1_SendString(INT8U *pt)
{
while(*pt)
{
putchar1(*pt++);
}
}
//格式转换函数,十六进制转换为字符串 eg:输入0x5A,输出5A
void PUT_INT8U_HexTOString(INT8U Hex)
{
INT8U temp1,temp2;
temp1=(Hex>>4)&0x0F;
temp2=Hex&0x0F;
if(temp1<10)
putchar1(temp1+'0');
else
putchar1(temp1-10+'A');
if(temp2<10)
putchar1(temp2+'0');
else
putchar1(temp2-10+'A');
}
//格式转换函数,十进制数据转换为字符串 eg:输入001234,串口输出1234(去掉无效0)
void PUT_INT32U_DecTOString(INT32U Dec)
{
INT8S temp8S ;
INT32U temp32U ;
INT8U buffer[11];
temp32U=Dec ;
for(temp8S=10;temp8S>=0;temp8S--)
{
buffer[temp8S]=temp32U%10+'0' ;
temp32U=temp32U/10 ;
}
buffer[11]='\0' ;
if(buffer[0]=='0')
{
if(buffer[1]=='0')
{
if(buffer[2]=='0')
{
if(buffer[3]=='0')
{
if(buffer[4]=='0')
{
if(buffer[5]=='0')
{
if(buffer[6]=='0')
{
if(buffer[7]=='0')
{
if(buffer[8]=='0')
{
if(buffer[9]=='0')
Uart1_SendString(&buffer[10]);
else Uart1_SendString(&buffer[9]);
}
else Uart1_SendString(&buffer[8]);
}
else Uart1_SendString(&buffer[7]);
}
else Uart1_SendString(&buffer[6]);
}
else Uart1_SendString(&buffer[5]);
}
else Uart1_SendString(&buffer[4]);
}
else Uart1_SendString(&buffer[3]);
}
else Uart1_SendString(&buffer[2]);
}
else Uart1_SendString(&buffer[1]);
}
else Uart1_SendString(&buffer[0]);
}
//串口输入字符,转换成十进制,即"123456"--123456
INT32U StringTODec(void)
{
INT8U num,temp8U ;
INT32U temp32U ;
temp8U=0x00 ;
num=0x00 ;
//如果不是回车键
while(temp8U!=0x0D)
{
temp8U=getchar1();
if(temp8U>='0'&&temp8U<='9')
{
putchar1(temp8U);
num++;
switch(num)
{
case 1 :temp32U=(INT32U)(temp8U-'0');break ;
case 2 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
case 3 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
case 4 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
case 5 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
case 6 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
case 7 :temp32U=temp32U*10+(INT32U)(temp8U-'0');break ;
case 8 :temp32U=temp32U*10+(INT32U)(temp8U-'0');num=0 ;putchar1(' ');break ;
default :num=0 ;break ;
}
}
}
return temp32U;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -