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