uvsensor.c
来自「基于pic1687x 的UVSensor 源程序,带128*64 LCD显示,以」· C语言 代码 · 共 1,665 行 · 第 1/4 页
C
1,665 行
NowTime[3] = P8563Data[5]%16;
NowTime[4] = P8563Data[3]/16;//日
NowTime[5] = P8563Data[3]%16;
NowTime[6] = P8563Data[4]%16;//星期
NowTime[7] = P8563Data[2]/16;//时
NowTime[8] = P8563Data[2]%16;
NowTime[9] = P8563Data[1]/16;//分
NowTime[10] = P8563Data[1]%16;
NowTime[11] = P8563Data[0]/16;//秒
NowTime[12] = P8563Data[0]%16;
}
/******************************************************************************/
/******************** 测量Sensor的数据并保存****************************/
/******************************************************************************/
void GetSensorData(void)
{
unsigned char i,j;
unsigned int Total_ADData = 0;
unsigned char magic[5];
union
{
unsigned int DataInt;
unsigned char DataChar[2];
}AD;
union
{
unsigned int WAddInt;
unsigned char WAddChar[2];
}EepAdd;
Read_24C512(0x00,5,magic);//读标志位和地址
if(magic[0]!=0x55)
{
magic[0] = 0x55;
magic[1] = EepDataAdd;
magic[2] = 0x00;
magic[3] = EepDataAdd;
magic[4] = 0x00;
Write_24C512(0x0000,5, magic);//重新写标志位和地址
}
Read_24C512(0x0003,2,EepAdd.WAddChar);//读出写地址
//记录测量的时间
Write_24C512(EepAdd.WAddInt, 1, &P8563Data[6]);//Year
EepAdd.WAddInt ++;
Write_24C512(EepAdd.WAddInt, 1, &P8563Data[5]);//month
EepAdd.WAddInt ++;
Write_24C512(EepAdd.WAddInt, 1, &P8563Data[3]);//day
EepAdd.WAddInt ++;
Write_24C512(EepAdd.WAddInt, 1, &P8563Data[2]);//hour
EepAdd.WAddInt ++;
Write_24C512(EepAdd.WAddInt, 1, &P8563Data[1]);//minute
EepAdd.WAddInt ++;
for(i=0;i<8;i++) ///8个Sensor
{
PORTE = i;//选择模拟开关的通道
DelayMs(500);//延时,使电压稳定
Total_ADData = 0;//清零,必须要的
for(j=0;j<ADCount;j++)//测量多次,取平均值
{
ADGO=1; //启动A/D 转换
while(ADGO);//等待AD转换完成
AD.DataChar[0]= ADRESL;
AD.DataChar[1] = ADRESH;
Total_ADData += AD.DataInt;
DelayMs(20);
}
Total_ADData /= ADCount;
AD.DataInt = Total_ADData;
Write_24C512(EepAdd.WAddInt, 2, AD.DataChar);
EepAdd.WAddInt += 2;
}
Write_24C512(0x0003,2,EepAdd.WAddChar);//保存写地址
// DelayMs(1000);
}
/******************************************************************************/
/***************** 判断测量时间 ****************************/
/******************************************************************************/
unsigned char Judge_MeaTime(void)
{
unsigned char const JudgeMenu[] = "正在测量中……";
unsigned int TimeTemp1 = 0,TimeTemp2 = 0;
unsigned char i,Flag;
if(Eep_MeaData.Mea_Switch == 0)
return 0;
TimeTemp1 = Eep_MeaData.EndTime;
TimeTemp2 = ((TimeTemp1>>12) & 0x000F)*600 + ((TimeTemp1>>8) & 0x000F)*60 + ((TimeTemp1>> 4) & 0x000F) *10 + (TimeTemp1 & 0x000F);
TimeTemp1 = ((P8563Data[2]>>4) & 0x0F)*600 + (P8563Data[2] & 0x0F)*60 + ((P8563Data[1]>> 4) & 0x0F) *10 + (P8563Data[1] & 0x0F);//当前的时间转换成分钟
if(TimeTemp1 > TimeTemp2)//现在的时间大于结束的时间
return 0;
TimeTemp1 = Eep_MeaData.StartTime;
TimeTemp2 = ((TimeTemp1>>12) & 0x000F)*600 + ((TimeTemp1>>8) & 0x000F)*60 + ((TimeTemp1>> 4) & 0x000F) *10 + (TimeTemp1 & 0x000F);
TimeTemp1 = ((P8563Data[2]>>4) & 0x0F)*600 + (P8563Data[2] & 0x0F)*60 + ((P8563Data[1]>> 4) & 0x0F) *10 + (P8563Data[1] & 0x0F);//当前的时间转换成分钟
TimeTemp1 = (TimeTemp1 -TimeTemp2)% (Eep_MeaData.Time*10);//判断是否到时间
Flag = TimeTemp1;
if((Flag == 0)&&(P8563Data[0]==0))
{
LCD_Write_Command(0x01);//清除显示
LCD_set_xy( 0, 1 );//第二行
for(i=0;i<14;i++)
{
LCD_Write_Data(JudgeMenu[i]);
}
GetSensorData();
return 1;
}
else
{
return 0;
}
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void Display_Menu(unsigned char MenuPos)
{
unsigned char i,MenuPicTemp[2];
unsigned char DateTime[] = "00-00 00:00'00\"";
if(FlashFlag)
{
MenuPicTemp[0] = MenuPic[0];
MenuPicTemp[1] = MenuPic[1];
}
else
{
MenuPicTemp[0] = MenuPic[2];
MenuPicTemp[1] = MenuPic[3];
}
if(MainMenuFlag)
{
MainMenuFlag = 0;
LCD_set_xy(1,0);//第一行
for(i=0;i<14;i++)
{
LCD_Write_Data(Menu1[i]);
}
LCD_set_xy( 1, 1 );//第二行
for(i=0;i<14;i++)
{
LCD_Write_Data(Menu2[i]);
}
LCD_set_xy( 1, 2 );//第三行
for(i=0;i<14;i++)
{
LCD_Write_Data(Menu3[i]);
}
}
switch(MenuPos)
{
case 0 :
LCD_set_xy(0,0);//第一行
LCD_Write_Data(MenuPicTemp[0]);
LCD_Write_Data(MenuPicTemp[1]);
LCD_set_xy( 0, 1 );//第二行
LCD_Write_Data(' ');
LCD_Write_Data(' ');
LCD_set_xy( 0, 2 );//第三行
LCD_Write_Data(' ');
LCD_Write_Data(' ');
break;
case 1 :
LCD_set_xy(0,0);//第一行
LCD_Write_Data(' ');
LCD_Write_Data(' ');
LCD_set_xy( 0, 1 );//第二行
LCD_Write_Data(MenuPicTemp[0]);
LCD_Write_Data(MenuPicTemp[1]);
LCD_set_xy( 0, 2 );//第三行
LCD_Write_Data(' ');
LCD_Write_Data(' ');
break;
case 2 :
LCD_set_xy(0,0);//第一行
LCD_Write_Data(' ');
LCD_Write_Data(' ');
LCD_set_xy( 0, 1 );//第二行
LCD_Write_Data(' ');
LCD_Write_Data(' ');
LCD_set_xy( 0, 2 );//第三行
LCD_Write_Data(MenuPicTemp[0]);
LCD_Write_Data(MenuPicTemp[1]);
break;
default : break;
}
DateTime[0] = NowTime[2] + '0'; //月
DateTime[1] = NowTime[3] + '0';
DateTime[3] = NowTime[4] + '0'; //日
DateTime[4] = NowTime[5] + '0';
DateTime[7] = NowTime[7] + '0'; //时
DateTime[8] = NowTime[8] + '0';
DateTime[10] = NowTime[9] + '0'; //分
DateTime[11] = NowTime[10] + '0';
DateTime[13] = NowTime[11] + '0'; //秒
DateTime[14] = NowTime[12] + '0';
LCD_Write_string(0,3,&DateTime[0]);
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void Display_SetTime(unsigned char Pos)
{
unsigned char const SetTimeMenu[] = "请重新设置时间…";
unsigned char const DateDis[] = "日期: 20";
unsigned char const WeekDis[] = "星期";
unsigned char const TimeDis[] = "时间: ";
unsigned char const WeekData[] = "日一二三四五六";
unsigned char i;
LCD_set_xy(0,0);
for(i=0;i<16;i++)
LCD_Write_Data(SetTimeMenu[i]);
LCD_set_xy(0,1);
for(i=0;i<8;i++)
LCD_Write_Data(DateDis[i]);
LCD_set_xy(0,2);
for(i=0;i<4;i++)
LCD_Write_Data(WeekDis[i]);
LCD_set_xy(0,3);
for(i=0;i<6;i++)
LCD_Write_Data(TimeDis[i]);
LCD_set_xy(4,1);//年
if(FlashFlag&&(Pos==0))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[0] + '0');
if(FlashFlag&&(Pos==1))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[1] + '0');
// LCD_set_xy(5,1);//月
LCD_Write_Data('-');
if(FlashFlag&&(Pos==2))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[2] + '0');
if(FlashFlag&&(Pos==3))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[3] + '0');
LCD_Write_Data('-');
// LCD_set_xy(7,1);//日
if(FlashFlag&&(Pos==4))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[4] + '0');
if(FlashFlag&&(Pos==5))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[5] + '0');
LCD_set_xy(2,2);//星期
if(FlashFlag&&(Pos==6))
{
LCD_Write_Data(FlashPic);
LCD_Write_Data(FlashPic);
}
else
{
LCD_Write_Data(WeekData[NowTime[6]*2]);
LCD_Write_Data(WeekData[NowTime[6]*2+1]);
}
LCD_set_xy(3,3);//时
if(FlashFlag&&(Pos==7))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[7] + '0');
if(FlashFlag&&(Pos==8))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[8] + '0');
// LCD_set_xy(4,3);//分
LCD_Write_Data(':');
if(FlashFlag&&(Pos==9))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[9] + '0');
if(FlashFlag&&(Pos==10))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[10] + '0');
LCD_Write_Data('\'');
// LCD_set_xy(6,3);//秒
if(FlashFlag&&(Pos==11))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[11] + '0');
if(FlashFlag&&(Pos==12))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data(NowTime[12] + '0');
LCD_Write_Data('\"');
LCD_Write_Data(' ');
}
/******************************************************************************/
/******************************************************************************/
void Save_NewTime(void)
{
unsigned char NewTime[14]={0x00,0x00,0x39,0x31,0x21,0x20,0x03,0x09,0x06,0x80,0x80,0x80,0x80,0x83};
unsigned char TimeTemp=0;
TimeTemp = NowTime[0];
TimeTemp <<= 4;
NewTime[8] = TimeTemp|NowTime[1];
TimeTemp = NowTime[2];
TimeTemp <<= 4;
NewTime[7] = TimeTemp|NowTime[3];
TimeTemp = NowTime[4];
TimeTemp <<= 4;
NewTime[5] = TimeTemp|NowTime[5];
NewTime[6] = TimeTemp|NowTime[6];
TimeTemp = NowTime[7];
TimeTemp <<= 4;
NewTime[4] = TimeTemp|NowTime[8];
TimeTemp = NowTime[9];
TimeTemp <<= 4;
NewTime[3] = TimeTemp|NowTime[10];
TimeTemp = NowTime[11];
TimeTemp <<= 4;
NewTime[2] = TimeTemp|NowTime[12];
P8563_WriteData(WRADDR,NewTime,14); //初始化PCF8563,如果需要的话可以不去掉
}
/******************************************************************************/
/******************** 设置系统时间 *********************************/
/******************************************************************************/
void AdjustTime(void)
{
unsigned char const MaxMonthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//每月的最大天数
unsigned char LeapyearFlag = 0;
if((NowTime[2]*10 + NowTime[3]) > 12)//Month
{
NowTime[2] = 1;
NowTime[3] = 2;
}
if(((NowTime[0]*10 + NowTime[1])%4 == 0) & ((NowTime[2]*10 + NowTime[3]) == 2))//Leapyear
LeapyearFlag = 1;//是闰年
else
LeapyearFlag = 0;
if((NowTime[4]*10 + NowTime[5]) > (MaxMonthDay[NowTime[2]*10 + NowTime[3]] + LeapyearFlag))//day
{
NowTime[4] = MaxMonthDay[NowTime[2]*10 + NowTime[3]]/10;
NowTime[5] = MaxMonthDay[NowTime[2]*10 + NowTime[3]]%10 + LeapyearFlag;
}
if((NowTime[7]*10 + NowTime[8]) > 23)//Hour
{
NowTime[7] = 2;
NowTime[8] = 3;
}
}
/******************************************************************************/
/******************************************************************************/
/******************** 设置系统时间 *********************************/
/******************************************************************************/
void SetSysTime(void)
{
unsigned char SetTimePos = 0;//设置时间的位置
unsigned char FlashFlagTemp = 0;
unsigned char const MaxData[13] = {9,9,1,9,3,9,6,2,9,5,9,5,9};
LCD_Write_Command(0x01);//清除显示
while(1)
{
FlashFlag = RB0;
if(FlashFlagTemp == FlashFlag)
{
Display_SetTime(SetTimePos);
FlashFlagTemp =! FlashFlag;
}
P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
Judge_MeaTime();
if(RD0==0)//后一个
{
DelayMs(1);
if(RD0==0)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?