📄 main.c
字号:
/****************************************************************************
* 文件名:DATARET.C
* 功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,将接收计数值加一后输
* 出LED1--LED8显示,并将数据原封不动地发送回上位机。
* 说明:将跳线器JP8短接。
* 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include "config.h"
#include "UART0_V1.0.h"
#include "UART1_V1.0.h"
#include "LCD_control.h"
#include "ScreenShow.h"
#include "CarInfor.h"
//my data
uint8 SendBuf[16]; // UART0数据发送缓冲区
uint32 GPIO_input1;
uint32 GPIO_input2;
uint32 GPIO_input3;
uint8 byCarStatus;
uint8 byOldCarStatus;
uint16 u16Message[8];
uint16 u16Name[6];
uint8 u8ExamNo[18];
void delay(int t)
{
int i=0;
int n;
for(i=0;i<t;i++)
{
for(n=0;n<10;n++){}
}
}
/****************************************************************************
* 名称:IRQ_Eint2()
* 功能:外部中断EINT2服务函数。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint2(void)
{ uint32 i;
i = IO0SET; // 读取当前B1控制值
/* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */
while( (EXTINT&0x04)!=0 )
{ EXTINT = 0x04; // 清除EINT1中断标志
}
VICVectAddr = 0; // 向量中断结束
}
//================================================================
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
uint8 i;
uint32 iGetCarStatusCounter;
uint8 bSendSelt;
uint8 byPowerJustOn;
uint16 u16CarStatusSendOK;
//2008-10-25
uint8 byReSendCounter;
uint8 byMainBoardClose;
u16Message[0]=0xBFBC; //考试尚未开始
u16Message[1]=0xCAD4;
u16Message[2]=0xC9D0;
u16Message[3]=0xCEB4;
u16Message[4]=0xBFAA;
u16Message[5]=0xCABC;
u16Message[6]=0xA0A1;
u16Message[7]=0xA0A1;
u16Name[0]=0xBCD7; //霍元甲
u16Name[1]=0xBCD7; //霍元甲
u16Name[2]=0xBCD7; //霍元甲
u16Name[3]=0xBCD7; //霍元甲
u16Name[4]=0xA0A1; //霍元甲
u16Name[5]=0xA0A1; //霍元甲
u8ExamNo[0]=0x31; //1
u8ExamNo[1]=0x32; //2
u8ExamNo[2]=0x33; //3
u8ExamNo[3]=0x34; //4
u8ExamNo[4]=0x35; //5
u8ExamNo[5]=0x36; //6
u8ExamNo[6]=0x37; //7
u8ExamNo[7]=0x38; //8
u8ExamNo[8]=0x39; //9
u8ExamNo[9]=0x30; //0
u8ExamNo[10]=0x31; //1
u8ExamNo[11]=0x32; //2
u8ExamNo[12]=0x33; //3
u8ExamNo[13]=0x34; //4
u8ExamNo[14]=0x35; //5
u8ExamNo[15]=0x36; //6
u8ExamNo[16]=0x37; //7
u8ExamNo[17]=0x38; //8
PinSet_PINSEL2();
PinSet_Dir();
CarInforPinSet();
SpeakerPinSet();
Speak(0x00);
for(i=0;i<50;i++)delay(20000);
init_lcd(); // 初始化LCD接口
clearhz(); // 清空屏幕
UART0_Ini(9600,8,1,2); // 初始化串口模式
UART1_Ini(9600,8,1,2); // 初始化串口模式
for(i=0;i<50;i++)delay(20000);
ShowTitle(2,0);
ShowMessage(3,19,u16Message,8);
ShowName(3,40,u16Name,6);
ShowExamNo(1,57,u8ExamNo,18);
ShowCarStatus(1,76,0);
ShowDoorStatus(1,95,0);
ShowCompony(1,112);
bSendSelt=TRUE;
byPowerJustOn=0;
u16CarStatusSendOK=25500;
byMainBoardClose=FALSE;
// for(i=0;i<0x10;i++)
// testLCD_interface();
// Speak(i);
// Speak(0);
// Speak(1);
// Speak(0x0A);
// Speak(0x0B);
while(1)
{
if(byPowerJustOn==0)
{
byPowerJustOn++;
UART1_ISendBuf(0x01,0x90,SendBuf,0x00);
}
//串口接收缓冲器里是否有待处理的数据。
if(byU1RcvBufOK==0x01)
{
if(UART1_CheckRcvData(byU1RcvBuf)==0)
{
//解析通信含义。
if(byU1RcvBuf[4]==0x60)//PC要求切换通道
{
SendBuf[0]=0x01;
UART1_ISendBuf(0x01,0x50,SendBuf,0x01);
}
else if(byU1RcvBuf[4]==0x61)//PC要求刹车
{
BrakeControl(byU1RcvBuf[5]);
SendBuf[0]=byU1RcvBuf[5];
UART1_ISendBuf(0x01,0x51,SendBuf,0x01);
}
else if(byU1RcvBuf[4]==0x62)//PC通知车载考试开始
{
Speak(0x0B);
UART1_ISendBuf(0x01,0x52,SendBuf,0x00);
}
else if(byU1RcvBuf[4]==0x63)//PC通知车载考试结束
{
if(byU1RcvBuf[5]==0x1)
Speak(0x04);
else
Speak(0x03);
SendBuf[0]=byU1RcvBuf[5];
UART1_ISendBuf(0x01,0x53,SendBuf,0x01);
}
else if(byU1RcvBuf[4]==0x64)//PC通知车载考试过程中出现违规,违规内容见附加信息:
{
Speak(byU1RcvBuf[5]); //语音在RcvBuf[5]
BrakeControl(byU1RcvBuf[6]);
SendBuf[0]=byU1RcvBuf[5];
SendBuf[1]=byU1RcvBuf[6];
UART1_ISendBuf(0x01,0x54,SendBuf,0x02);
}
else if(byU1RcvBuf[4]==0x65)//PC向车载发送"提示信息"内容
{
for(i=0;i<(byU1RcvBuf[3]-7)/2;i++)
u16Message[i]=byU1RcvBuf[i*2+5]*0x100+byU1RcvBuf[i*2+6];
for(;i<8;i++)
u16Message[i]=0xA0A1;
ShowMessage(3,19,u16Message,8);
UART1_ISendBuf(0x01,0x55,SendBuf,0x00);
}
else if(byU1RcvBuf[4]==0x66)//PC向车载发送"考生姓名"内容
{
for(i=0;i<(byU1RcvBuf[3]-7)/2;i++)
u16Name[i]=byU1RcvBuf[i*2+5]*0x100+byU1RcvBuf[i*2+6];
for(;i<6;i++)
u16Name[i]=0xA0A1;
ShowName(3,40,u16Name,6);
UART1_ISendBuf(0x01,0x56,SendBuf,0x00);
}
else if(byU1RcvBuf[4]==0x67)//PC向车载发送"考生考号"内容
{
for(i=0;i<(byU1RcvBuf[3]-7);i++)
u8ExamNo[i]=byU1RcvBuf[i+5];
for(;i<18;i++)
u8ExamNo[i]=0x0;
ShowExamNo(1,57,u8ExamNo,18);
UART1_ISendBuf(0x01,0x57,SendBuf,0x00);
}
else if(byU1RcvBuf[4]==0x68)//PC允许车载主动回传信息,即PC处于接收状态
{
SendBuf[0] = byCarStatus;
UART1_ISendBuf(0x01,0x58,SendBuf,0x01);
bSendSelt=TRUE;
}
else if(byU1RcvBuf[4]==0x69)//PC禁止车载主动回传信息,即PC处于主动发送状态
{
SendBuf[0] = byCarStatus;
UART1_ISendBuf(0x01,0x59,SendBuf,0x01);
bSendSelt=FALSE;
}
else if(byU1RcvBuf[4]==0x6A)//PC要求车载马上回传信息,即PC处于接收状态
{
SendBuf[0] = byOldCarStatus;
UART1_ISendBuf(0x01,0x5A,SendBuf,0x01);
}
else if(byU1RcvBuf[4]==0x30)//PC向车载询问通信错误,并复位这些错误的记录。
{
SendBuf[0]=byU1RcvBuf[4];
SendBuf[1]=byUART1_RcvFlag;
UART1_ISendBuf(0x01,0x31,SendBuf,0x02);
byUART1_RcvFlag=0;
}
else if(byU1RcvBuf[4]==0x91)//PC向车载询问通信错误,并复位这些错误的记录。
{
byPowerJustOn=255;
}
else if(byU1RcvBuf[4]==0x99)//PC向车载询问通信错误,并复位这些错误的记录。
{
u16CarStatusSendOK=25500;
}
else //车载收到没有定义的信息。
{
SendBuf[0]=byU1RcvBuf[4];
SendBuf[1]=byUART1_RcvFlag;
UART1_ISendBuf(0x01,0x32,SendBuf,0x02);
byUART1_RcvFlag=0;
}
}
else
{
SendBuf[0]=byU1RcvBuf[4];
SendBuf[1]=byUART1_RcvFlag;
UART1_ISendBuf(0x01,0x33,SendBuf,0x02);
byUART1_RcvFlag=0;
}
byU1RcvBufOK=0;
}
else
{
iGetCarStatusCounter++;
if(iGetCarStatusCounter>10)
{
iGetCarStatusCounter=0;
byCarStatus = GetCarStatus(20000,20000);
if(byOldCarStatus!=byCarStatus)
{
byOldCarStatus=byCarStatus;
ShowCarStatus(1,76,(byCarStatus & 0x0F));
if(bSendSelt)
{
SendBuf[0] = byOldCarStatus;
UART1_ISendBuf(0x01,0x98,SendBuf,0x01);
u16CarStatusSendOK=0;
byReSendCounter=0;
byMainBoardClose=FALSE;
}
}
//上电消息是否需要重新发。
if(byPowerJustOn<250)
{
if(byPowerJustOn<200)
byPowerJustOn++;
else
{
byPowerJustOn=255;
UART1_ISendBuf(0x01,0x90,SendBuf,0x00);
}
}
//车状态没有发送到数传电台,需要重新发送。
if(u16CarStatusSendOK<25000 && byMainBoardClose==FALSE)
{
if(u16CarStatusSendOK<20000)
u16CarStatusSendOK++;
else
{
if(byReSendCounter<5)
{
u16CarStatusSendOK=0;
byReSendCounter++;
}
else
{
byMainBoardClose=TRUE;
}
SendBuf[0] = byOldCarStatus;
UART1_ISendBuf(0x01,0x98,SendBuf,0x01);
u16CarStatusSendOK=FALSE;
}
}
}
}
delay(2);
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -