📄 serial.c
字号:
/*******************************************************************************
*File: main.c
*功能: 处理用户输入的命令
*******************************************************************************/
#include <string.h>
#include <ctype.h>
#include "config.h"
uint8 t_buf[30]; // 接收缓冲区
uint8 r_buf[30]; // 接发送冲区
uint8 rcv_buf; // UART0数据接收缓冲区
uint8 rcv_new; // 接收新数据标志
int r_length=0; // 输入数组长度
uint8 str1[]="Current Time: ";
uint8 str2[]="New Time: ";
uint8 str3[]="Error Command! ";
uint8 str4[]="MyRTClock V1.0";
uint8 str5[]="(C) Copyright 2008 Chen Tuo";
void IRQ_UART0(void) __attribute__ ((interrupt)); // Generate Interrupt
/*******************************************************************************
*名称: SendByte()
*功能: 向串口发送字节数据
*入口参数:data 要发送的数据
*******************************************************************************/
void SendByte(uint8 data)
{ U0THR=data;
while((U0LSR&0x20)==0); //等待数据发送
}
/*******************************************************************************
*名称: ISendBuf()
*功能: 将缓冲区的数据发送回主机,并等待发送完毕
*******************************************************************************/
void ISendBuf(void)
{
SendByte(rcv_buf);
}
void Send_t_Buf(void)
{ uint8 i,l;
l=strlen(t_buf);
for(i=0;i<l;i++)SendByte(t_buf[i]);
}
// 发送回车换行
void SendRN (void)
{
rcv_buf=0x0D;
ISendBuf(); //显示回车
rcv_buf=0x0A;
ISendBuf(); //显示换行
}
/*******************************************************************************
*名称: UART0_Ini()
*功能: 初始化串口0. 设置其工作模式及波特率
*入口参数: baud 波特率
set 模式设置 (UARTMODE数据结构)
*出口参数:返回值为1时表示初始化成功,为0表示参数出错
*******************************************************************************/
uint8 UART0_Ini(uint32 baud)
{ uint32 bak;
/*设置串口波特率 */
U0LCR=0x80; //DLAB位置1
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
/*设置串口模式 */
U0LCR=0x03;
return(1);
}
/*******************************************************************************
*名称: IRQ_UART0(void)
*功能: 串口UART0接收中断
*******************************************************************************/
void IRQ_UART0(void)
{ int i,j,l;
int newH,newM,newS;
if(0x04==(U0IIR&0x0F))rcv_new=1; //设置接收到新的数据标志
rcv_buf=U0RBR; //读取FIFO的数据,并清除中断标志
if(1==rcv_new)
{
if (rcv_buf==0x0D) // 处理回车
{
SendRN(); // 回车换行
if (!strcmp(r_buf,"time"))
{
l=strlen(str1);
for (i=0;i<l;i++)
t_buf[i]=str1[i]; // Current Time: 提示
for (j=i;j<l+6;j++){
if (send_buf[j-i]=='\0')
t_buf[j]='0';
else
t_buf[j]=send_buf[j-i]+'0'; // 当前时间,转换为ASCII码
}
Send_t_Buf();
SendRN(); // 回车换行
for (i=0;i<30;i++) t_buf[i]=0; // 清零 t_buf;
l=strlen(str2);
for (i=0;i<j+l;i++)
t_buf[i]=str2[i]; // New Time: 提示
Send_t_Buf();
} else {
newH=10*(r_buf[0]-48)+(r_buf[1]-48); // ASCII先转数字
HOUR=newH;
newM=10*(r_buf[2]-48)+(r_buf[3]-48);
MIN=newM;
newS=10*(r_buf[4]-48)+(r_buf[5]-48);
SEC=newS;
rcv_buf='>'; //显示提示符
ISendBuf();
}
for (i=0;i<30;i++) r_buf[i]=0; // 清零 r_buf;
for (i=0;i<30;i++) t_buf[i]=0; // 清零 t_buf;
r_length=0;
l=0;
}
else
{
ISendBuf(); //将接收到的数据发送回主机
if (rcv_buf==0x08){ // 处理退格键
r_buf[r_length] = 0;
r_length--;
}
else {
r_buf[r_length] = tolower(rcv_buf); // 输入的字符转换为小写,存入r_buf
r_length++;
}
}
rcv_new=0;
}
VICVectAddr=0x00; //中断处理结束
}
// 显示版权
void Disp_CopyRight(void)
{ int i,l;
l=strlen(str4);
for (i=0;i<l;i++)
t_buf[i]=str4[i]; // MyRTClock V1.0 提示
Send_t_Buf();
for (i=0;i<30;i++) t_buf[i]=0; // 清零 t_buf;
SendRN(); // 回车换行
l=strlen(str5);
for (i=0;i<l;i++)
t_buf[i]=str5[i]; // (C) Copyright 2008 Chen Tuo 提示
Send_t_Buf();
for (i=0;i<30;i++) t_buf[i]=0; // 清零 t_buf;
SendRN(); // 回车换行
SendRN(); // 回车换行
rcv_buf='>'; //显示提示符
ISendBuf();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -