本实验通过UART接受数据,判断数据类型,转换为整型数据,打印出输入数据的整型值。本实验为以后裸机实验输入部分打下基础,具体实现以注释形式给出,实验代码如下:
#define GLOBAL_CLK 1
#include
#include
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#include
#include
#include
void Uart0_init(void)
{
rGPHCON = 0xa0; //设置GPH2、GPH3为TXD0(发送),RXD0(接收)
rGPHUP = 0xf0;//禁止GPH2、GPH3上拉功能
rULCON0 = 0x3; //设置UART0无奇偶校验,一位停止位,8位数据
rUCON0 = 0x245; //PCLK为时钟源,接收和发送数据为中断方式
rUFCON0 = 0; //不使用FIFO
rUMCON0 = 0; //不使用流控制
rUBRDIV0 = 26; //((UART_CLK/(波特率*16))-1)设置波特率,PCLK为50MHz,波特率为115.2kHz
}
char Uart_getch()//接收字符
{
char c;
while(!(rUTRSTAT0 & 0x1)); //判断接收缓冲区是否非空
return RdURXH0();//返回接收地址
}
void Uart_Getstring(char *string)//接收字符串
{
char *string1=string;//将string的首地址保存在string1中
char c;//定义一个字符变量
while((c=Uart_getch()) != '\r')//如果接收到的字符不为回车就一直循环
{
if(c=='\b')//如果字符为退格
{
if((int)string1 < (int)string)//如果string没有到达首地址
string--;//指针后退一个
}
else
*string++=c;//将接收到的字符放入string指向地址并经行地址加一
}
*string='\0';//将最后一位赋值为‘\ 0’为字符串结束符
}
int Uart_GetintNum(void)//将接收到得字符串转换为整形
{
int base=10;//定义字符类型变量默认是十进制
int minus=0;//定义正负标志变量
int lastindex=0;//定义字符串长度变量
int result=0;
int i; //定义变量i
char str[50];//定义字符数组用来存放字符串
char *string=str;//将指针指向字符数组首地址
Uart_Getstring(string);//接收字符串,并将其放入string指向的地址
lastindex=strlen(string)-1;//计算字符串的长度
if(lastindex<0)//如果长度为负
return -1;//反回-1
if(string[0]=='-')//如果字符串第一位为负号
{
minus=1;//符号标记位为1
string++;//地址加一去掉负号
}
if(string[0]=='0' && ((string[1]=='x') || (string[1]=='X')))//如果前两位是0x或0X
{
base=16;//类型为16进制
string+=2;//去掉前俩个位
}
if((string[lastindex]=='h') || (string[lastindex]=='H'))//如果最后一位为h或H
{
base=16;//类型为16进制
string[lastindex]=0;//去掉最后一位
lastindex--; //长度减一
}
if(base==10)//如果是10进制
{
result = atoi(string);//自动转换为10进制
result=minus?(-1*result):result;//如果是负数则结果乘以-1
}
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';//转换为16进制数
}
result=minus?(-1*result):result;//如果16进制数为负乘以-1
}
return result;
}
void Main(void)//主函数
{
Uart0_init();//UART0初始化
while(1)
{
Uart_Printf("%d\n",Uart_GetIntNum());
}
}