?? carport.c
字號:
/***************************************
功能:立體車庫上位機控制主程序
文件名:carport.c
硬件:AT89S52
編譯人:肖強
編譯:Keil-2008-12-9
****************************************/
#include<reg52.h>
#include<Up_control.h>
#include<KEY_scan.h>
#include<LCD_menu.h>
#define uchar unsigned char
#define uint unsigned char
uchar KEY_data_1; //鍵盤輸入高位數據
uchar KEY_data_2; //鍵盤輸入低位數據
uchar Reci; //下位機執行完成
bit KEY_OK;
bit KEY_ESC;
bit Data_complit=0;
void delay(unsigned char y);
void int_string_com(void); //串口初始化函數
uchar Data_sent(void); //有用數據發送
uchar senddate();//握手和數據傳輸 及檢測傳輸是否正確;
void main(void)
{
uchar Send_data,GET_ok,delay_i;
uchar ch;
Start_Piture(0,0,1,1); //開機畫面函數
for(delay_i=0;delay_i<40;delay_i++)
{
delay(65500);
}
while(1)
{
STA:
Clear_12864(1);
Clear_12864(2);
/********************
原始車位圖面
**********************/
Piture_1(1);
RET1:
BlackInput(6,16,2,1); //1不反色,0反色
Number(2,0,1); //輸入數字顯示清零
/********************
原來車位數據輸入
**********************/
KEY_data_1=KEY_scan(); //取原始位置十位數據
while(1)
{
if(KEY_data_1<6)
{
// side=0;
KEY_OK=0;
KEY_ESC=0;
Data_complit=0;
break;
}
KEY_data_1=KEY_scan();
}
delay(100);
ClickNumber(KEY_data_1,1); //輸入個位數據
KEY_data_2=KEY_scan();
while(1) //取原始位置十位數據
{
if(KEY_data_2<10)
{
// side=0;
KEY_OK=0;
KEY_ESC=0;
Data_complit=0;
break;
}
KEY_data_2=KEY_scan();
}
delay(200);
ClickNumber(KEY_data_2,0); //輸入個位數據送LCD顯示
Send_data=KEY_data_1*10+KEY_data_2;
if((Send_data==0)||(Send_data>50)) //輸入數據無效時
{
Unoption_Piture(0,0,1); //調用無效輸入畫面重新
for(delay_i=0;delay_i<20;delay_i++)
{
delay(65500);
}
goto STA;
}
GET_ok=GET_position(Send_data,Data_complit);
while(1)
{
if(GET_ok) break; //數據獲得成功
GET_ok=GET_position(Send_data,Data_complit);
}
/**/ KEY_data_2=KEY_scan(); //等待確認鍵按下
while(1)
{
// if(KEY_data_2=10) side=1;
if (KEY_data_2==10) //確認鍵/返回鍵按下處理
{
KEY_OK=1;
KEY_ESC=0;
SureKey(6,16,1,0);
delay(1000);
goto RET2; // 進入下一界面顯示
break;
}
else if (KEY_data_2==11) //返回鍵按下
{
KEY_OK=0;
KEY_ESC=1;
BlackInput(6,16,2,0);
delay(1000);
goto RET1;//返回上一個界面
break;
}
KEY_data_2=KEY_scan();
}
/********************
目標車位數據輸入
**********************/
RET2:
Clear_12864(1);
Clear_12864(2);
Piture_1(0);
RET3:
BlackInput(6,16,2,1);
Number(2,0,1); //輸入數字顯示清零
KEY_data_1=KEY_scan(); //取目標車庫位置十位數據
while(1)
{
if(KEY_data_1<6)
{
// side=0;
KEY_OK=0;
KEY_ESC=0;
Data_complit=1;
break;
}
KEY_data_1=KEY_scan();
}
ClickNumber(KEY_data_1,1); //輸入十位數據送LCD顯示
KEY_data_2=KEY_scan();
while(1) //取原始位置個位數據
{
if(KEY_data_2<10)
{
// side=0;
KEY_OK=0;
KEY_ESC=0;
Data_complit=1;
break;
}
KEY_data_2=KEY_scan();
}
ClickNumber(KEY_data_2,0); //輸入個位數據送LCD顯示
Send_data=KEY_data_1*10+KEY_data_2;
if((Send_data==0)||(Send_data>50)) //輸入數據無效時
{
Unoption_Piture(0,0,1); //調用無效輸入畫面重新
for(delay_i=0;delay_i<20;delay_i++)
{
delay(65500);
}
goto RET2;
}
GET_ok=GET_position(Send_data,Data_complit);
while(1)
{
if(GET_ok) break; //數據獲得成功
GET_ok=GET_position(Send_data,Data_complit);
}
/**/ KEY_data_2=KEY_scan(); //等待確認鍵按下
while(1)
{
// if(KEY_data_2=10) side=1;
if (KEY_data_2==10) //確認鍵/返回鍵按下處理
{
KEY_OK=1;
KEY_ESC=0;
Clear_12864(1);
Clear_12864(2);
goto RET4;// 進入下一界面顯示
break;
}
else if (KEY_data_2==11) //返回鍵按下
{
KEY_OK=0;
KEY_ESC=1;
BlackInput(6,16,2,0);
delay(1000);
goto RET3;//返回上一個界面
break;
}
KEY_data_2=KEY_scan();
}
/**************************************
顯示執行畫面
***************************************/
RET4:
Clear_12864(1);
Clear_12864(2);
Work_Piture(0,0,1); //下位機執行畫面
//RET5:
/**************************************
向下位機送數據
***************************************/
//判斷SENDEDATE 返回錯誤則延時一段實際后繼續傳送;
int_string_com();
while(1)
{
if(senddate())
break; //傳輸正確
else
delay(50);//如果出錯則繼續傳送
}
delay(100);
int_string_com();
while(!RI); //等待下位機返回執行完數據
RI=0;
ch=SBUF;
if(ch=='E')//操作成功 進行下次輸入
{
Over_Piture(0,0,1); //調用LCD顯示執行完成畫面函數
for(delay_i=0;delay_i<40;delay_i++)
{
delay(65500);
}
}
else if(ch=='F') //則嚴重出錯 嚴重出錯處理;
{
Eorr_Piture(0,0,1);
for(delay_i=0;delay_i<40;delay_i++)
{
delay(65500);
}
}
else //數據傳輸錯誤,請檢查數據傳輸;
{
}
}
// delay(65000);
}
uchar senddate()
{
uchar ch;
while(1)
{
SBUF='A';
while(!TI);
TI=0;
while(!RI);
ch = SBUF;
RI=0;
if(ch=='B')
break;
else
delay(256);
}
Data_sent();//發送數據
while(!RI);
ch = SBUF;
RI=0;
if(ch=='C') //傳輸出錯
return 0;
else //傳輸正確;
return 1;
}
uchar Data_sent(void)
{
uchar i;
uchar total=0;
for (i=0;i<7;i++)
{
SBUF=car_tab[i];
total=total+car_tab[i]; //求校驗和
while(!TI);
TI=0;
}
SBUF=total; //傳輸校驗和
while(!TI);
TI=0;
return 1;
}
void int_string_com(void)
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0x50; //設置串行口方式,工作于方式2
PCON=0x00;
ES=0; //允許串口中斷
EA=1;//開總中斷
TR1=1;
}
/*//串口中斷程序
void String(void) interrupt 4 using 2
{
// uchar x,y;
if(RI)
{
Reci=SBUF; //單片機接收數據
// for (i=0;i<8;i++)
// { }
// p=p-8;
}
RI=0;
} */
void delay(uint y)
{
uchar x;
for(;y;y--)
for(x=0;x<100;x++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -