1、串口的初始化函数
/*
* 初始化UART0
* 115200,8N1,无流控
*/
void uart0_init(void)
{
GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0
GPHUP = 0x0c; // GPH2,GPH3内部上拉
ULCON0 = 0x03; // 8N1(8个数据位,无较验,1个停止位)
UCON0 = 0x05; // 查询方式,UART时钟源为PCLK
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
//从上面中可以看出UBRDIV0是波特率分频寄存器。其中UART clock(串口时钟)是PCLK(50MHZ),而我们的波特率是115200,代进去算就可以了。
UBRDIV0 = UART_BRD; // 波特率为115200
}
2、发送一个字符函数
void putc(unsigned char c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
分析:跳出循环的条件是!(UTRSTAT0 & TXD0READY)为0,由于&是按位与的意思,也就是说UTRSTAT0这个寄存器的第0位为1.
//UTRSTAT0是UART channel 0 Tx/Rx status register,这里宏定义#define TXD0READY (1<<2),也就是说当传输缓冲寄存器没有数据或传输转换寄存器为空时自动变为1.
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
UTXH0 = c;
}
3、接收一个字符
unsigned char getc(void)
{
/* 等待,直到接收缓冲区中的有数据 */
分析:跳出循环的条件是!(UTRSTAT0 & TXD0READY)为0,由于&是按位与的意思,也就是说UTRSTAT0这个寄存器的第0位为1.
//UTRSTAT0是 UART channel 0 Tx/Rx status register,这里宏定义#define RXD0READY (1),也就是说当传输缓冲寄存器没有数据或传输转换寄存器为空时自动变为1.
while (!(UTRSTAT0 & RXD0READY));
/* 直接读取URXH0寄存器,即可获得接收到的数据 */
return URXH0;
}
4、判断一个字符是否数字或英文字母
/*
* 判断一个字符是否数字
*/
'0'是0这个字符,但是如果在这种比较的时候参与运算的这个字符的ASCII值,0的ASCII应该是48,9的是57,if语句里面的意思是这样的,如果c大于等于0且小于等于9的话。。。为什么不直接写c>=0呢,这估计是因为c的数据类型不是int,而是char,所以用这种方式表达。
int isDigit(unsigned char c)
{
if (c >= '0' && c <= '9')
return 1;
else
return 0;
}
/*
* 判断一个字符是否英文字母
*/
int isLetter(unsigned char c)
{
if (c >= 'a' && c <= 'z')
return 1;
else if (c >= 'A' && c <= 'Z')
return 1;
else
return 0;
}