📄 main_lsd.c
字号:
if ( hour1 == 0 )
{
if ( hour0 == 0 )
{
hour1 = 2;
hour0 = 3;
}
else
hour0--;
}
else if ( hour0 == 0 )
{
hour1--;
hour0 = 9;
}
else
hour0--;
}
display( hour1,8,0xBA,0x40,1 );
display( hour0,8,0xBA,0x48,1 );
hour = ( hour1 << 4 ) | hour0; //pass new hour
if ( Key == 4 )
break;
else if ( Key == 3 )
goto MINUTE;
goto HOUR;
//set minute
MINUTE:
display( 0x19,16,0xBA,0x60,0 ); //分
Key = KeyboradScan();
while ( ( Key ==0 ) | ( Key > 4 ) )
{
Key = KeyboradScan();
}
delay( 10 );
if ( Key == 1 ) // add
{
if ( minute1 == 5 )
{
if ( minute0 == 9 )
{
minute1 = 0;
minute0 = 0;
}
else
minute0++;
}
else if ( minute0 == 9 )
{
minute1++;
minute0 = 0;
}
else
minute0++;
}
if ( Key == 2 ) //substract
{
if ( minute1 == 0 )
{
if ( minute0 == 0 )
{
minute1 = 5;
minute0 = 9;
}
else
minute0--;
}
else if ( minute0 == 0 )
{
minute1--;
minute0 = 9;
}
else
minute0--;
}
display( minute1,8,0xBA,0x58,1 );
display( minute0,8,0xBA,0x60,1 );
minute = ( minute1 << 4 ) | minute0; //pass new day
if ( Key == 4 )
break;
else if ( Key == 3 )
goto SECOND;
goto MINUTE;
//set second
SECOND:
display( 0x20,16,0xBA,0x60,0 ); //秒
Key = KeyboradScan();
while ( ( Key ==0 ) | ( Key > 4 ) )
{
Key = KeyboradScan();
}
delay( 10 );
if ( Key == 1 ) // add
{
if ( second1 == 5 )
{
if ( second0 == 9 )
{
second1 = 0;
second0 = 0;
}
else
second0++;
}
else if ( second0 == 9 )
{
second1++;
second0 = 0;
}
else
second0++;
}
if ( Key == 2 ) //substract
{
if ( second1 == 0 )
{
if ( second0 == 0 )
{
second1 = 5;
second0 = 9;
}
else
second0--;
}
else if ( second0 == 0 )
{
second1--;
second0 = 9;
}
else
second0--;
}
display( second1,8,0xBA,0x70,1 );
display( second0,8,0xBA,0x78,1 );
second = ( second1 << 4 ) | second0; //pass new day
if ( Key == 4 )
break;
else if ( Key == 3 )
goto YEAR;
goto SECOND;
}
WriteInto8653=WrStr(wr_addr,0x00,0x00); //write time into the PCF8563
WriteInto8653=WrStr(wr_addr,0x01,0x00);
WriteInto8653=WrStr(wr_addr,0x08,year); //year
WriteInto8653=WrStr(wr_addr,0x07,month);//month
WriteInto8653=WrStr(wr_addr,0x06,date); //weekday
WriteInto8653=WrStr(wr_addr,0x05,day); //date
WriteInto8653=WrStr(wr_addr,0x04,hour);//hour
WriteInto8653=WrStr(wr_addr,0x03,minute);//minitute
WriteInto8653=WrStr(wr_addr,0x02,second);//second
}
/****************************************************************/
/*****************************************************************
The module of display Current Time function
*****************************************************************/
void DisplayCurrentTime( )
{
year=RdStr(wr_addr,0x08); //read infomation about time
month=RdStr(wr_addr,0x07);
day=RdStr(wr_addr,0x05);
hour=RdStr(wr_addr,0x04);
minute=RdStr(wr_addr,0x03);
second=RdStr(wr_addr,0x02);
date=RdStr(wr_addr,0x06);
WriteByte(year,0x00); //save off time
WriteByte(month,0x01);
WriteByte(day,0x02);
WriteByte(hour,0x03);
WriteByte(minute,0x04);
WriteByte(second,0x05);
WriteByte(date,0x06);
year1=(year>>4)&0x0f;
year0=year&0x0f;
month1=(month>>4)&0x01;
month0=month&0x0f;
day1=(day>>4)&0x03;
day0=day&0x0f;
hour1=(hour>>4)&0x03;
hour0=hour&0x0f;
minute1=(minute>>4)&0x07;
minute0=minute&0x0f;
second1=(second>>4)&0x07;
second0=second&0x0f;
date0=date&0x07;
display(year1,8,0xb8,0x40,0); //display the current time
display(year0,8,0xb8,0x48,0);
display(0x07,16,0xb8,0x50,0);
display(month1,8,0xb8,0x60,0);
display(month0,8,0xb8,0x68,0);
display(0x08,16,0xb8,0x70,0);
display(day1,8,0xb8,0x40,1);
display(day0,8,0xb8,0x48,1);
display(0x00,16,0xb8,0x50,1);
display(0x09,16,0xb8,0x60,1);
display(date0,16,0xb8,0x70,1);
display(0x10,16,0xba,0x40,0);
display(0x11,16,0xba,0x50,0);
display(0x12,16,0xba,0x60,0);
display(0x13,16,0xba,0x70,0);
display(hour1,8,0xba,0x40,1);
display(hour0,8,0xba,0x48,1);
display(0x10,8,0xba,0x50,1);
display(minute1,8,0xba,0x58,1);
display(minute0,8,0xba,0x60,1);
display(0x10,8,0xba,0x68,1);
display(second1,8,0xba,0x70,1);
display(second0,8,0xba,0x78,1);
return;
}
/*************************************************/
/*****************************************************************
The module of check for handing on data function
*****************************************************************/
void CheckSend( )
{
if ( ( year4 == year ) & ( month4 == ( month & 0x3F ) ) )
{
if ( ( date4 == ( day & 0x3F ) ) & ( hour4 == ( hour & 0x3F ) ) )
{
if( ( minute4 == ( minute & 0x7F )) & ( second4 == ( second & 0x7F ) ) )
{
flag = 1;
TI = 1;
}
}
}
}
/************************************************************/
/************ 初始化定时和串口中断 ************************/
void TnitialTimeAndSerialCom( )
{
n=0; // 给n赋初值
IndexForCom = 0;
address_ram=0;// 初始化address_ram,即初始化62256
address_scom = 0; //ready for serial port communication;
IE=0x92; // T/C0开中断,CPU开中断
IP=0x10;
TMOD=0x21; // T/C0工作在定时器方式1,T/C1工作在定时器方式2
PCON = 0x00;//1200bps
SCON = 0x50;//serial port mode 1
TH0=(65536-46080)/256;// 设置定时器,每50ms响应一次中断(若晶振为12MHz)
TL0=(65536-46080)%256;//(因为实验箱提供的是11.0592MHz的晶振)
TH1 = 0xE8;
TL1 = 0xE8;
TR1=1;//start the serial com1
TR0=1; // 启动T/C0开始定时
}
/************* 中断采用定时器0的方式(中断定时采集在时间上要比延时采集精确) *******************/
void AD( ) interrupt 1 // T/C0中断服务程序入口
{
uchar b,b1,b0;
uchar i;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
n=n+1;
if ( address_ram < 32760 )
{
if(n==40) //每40*50ms=2s采集一次数据
{
n=0;
IN0=0;
i=i; //延时等待ADEOC变低
i=i;
while(ADEOC==0);
b=IN0;
XBYTE[address_ram]=b;
XBYTE[address_ram+1]=month & 0x1F;
XBYTE[address_ram+2]=day & 0x3F;
XBYTE[address_ram+3]=hour & 0x3F;
XBYTE[address_ram+4]=minute & 0x7F;
XBYTE[address_ram+5]=second & 0x7F;
b1=(b>>4)&0x0f;
b0=b&0x0f;
display(0x09,16,0xbc,0x40,0);
display(0x25,16,0xbc,0x50,0);//数
display(0x26,16,0xbc,0x60,0);//据
display(0x23,16,0xbc,0x70,0);//采
display(0x24,16,0xbc,0x40,1);//集
display(0x27,16,0xbc,0x50,1);//中
display(0x18, 8,0xbc,0x60,1);//.
display(0x18, 8,0xbc,0x68,1);//.
display(0x18, 8,0xbc,0x70,1);//.
XBYTE[ 0xE000 ] = 0xEF; //点亮一绿灯
display(b1,8,0xbe,0x78,0);//显示采集数据
display(b0,8,0xbe,0x40,1);
display( 0x09,16,0xBE,0x40,0 );
display( 0x09,16,0xBE,0x50,0 );
display( 0x09,16,0xBE,0x60,0 );
display( 0x11, 8,0xBE,0x70,0 );
display( 0x11, 8,0xBE,0x48,1 );
display( 0x09,16,0xBE,0x50,1 );
display( 0x09,16,0xBE,0x60,1 );
display( 0x09,16,0xBE,0x70,1 );
address_ram = address_ram + 6;
}
else
{
DisplayCurrentTime();
CheckSend(); //check whether hand on time matches
XBYTE[ 0xE000 ] = 0xFF;
}
}
else
address_ram = 0;
}
/*****************************************************/
/*****************************************************************
The module of serial communication function
*****************************************************************/
void SerialCom( ) interrupt 4
{
uchar Command[5];
if ( RI == 1 )
{
RI = 0;
Command[IndexForCom] = SBUF;
if ( Command[0]!= 0 )
return;
else
IndexForCom++;
if ( IndexForCom != 5 )
return;
else
{
IndexForCom = 0;
display(0x09,16,0xbc,0x40,0);
display(0x21,16,0xbc,0x50,0);//正
display(0x22,16,0xbc,0x60,0);//在
display(0x31,16,0xbc,0x70,0);//搜
display(0x32,16,0xbc,0x40,1);//索
display(0x27,16,0xbc,0x50,1);//中
display(0x18, 8,0xbc,0x60,1);//.
display(0x18, 8,0xbc,0x68,1);//.
display(0x18, 8,0xbc,0x70,1);//.
XBYTE[0xE000] = 0xDB; //点亮红灯
display( 0x09,16,0xBE,0x40,0 );
display( 0x09,16,0xBE,0x50,0 );
display( 0x09,16,0xBE,0x60,0 );
display( 0x09,16,0xBE,0x70,0 );
display( 0x09,16,0xBE,0x40,1 );
display( 0x09,16,0xBE,0x50,1 );
display( 0x09,16,0xBE,0x60,1 );
display( 0x09,16,0xBE,0x70,1 );
for ( address_scom = 0; address_scom <= 32760; address_scom = address_scom + 6 )
{
DisplayCurrentTime();
if ( ( XBYTE[ address_scom+3 ] >= Command[1] ) & ( XBYTE[ address_scom+3 ] <= Command[3] ) ) //hour matched
{
if ( (XBYTE[ address_scom+4 ] >= Command[2]) & ( XBYTE[ address_scom+4 ] < Command[4] ) ) //minute matched
{
TI = 1;
flag=0;
break;
}
else if ( address_scom == 32760 )
break;
}
}//for
}//else
return;
}//if
/////////////////////////////////////
else if ( ( TI == 1 ) & ( flag == 0 ) )
{
TI = 0;
DisplayCurrentTime();
display(0x09,16,0xbc,0x40,0);
display(0x21,16,0xbc,0x50,0);//正
display(0x22,16,0xbc,0x60,0);//在
display(0x29,16,0xbc,0x70,0);//上
display(0x30,16,0xbc,0x40,1);//传
display(0x27,16,0xbc,0x50,1);//中
display(0x18, 8,0xbc,0x60,1);//.
display(0x18, 8,0xbc,0x68,1);//.
display(0x18, 8,0xbc,0x70,1);//.
XBYTE[0xE000] = 0xB6; //点亮黄灯
display( 0x09,16,0xBE,0x40,0 );
display( 0x09,16,0xBE,0x50,0 );
display( 0x09,16,0xBE,0x60,0 );
display( 0x09,16,0xBE,0x70,0 );
display( 0x09,16,0xBE,0x40,1 );
display( 0x09,16,0xBE,0x50,1 );
display( 0x09,16,0xBE,0x60,1 );
display( 0x09,16,0xBE,0x70,1 );
if ( Command[1] == Command[3] )
{
if ( XBYTE[ address_scom+3 ] == Command[1] )
{
if ( XBYTE[ address_scom+4 ] < Command[4] )
{
SBUF = XBYTE[ address_scom ];
if ( address_scom == 32760 )
address_scom = 0;
else
address_scom = address_scom + 6;
}
else
return;
}
else
return;
}
else
{
if ( XBYTE[ address_scom+3 ] < Command[3] )
{
SBUF = XBYTE[ address_scom ];
if ( address_scom == 32760 )
address_scom = 0;
else
address_scom = address_scom + 6;
}
else
{
if ( XBYTE[ address_scom+4 ] <= Command[4] )
{
SBUF = XBYTE[ address_scom ];
if ( address_scom == 32760 )
address_scom = 0;
else
address_scom = address_scom + 6;
}
else
return;
}
}//for else
}//for else if
/////////////////////////////////////////
else if ( ( TI == 1 ) & ( flag == 1 ) )
{
TI = 0;
DisplayCurrentTime();
display(0x09,16,0xbc,0x40,0);
display(0x28,16,0xbc,0x50,0);//定
display(0x12,16,0xbc,0x60,0);//时
display(0x29,16,0xbc,0x70,0);//上
display(0x30,16,0xbc,0x40,1);//传
display(0x27,16,0xbc,0x50,1);//中
display(0x18, 8,0xbc,0x60,1);//.
display(0x18, 8,0xbc,0x68,1);//.
display(0x18, 8,0xbc,0x70,1);//.
XBYTE[0xE000] = 0x6D; //点亮绿灯
display( 0x09,16,0xBE,0x40,0 );
display( 0x09,16,0xBE,0x50,0 );
display( 0x09,16,0xBE,0x60,0 );
display( 0x09,16,0xBE,0x70,0 );
display( 0x09,16,0xBE,0x40,1 );
display( 0x09,16,0xBE,0x50,1 );
display( 0x09,16,0xBE,0x60,1 );
display( 0x09,16,0xBE,0x70,1 );
if( address_scom < 180 )
{
SBUF = XBYTE[ address_scom ];
address_scom = address_scom + 6;
}
else
return;
}//for else if
}
/************************************************************/
/***************** The top program **************/
void main( )
{
DisplayOffTime(); //显示上次关机时间
while ( KeyboradScan() != 4 );
SettingHandonTime();//设置上传时间
SettingCurrentTime();//设置当前时间
TnitialTimeAndSerialCom( );//调用定时中断采集数据(2秒采集一次),调用串口中断发送指令和上传数据
}
/****************** The End *********************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -