?? 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 + -