#include "stdarg.h"
#include "2440addr.h"
#include "uart.h"
static int lenth = 0;
void uart_init(void)
{
unsigned int temp;
temp = rGPHCON;
temp &=~((3<<4)|(3<<6));
temp |=(2<<4)|(2<<6);
rGPHCON = temp;
temp = rGPHUP;
temp |= 0x7ff;
rGPHUP = temp;
rULCON0 = 0x3;
rUCON0 = 0x5;
rUFCON0 = 0;
rUMCON0 = 0;
rUBRDIV0 = 26; //波特率115200
<span style="font-family: Arial, Helvetica, sans-serif;">//配置串口中断</span>
rSRCPND |= (0x1<<28);
rINTMOD &= ~(0x1<<28);
rINTMSK &= ~(0x1<<28);
rINTPND |= (0x1<<28);
rSUBSRCPND |= 0x1;
rINTSUBMSK &= ~(0x1);
pISR_UART0 = (U32)UART0_IRQ;</span>
}
//串口中断函数
void __irq UART0_IRQ(void)// 要先声明
{
rSUBSRCPND |= 0x1;
rSRCPND |= (0x1<<28);
rINTPND |= (0x1<<28);
play = uart_getchar();
uart_printf("%c",play);
}
/*
输出字符串
使用方法:
uart_printf("aa %s","aaa"); //输出:aa aaa
uart_printf("asd %d",39);//输出:asd 39
裸机不能输入%f
*/
//extern int vsprintf();
void uart_printf(char *fmt, ...)
{
va_list argptr;//初始化指向可变参数列表的指针
unsigned char buffer[80];
va_start(argptr, fmt);//将第一个可变参数的地址付给ap,即ap指向可变参数列表的开始
vsprintf(buffer,fmt,argptr);//将参数fmt、ap指向的可变参数一起转换成格式
uart_puts(buffer);//输出字符串
va_end(argptr);//ap付值为0,没什么实际用处,主要是为程序健壮性
}
/*
接收字符串
*/
unsigned char * uart_gets(unsigned char * str,int len)
{
int i = 0;
while(i<len-1)
{
str[i] = uart_getchar();
uart_putchar(str[i]);
if(str[i] == '\n')
{
break;
}
i = lenth;
}
str[i] = 0;
return str;
}
/*
输出字符串
*/
void uart_puts(unsigned char *ptr)
{
while(*ptr != '\0')
{
uart_putchar(*ptr++);
}
//uart_putchar('\r');
uart_putchar('\n');
}
/****************
输出一个字符
可删除
****************/
void uart_putchar(unsigned char c)
{
if(c == '\n')
{
c = '\r';
while(!(rUTRSTAT0&0x2)); //等待并判断发送缓存是否为空
rUTXH0 = c;
lenth = 0;
}
else if(c == '\b')
{
if(lenth > 0)
{
while(!(rUTRSTAT0&0x2)); //等待并判断发送缓存是否为空
rUTXH0 = c;
while(!(rUTRSTAT0&0x2)); //等待并判断发送缓存是否为空
rUTXH0 = ' ';
while(!(rUTRSTAT0&0x2)); //等待并判断发送缓存是否为空
rUTXH0 = c;
lenth--;
}
}
else
{
while(!(rUTRSTAT0&0x2)); //等待并判断发送缓存是否为空
rUTXH0 = c;
}
}
/******************
从键盘接收一个字符
******************/
unsigned char uart_getchar(void)
{
unsigned char ch;
while(!(rUTRSTAT0 & 0x1)); //等待并判断接收缓存是否准备好
ch = rURXH0;
if(ch == '\r')
{
ch = '\n';
}
if(ch != '\b')
lenth++;
return ch;
}