📄 sys_uart.c.svn-base
字号:
/****************************************************************************
Copyright (c) 深圳市民德电子科技有限公司 http://www.szminde.cn
文件名称:sys_UART.c
版本号: 1.0
日期: 2005-05-25
说明: 此文件包含对ES-TAD7100开发板上的UART模块操作的函数。
调用列表:--
修改历史:--
****************************************************************************/
#include "44b.h"
#include "sys_UART.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*延时函数*/
extern void Delay(int time);
/*UART通道选择参数*/
static int whichUart=0;
/****************************************************************************
函数名称:UART_Init()
说明: 用指定时钟与波特率初始化UART。
调用函数:无
输入参数:mclk 时钟,为0时用默认时钟
baud 波特率
输出参数:无
****************************************************************************/
void UART_Init(int mclk,int baud)
{
if(mclk==0)
mclk=MCLK;
rUFCON0=0x0; // FIFO disable
rUFCON1=0x0;
rUMCON0=0x0;
rUMCON1=0x0;
rULCON0=0x3; // UART0
rUCON0=0x245;
rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
rULCON1=0x3; // UART1
rUCON1=0x245;
rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );
Delay(10);
}
/****************************************************************************
函数名称:UART_Select()
说明: 选择UART通道。
调用函数:无
输入参数:ch 要选择的通道,可为0或1
输出参数:无
****************************************************************************/
void UART_Select(int ch)
{
whichUart=ch;
}
/****************************************************************************
函数名称:UART_Select()
说明: 等待UART传输缓冲清空。
调用函数:无
输入参数:ch 要等待清空的通道,可为0或1
输出参数:无
****************************************************************************/
void UART_TxEmpty(int ch)
{
if(ch==0)
while(!(rUTRSTAT0 & 0x4)); // 等待直到Tx0移位寄存器为空
else
while(!(rUTRSTAT1 & 0x4)); // 等待直到Tx1移位寄存器为空
}
/****************************************************************************
函数名称:UART_Getch()
说明: 从UART接收一个字节的数据,未收到就一直等待。
调用函数:无
输入参数:无
输出参数:返回接收到的数据
****************************************************************************/
char UART_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); // 等待直到Rx0缓冲寄存器有接收数据
return rURXH0;
}
else
{
while(!(rUTRSTAT1 & 0x1)); // 等待直到Rx1缓冲寄存器有接收数据
return rURXH1;
}
}
/****************************************************************************
函数名称:UART_GetKey()
说明: 从UART接收一个字节的数据,收到就返回接收到的数据,未收到就返回0。
调用函数:无
输入参数:无
输出参数:返回接收到的数据或0
****************************************************************************/
char UART_GetKey(void)
{
if(whichUart==0)
{
if(rUTRSTAT0 & 0x1)
return rURXH0;
else
return 0;
}
else
{
if(rUTRSTAT1 & 0x1)
return rURXH1;
else
return 0;
}
}
/****************************************************************************
函数名称:UART_GetString()
说明: 从UART接收一个字符串,并通过UART转发,直到收到回车符。
调用函数:UART_Getch()
UART_Printf()
UART_SendByte()
输入参数:*string 存放该字符串的指针
输出参数:无
****************************************************************************/
void UART_GetString(char *string)
{
char *string2=string;
char c;
while((c=UART_Getch())!='\r')
{
if(c=='\b')
{
if( (int)string2 < (int)string )
{
UART_Printf("\b \b");
string--;
}
}
else
{
*string++=c;
UART_SendByte(c);
}
}
*string='\0';
UART_SendByte('\n');
}
/****************************************************************************
函数名称:UART_GetIntNum()
说明: 从UART接收一个整型数(ASCII码到数字的转换)。
调用函数:UART_GetString()
atoi()
输入参数:无
输出参数:返回该整型数
****************************************************************************/
int UART_GetIntNum(void)
{
char str[30];
char *string=str;
int base=10;
int minus=0;
int lastIndex;
int result=0;
int i;
UART_GetString(string);
if(string[0]=='-')
{
minus=1;
string++;
}
if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
{
base=16;
string+=2;
}
lastIndex=strlen(string)-1;
if( string[lastIndex]=='h' || string[lastIndex]=='H' )
{
base=16;
string[lastIndex]=0;
lastIndex--;
}
if(base==10)
{
result=atoi(string);
result=minus ? (-1*result):result;
}
else
{
for(i=0;i<=lastIndex;i++)
{
if(isalpha(string[i]))
{
if(isupper(string[i]))
result=(result<<4)+string[i]-'A'+10;
else
result=(result<<4)+string[i]-'a'+10;
}
else
{
result=(result<<4)+string[i]-'0';
}
}
result=minus ? (-1*result):result;
}
return result;
}
/****************************************************************************
函数名称:UART_SendByte()
说明: 通过UART发送一个字节的数据。
调用函数:无
输入参数:data 要发送的数据
输出参数:无
****************************************************************************/
void UART_SendByte(int data)
{
if(whichUart==0)
{
if(data=='\n')
{
rUTXH0='\r';
while(!(rUTRSTAT0 & 0x2));
}
rUTXH0=data;
while(!(rUTRSTAT0 & 0x2)); // 等待直至 THR0 为空
}
else
{
if(data=='\n')
{
rUTXH1='\r';
while(!(rUTRSTAT1 & 0x2));
}
rUTXH1=data;
while(!(rUTRSTAT1 & 0x2)); // 等待直至 THR1 为空
}
}
/****************************************************************************
函数名称:UART_SendString()
说明: 通过UART发送一个字符串。
调用函数:UART_SendByte()
输入参数:*pt 要发送字符串的指针
输出参数:无
****************************************************************************/
void UART_SendString(char *pt)
{
while(*pt)
UART_SendByte(*pt++);
}
/****************************************************************************
函数名称:UART_Printf()
说明: UART的格式化输出。
调用函数:va_start()
vsprintf()
UART_SendString()
va_end()
输入参数:*fmt 要输出字符串的指针
输出参数:无
****************************************************************************/
void UART_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
UART_SendString(string);
va_end(ap);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -