uvsensor.c
来自「基于pic1687x 的UVSensor 源程序,带128*64 LCD显示,以」· C语言 代码 · 共 1,665 行 · 第 1/4 页
C
1,665 行
DataTemp = Eep_MeaData.EndTime;
LCD_set_xy(5,3);
if(FlashFlag&&(Pos==6))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data((unsigned char)((DataTemp >> 12)&0x000F) + '0');
if(FlashFlag&&(Pos==7))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data((unsigned char)((DataTemp >> 8)&0x000F) + '0');
LCD_Write_Data(':');
if(FlashFlag&&(Pos==8))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data((unsigned char)((DataTemp >> 4)&0x000F) + '0');
if(FlashFlag&&(Pos==9))
LCD_Write_Data(FlashPic);
else
LCD_Write_Data((unsigned char)((DataTemp)&0x000F) + '0');
LCD_Write_Data(' ');
}
void Change_MeaValue(unsigned char Pos,unsigned char Direction)
{
switch(Pos)
{
case 0 :
Eep_MeaData.Mea_Switch = !Eep_MeaData.Mea_Switch;
break;
case 1 :
if(Direction)//++
{
Eep_MeaData.Time ++;
if(Eep_MeaData.Time > 9)
Eep_MeaData.Time = 1;
}
else//--
{
if(Eep_MeaData.Time == 1)
Eep_MeaData.Time = 9;
else
Eep_MeaData.Time --;
}
break;
//Start Time
case 2 :
if(Direction)//++
{
Eep_MeaData.StartTime += 0x1000;
if((Eep_MeaData.StartTime & 0xF000) > 0x2000)
Eep_MeaData.StartTime &= 0x0FFF;
}
else//--
{
if((Eep_MeaData.StartTime & 0xF000) == 0)
Eep_MeaData.StartTime |= 0x2000;
else
Eep_MeaData.StartTime -= 0x1000;
}
break;
case 3 :
if(Direction)//++
{
Eep_MeaData.StartTime += 0x0100;
if((Eep_MeaData.StartTime & 0x0F00) > 0x0900)
Eep_MeaData.StartTime &= 0xF0FF;
}
else//--
{
if((Eep_MeaData.StartTime & 0x0F00) == 0)
Eep_MeaData.StartTime |= 0x0900;
else
Eep_MeaData.StartTime -= 0x0100;
}
break;
case 4 :
if(Direction)//++
{
Eep_MeaData.StartTime += 0x0010;
if((Eep_MeaData.StartTime & 0x00F0) > 0x0050)
Eep_MeaData.StartTime &= 0xFF0F;
}
else//--
{
if((Eep_MeaData.StartTime & 0x00F0) == 0)
Eep_MeaData.StartTime |= 0x0050;
else
Eep_MeaData.StartTime -= 0x0010;
}
break;
case 5 :
if(Direction)//++
{
Eep_MeaData.StartTime += 0x0001;
if((Eep_MeaData.StartTime & 0x000F) > 0x0009)
Eep_MeaData.StartTime &= 0xFFF0;
}
else//--
{
if((Eep_MeaData.StartTime & 0x000F) == 0)
Eep_MeaData.StartTime |= 0x0009;
else
Eep_MeaData.StartTime -= 0x0001;
}
break;
//End Time
case 6 :
if(Direction)//++
{
Eep_MeaData.EndTime += 0x1000;
if((Eep_MeaData.EndTime & 0xF000) > 0x2000)
Eep_MeaData.EndTime &= 0x0FFF;
}
else//--
{
if((Eep_MeaData.EndTime & 0xF000) == 0)
Eep_MeaData.EndTime |= 0x2000;
else
Eep_MeaData.EndTime -= 0x1000;
}
break;
case 7 :
if(Direction)//++
{
Eep_MeaData.EndTime += 0x0100;
if((Eep_MeaData.EndTime & 0x0F00) > 0x0900)
Eep_MeaData.EndTime &= 0xF0FF;
}
else//--
{
if((Eep_MeaData.EndTime & 0x0F00) == 0)
Eep_MeaData.EndTime |= 0x0900;
else
Eep_MeaData.EndTime -= 0x0100;
}
break;
case 8 :
if(Direction)//++
{
Eep_MeaData.EndTime += 0x0010;
if((Eep_MeaData.EndTime & 0x00F0) > 0x0050)
Eep_MeaData.EndTime &= 0xFF0F;
}
else//--
{
if((Eep_MeaData.EndTime & 0x00F0) == 0)
Eep_MeaData.EndTime |= 0x0050;
else
Eep_MeaData.EndTime -= 0x0010;
}
break;
case 9 :
if(Direction)//++
{
Eep_MeaData.EndTime += 0x0001;
if((Eep_MeaData.EndTime & 0x000F) > 0x0009)
Eep_MeaData.EndTime &= 0xFFF0;
}
else//--
{
if((Eep_MeaData.EndTime & 0x000F) == 0)
Eep_MeaData.EndTime |= 0x0009;
else
Eep_MeaData.EndTime -= 0x0001;
}
break;
default : break;
}
}
/******************************************************************************/
/***************** 设置测量状态 ****************************/
/******************************************************************************/
void SetMeasureState(void)
{
unsigned char SetPos = 0;
unsigned char FlashFlagTemp = 0;//初始化,一定要记住
LCD_Write_Command(0x01);//清除显示
ReadMeasureParam();
Display_SetState(SetPos);
while(1)
{
FlashFlag = RB0;
if(FlashFlagTemp == FlashFlag)
{
Display_SetState(SetPos);
FlashFlagTemp =! FlashFlag;
}
P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
Judge_MeaTime();
if(RD0==0)//后一个
{
DelayMs(1);
if(RD0==0)
{
while(!RD0);
if(SetPos == 0)
SetPos = 9;
else
SetPos--;
Display_SetState(SetPos);
}
}
if(RD1==0)//前一个
{
DelayMs(1);
if(RD1==0)
{
while(!RD1);
SetPos++;
if(SetPos > 9)
SetPos = 0;
Display_SetState(SetPos);
}
}
if(RD2==0)//--
{
DelayMs(1);
if(RD2==0)
{
while(!RD2);
Change_MeaValue(SetPos,0);
Display_SetState(SetPos);
}
}
if(RD3==0)//++
{
DelayMs(1);
if(RD3==0)
{
while(!RD3);
Change_MeaValue(SetPos,1);
Display_SetState(SetPos);
}
}
if(RD4==0)//确定
{
DelayMs(1);
if(RD4==0)
{
while(!RD4);
SaveMeasureParam();//写入新的参数
return;
}
}
if(RD5==0)//取消
{
DelayMs(1);
if(RD5==0)
{
while(!RD5);
ReadMeasureParam();//重新读出参数
return;
}
}
}
}
/******************************************************************************/
/******************** IO口初始化 **************************/
/******************** '0'表示输出;'1'表示输入。************************/
/******************************************************************************/
void IO_Init(void)
{
TRISB0 = 1;//input
TRISC = 0x00;
TRISD = 0x3F;
TRISE = 0x00;
}
/******************************************************************************/
/************** A/D 转换初始化子程序 ****************************/
/******************************************************************************/
void AD_init(void)
{
TRISA0=1; //设置RA0 为输入方式
ADCON0 = 0x81; //选择A/D 通道为RA0,打开A/D 转换器;AD 转换时钟为32tosc
ADCON1 = 0X85; //转换结果右移,及ADRESH 寄存器的高6 位为"0",外部基准电压
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void main(void)
{
unsigned char const P85636Init[14] = {0x00,0x00,0x01,0x00,0x12,0x25,0x01,0x09,0x06,0x80,0x80,0x80,0x80,0x83}; //定义初始化字
unsigned char const MeaDataInit[6] = {0,3,0x08,0x30,0x17,0x30};
unsigned char MenuPos = 0;
unsigned char i,DataTemp;
//初始化
IO_Init();
AD_init();
MSSP_initi();
LCD_Init();
MainMenuFlag = 1;
//*//test//数据清零
if((RD0==0)&(RD1==0)&(RD2==0))
{
DataTemp = 0xff;
Write_24C512(0x0000,1, &DataTemp);
}
//endtest*/
DataTemp = 0x83;///1Hz频率输出
P8563_WriteData(0x000D,&DataTemp,1);
P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
if(P8563Data[6]<0x06)//时间早于06年
{
for(i=0;i<14;i++)
{
DataTemp = P85636Init[i];
P8563_WriteData(WRADDR+i,&DataTemp,1);
}
P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
PData_To_Time(P8563Data);
SetSysTime();
}
Read_24C512(0x0000,1, &DataTemp);//第一次读数据
if(DataTemp != 0x55)
{
for(i=0;i<6;i++)
{
DataTemp = MeaDataInit[i];
Write_24C512(0x0005 + i,1, &DataTemp);
}
SetMeasureState();
}
ReadMeasureParam();//读测量参数
while(1)
{
FlashFlag = RB0;
P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
PData_To_Time(P8563Data);
Display_Menu(MenuPos);
if(Judge_MeaTime())
{
MainMenuFlag = 1;
}
if(RD0==0)//后一个
{
DelayMs(10);
if(RD0==0)
{
while(!RD0);
if(MenuPos == 0)
MenuPos = 2;
else
MenuPos --;
}
}
if(RD1==0)//前一个
{
DelayMs(10);
if(RD1==0)
{
while(!RD1);
MenuPos ++;
if(MenuPos>2)
MenuPos = 0;
}
}
if(RD4==0)//确定
{
DelayMs(10);
if(RD4==0)
{
while(!RD4);
switch(MenuPos)
{
case 0 ://scan data
ScanSensorData();
MainMenuFlag = 1;
break;
case 1 ://Set time
SetSysTime();
MainMenuFlag = 1;
break;
case 2 ://set state
SetMeasureState();
MainMenuFlag = 1;
break;
default : break;
}
}
}
/*
if(RD2==0)//--
{
while(!RD2);
}
if(RD3==0)//++
{
while(!RD3);
}
if(RD5==0)//取消
{
while(!RD5);
}
*/
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?