📄 uart.c
字号:
/********************************************************************
ATmega16L学习板串口查询方式工作源文件
晶振频率: 8MHz
编写: 3366524@qq.com
********************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "../include/board.h"
// for 8MHz
const unsigned char UartUbrr[] = {0,207,103,51,34,25,16,12,8,3,1};
const unsigned char builddata[] = __DATE__;
const unsigned char buildtime[] = __TIME__;
/*===================================================================
// 函数功能: 串口初始化
// 形参: unsigned char 串口波特率
// 0 1 2 3 4 5 6 7 8 9 10
// close 4800 9600 19200 28800 38400 57600 76800 115200 250000 500000
// 返回: void
// 编写: 2004/6/26
===================================================================*/
void Lib_UartIni(unsigned char buadrate)
{
if(buadrate)
{
UBRRL = UartUbrr[buadrate]; // 设置波特率
UCSRA |= (1<<U2X);
UCSRB = ((1<<RXEN) | (1<<TXEN)); // 使能串口发送与接收
UCSRC = ((1<<URSEL)|(3<<UCSZ0)); // 选择异步模式,8数据位,1字节停止位,无奇偶校验
}
else
{
UCSRB = 0x00; // 关闭串口
}
}
/*===================================================================
// 函数功能: 串口发送一字节数据
// 形参: unsigned char 要送出的数据
// 返回: void
// 编写: 2004/6/26
===================================================================*/
void Lib_Uart_SendChar(unsigned char data)
{
while ( !( UCSRA & (1<<UDRE)) ) // 等待知道发送缓冲区空
;
UDR = data; // 把数据放入发送缓冲区
}
/*===================================================================
// 函数功能: 串口发送一个字符
// 形参: unsigned char 要送出的字符
// 返回: void
// 编写: 2004/6/26
// 备注: 当回车时将开始一个新行
===================================================================*/
void Lib_Uart_SendCh(unsigned char data)
{
if(data == '\n') // 一个新行
{
Lib_Uart_SendChar('\r'); // 发送换行
}
Lib_Uart_SendChar(data);
}
/*===================================================================
// 函数功能: 串口发送一个字符串
// 形参: unsigned char * 要送出的字符串指针
// 返回: void
// 编写: 2004/6/26
===================================================================*/
void Lib_Uart_SendString(const unsigned char *String)
{
while(*String) Lib_Uart_SendCh(*String++);
}
void Lib_Uart_SendMessage(void)
{
Lib_Uart_SendString("\n\n============================================\n");
Lib_Uart_SendString("\tTest FRAMEWORK Ver 1.2\n");
Lib_Uart_SendString("\tBuilt on ");
Lib_Uart_SendString(builddata);
Lib_Uart_SendString(" ");
Lib_Uart_SendString(buildtime);
Lib_Uart_SendString(".\n");
Lib_Uart_SendString("\tWrite by HAN: 3366524@qq.com\n");
Lib_Uart_SendString("============================================\n");
}
/*===================================================================
// 函数功能: 串口等待接收一字节数据
// 形参: void 要送出的数据
// 返回: unsigned char 接收到的字符
// 编写: 2004/6/26
===================================================================*/
unsigned char Lib_Uart_GetCh(void)
{
while(!(UCSRA & (1<<RXC))); // 等待接收缓冲区有数据
return UDR;
}
/*===================================================================
// 函数功能: 串口无等待接收一字节数据
// 形参: unsigned char * 存储的数据指针
// 返回: unsigned char 数据可用为真,不可用为假
// 编写: 2004/6/26
===================================================================*/
unsigned char Lib_Uart_GetChar(unsigned char *pddata)
{
if(UCSRA & (1<<RXC)) // 接收缓冲区有数据
{
*pddata = UDR;
return true;
}
else // 接收缓冲区无数据
return false;
}
/*===================================================================
// 函数功能: 串口等待接收一字符串
// 形参: unsigned char * 存储的字符串指针
// 返回: void
// 编写: 2004/6/26
// 备注: 等待字符串以回车结尾,最长29字符
===================================================================*/
void Lib_Uart_GetString(unsigned char *pbString)
{
unsigned char *pbString2 = pbString;
unsigned char bC;
while((bC = Lib_Uart_GetCh()) != '\r') // wait input enter
{
if((int)pbString2 <= (int)pbString - 29) // max 29 chars
{
break;
}
if(bC == '\b') // input backspace
{
if((int)pbString2<(int)pbString)
{
Lib_Uart_SendString("\b \b");
pbString--;
}
}
else
{
*pbString++ = bC;
Lib_Uart_SendCh(bC);
}
}
*pbString='\0'; // end of string
Lib_Uart_SendCh('\n');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -