这是一个按键的代码
void ALM_Key_Pro(PRESS_MODE_TypeDef Press_Mode)
{
if(SysData.Cal_Mode)
{
if(SysData.Freq_Weight == C_WEIGHT)
{
SysData.Freq_Weight = A_WEIGHT;
FREQ_WEIGHT_A;
Disp_All();
Delayms(2000);
}
else
{
SysFlag.Cal_En = 1;
Cal_Pro();
}
return;
}
switch(SysData.Sys_State)
{
case MAIN_STATE:
switch(Press_Mode)
{
case SHORT_PRESS:
if(Press_Mode != SHORT_PRESS)break;
//报警开关
if(SysData.ALM_EN == ENABLE)
{
Close_Alm();
SysData.ALM_EN = DISABLE;
LED_2_OFF; //yanggj
}
else
{
SysData.ALM_EN = ENABLE;
}
SysInfo.AlmPara.Struct_Para.Alm_Switch = SysData.ALM_EN;
Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara));
break;
case LONG_PRESS:
Close_Alm();
SysData.WaitReleaseKey = 0;
SysData.Save_Cnt = 0;
SysData.Sys_State = SET_STATE;
SysData.Set_State = SET_ALM;
SysData.SET_Value = SysData.Alm / 10;
SysFlag.DispSetEn = 1;
Time_Set.year = Time_Dec.year;
Time_Set.month = Time_Dec.month;
Time_Set.day = Time_Dec.day;
Time_Set.hour = Time_Dec.hour;
Time_Set.minute = Time_Dec.minute;
Time_Set.second = Time_Dec.second;
break;
}
break;
case SET_STATE://设置状态
switch(SysData.Set_State)
{
case SET_ALM:
SysData.Alm = SysData.SET_Value * 10;
SysInfo.AlmPara.Struct_Para.Alm_Value = SysData.Alm;
SysData.SET_Value = SysInfo.AlmPara.Struct_Para.Alm_Time;
SysData.Set_State = SET_ALM_TIME;
LED_2_OFF;
Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara));
break;
case SET_ALM_TIME:
SysData.Alm_Time = SysData.SET_Value;
SysInfo.AlmPara.Struct_Para.Alm_Time = SysData.Alm_Time;
SysData.Set_State = SET_ALM_Type;
SysData.SET_Value = SysInfo.AlmPara.Struct_Para.Alm_Type;
Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara));
break;
case SET_ALM_Type:
SysData.Alm_Type = SysData.SET_Value;
SysInfo.AlmPara.Struct_Para.Alm_Type = SysData.Alm_Type;
switch(SysData.Alm_Type)
{
case 1: Set_Buzz_Pluse(BUZZ_0_LEVEL); break;
case 2: Set_Buzz_Pluse(BUZZ_1_LEVEL); break;
case 3: Set_Buzz_Pluse(BUZZ_2_LEVEL); break;
}
SysData.Set_State = SET_YEAR;
SysData.SET_Value = Time_Set.year;
Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara));
break;
case SET_YEAR:
Time_Set.year = SysData.SET_Value;
Time_Hex.year = ((Time_Set.year / 10) << 4) | (Time_Set.year % 10);
Save_TimeDate();
SysData.SET_Value = Time_Set.month;
SysData.Set_State = SET_MONTH;
break;
case SET_MONTH:
Time_Set.month = SysData.SET_Value;
Time_Hex.month = ((Time_Set.month / 10) << 4) | (Time_Set.month % 10);
Save_TimeDate();
SysData.SET_Value = Time_Set.day;
SysData.Set_State = SET_DAY;
break;
case SET_DAY:
Time_Set.day = SysData.SET_Value;
Time_Hex.day = ((Time_Set.day / 10) << 4) | (Time_Set.day % 10);
Save_TimeDate();
SysData.SET_Value = Time_Set.hour;
SysData.Set_State = SET_HOUR;
break;
case SET_HOUR:
Time_Set.hour = SysData.SET_Value;
Time_Hex.hour = ((Time_Set.hour / 10) << 4) | (Time_Set.hour % 10);
Save_TimeDate();
SysData.SET_Value = Time_Set.minute;
SysData.Set_State = SET_MINUTE;
break;
case SET_MINUTE:
Time_Set.minute = SysData.SET_Value;
Time_Hex.minute = ((Time_Set.minute / 10) << 4) | (Time_Set.minute % 10);
Save_TimeDate();
SysData.SET_Value = Time_Set.second;
SysData.Set_State = SET_SECOND;
break;
case SET_SECOND:
Time_Set.second = SysData.SET_Value;
Time_Hex.second = ((Time_Set.second / 10) << 4) | (Time_Set.second % 10);
Save_TimeDate(); //保存时间日期
if(SysData.ALM_EN == ENABLE) //yanggj
{
LED_2_ON;
}
else
{
LED_2_OFF;
}
Close_Alm();
SysData.Save_Cnt = 0;
SysData.Sys_State = MAIN_STATE;
SysData.Set_State = SET_ALM;
SysData.WaitReleaseKey = 0;
break;
case SET_ALM_CLOCK_HOUR:
SysData.Set_State = SET_ALM_CLOCK_MINUTE;
SysData.SET_Value = SysInfo.AlarmClockInfo.minute;
break;
case SET_ALM_CLOCK_MINUTE:
SysData.Set_State = SET_ALM_CLOCK_EN;
//SysData.SET_Value = SysInfo.AlarmClockInfo.enabled;
break;
case SET_ALM_CLOCK_EN:
//SysInfo.AlarmClockInfo.enabled = SysData.SET_Value;
SysData.Set_State = SET_ALM;
SysData.Sys_State = MAIN_STATE;
Para_Save();
break;
}
break;
}
}
void Disp_Set(void)
{
u32 Tmp;
if((SysData.Sys_State != SET_STATE) || ((SysData.Sys_State == SET_STATE) && (SysData.Set_State > SET_SECOND))) return;
if((SysFlag.FlickEn) && (SysFlag.LCDFlick == 0) && ((SysData.Set_State == SET_ALM_TIME) || (SysData.Set_State == SET_ALM_Type) || (SysData.Set_State == SET_ALM)))
{
Disp_Clear();
return;
}
SysFlag.DispSetEn = 0;
Tmp = SysData.SET_Value;
HexToBcd(Tmp);
Fill_Data();
if(MainData[0] == 0)
{
MainData[0] = 10;//空
if((SysData.Set_State == SET_ALM_TIME) || (SysData.Set_State == SET_ALM_Type) || (SysData.Set_State == SET_ALM))
{
if(MainData[1] == 0)
MainData[1] = 10;
}
if(SysFlag.LCDFlick)
{
switch(SysData.Set_State)
{
case SET_YEAR:
MainData[0] = 18;//年
break;
case SET_MONTH:
MainData[0] = 19;//月
break;
case SET_DAY:
MainData[0] = 20;//日
break;
case SET_HOUR:
MainData[0] = 21;//时
break;
case SET_MINUTE:
MainData[0] = 22;//分
break;
case SET_SECOND:
MainData[0] = 23;//秒
break;
}
}
}
// MainData[2]=Font_TAB_10_8_6[MainData[0]];
// MainData[1]=Font_TAB_11_9_7[MainData[1]];
// MainData[0]=Font_TAB_10_8_6[MainData[2]];
Disp_LCD();
}
这个是对应的显示的代码
#ifndef __TYPE_H
#define __TYPE_H
#include "main.h"
typedef enum
{
RANG_70DB = 0x00,
RANG_100DB = 0x01,
RANG_130DB = 0x02
} MEA_RANGE_TypeDef;
//typedef enum
//{
// POINT_100DB = 0x00,
// POINT_70DB = 0x01,
// POINT_40DB = 0x02
//} CAL_POINT_TypeDef;
typedef enum
{
SHORT_PRESS = 0x00,
LONG_PRESS = 0x01,
} PRESS_MODE_TypeDef;
typedef enum
{
A_WEIGHT = 0x00,
C_WEIGHT = 0x01,
} FREQ_WEIGHT_TypeDef;
typedef enum
{
FAST_RESP = 0x00,
SLOW_RESP = 0x01,
} FREQ_RESP_TypeDef;
typedef enum
{
MAIN_STATE = 0x00,
SET_STATE = 0x01,
} SYS_STATE_TypeDef;
typedef enum
{
SET_ALM = 0x00 ,
SET_ALM_TIME ,
SET_ALM_Type ,
SET_YEAR ,
SET_MONTH ,
SET_DAY ,
SET_HOUR ,
SET_MINUTE ,
SET_SECOND ,
SET_ALM_CLOCK_HOUR ,
SET_ALM_CLOCK_MINUTE ,
SET_ALM_CLOCK_EN ,
} SET_STATE_TypeDef;
typedef enum
{
NO_OUT_RANGE = 0x00,
OVER_RANGE = 0x01,
UNDER_RANGE = 0x02,
} OUT_RANGE_TypeDef;
typedef struct
{
u8 KeyAge : 8;
u8 KeyPress : 4;
u8 KeyProcessed : 4;
GPIO_Module *KeyPort;
uint16_t KeyPin;
void (*fun) (PRESS_MODE_TypeDef);
} SysKey;
typedef struct
{
u8 First_Press;
u8 Mea_OK;
u8 EEPROM_ERR;
u8 SPIFlashErr;
u8 Cal_Finish;
// u8 Cal_DB_Finish;
u8 Cal_En;
u8 DispSetEn;
u8 LCDFlick;
u8 FlickEn;
u8 RecFull;
u8 Alarms;
u8 UpOver;
u8 ClockSoundEn;
u8 GetRec;
u8 BiBiBi;
u8 Nop;
u8 GetDate;
u8 Test;
u8 PWD, PWDErr;
u8 EraseDoing;
u8 UsbCmdLen;
u8 SensorType; //温湿度传感器类型
u8 DMA_OK;
u8 shutdown;
u8 showLcd;
} FLAG_TYPE;
typedef struct
{
double ADC_VALUE[3];
double ADC_Sum_Value;
u32 ADC_INT_Value;
u16 ADC_CNT;
u16 DB_Disp;
u32 ADC_INT_Value_TAB[8];
u32 CAL_INT_Value;
u16 Disp_ALM;
//CAL
u8 ADC_TAB_CNT;
u8 Cal_Mode;
//系统状态
// CAL_POINT_TypeDef Cal_DB_Point;
FREQ_WEIGHT_TypeDef Freq_Weight;
FREQ_RESP_TypeDef Freq_Resp;
SYS_STATE_TypeDef Sys_State;
OUT_RANGE_TypeDef Mea_Range;
MEA_RANGE_TypeDef Adc_Range;
SET_STATE_TypeDef Set_State;
FunctionalState ALM_EN;
u8 SaveCnt_2s;
u16 Wait;
u8 DispDB_Cnt;
u8 CalEn;
s16 SET_Value;
u16 Save_2s_Data[14];
u32 Start_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1
u32 End_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1
u8 Cal_Step;
u8 Save_Cnt;
u8 FlashNum;
u8 WaitReleaseKey;
u32 OverCntt[3];
u8 Alm_Time;
u8 Alm_Type;
u16 Alm;
u16 MaxDB_Save;
u8 SaveTime2s;
u8 DMA_Group;
u8 BattCnt;
u16 BattBuff[64];
u32 Batt;
u8 Units; // 0: 摄氏度, 1: 华氏度
} DATA_TYPE;
typedef struct
{
unsigned char year ;
unsigned char month ;
unsigned char day ;
unsigned char hour ;
unsigned char minute ;
unsigned char second ;
} DATE_TIME;
typedef struct
{
unsigned char hour ;
unsigned char minute ;
unsigned char second ;
unsigned char enabled ;
} TIME_INFO;
typedef union
{
u32 Mem;
struct
{
u16 Alm_Value : 16;
u8 Alm_Switch : 4;
u8 Alm_Type : 4;
u8 Alm_Time : 8;
} Struct_Para;
} UNION_PARA;
typedef struct
{
u16 ID;
u16 ChipStart;
u32 REC_HalfPages;//从0开始 0至MAX_REC_Pages-1
int16_t Cal_Adc[3];
// int16_t Cal_DB[3];
int32_t Cal_Adc_Squ[3];
UNION_PARA AlmPara;
u8 PWRON_Erase;
u8 AlarmClockOk;//产生报警
TIME_INFO AlarmClockInfo;
} SYS_INFO;
//128
typedef struct
{
u8 Header;
u8 Machine_State;
u8 Year ;
u8 Month ;
u8 Day ;
u8 Hour ;
u8 Minute ;
u8 Second ;
u16 Result[60]; //Noise_Result: Freq_Weight + Freq_Respon + DB_Value 存储用
} STORAGE;
#endif
这个是定义的结构和变量
void UP_Key_Pro(PRESS_MODE_TypeDef Press_Mode)
{
u16 Tmp;
switch(SysData.Sys_State)
{
case MAIN_STATE:
// if(SysData.Cal_Mode) break;
// if(Press_Mode!=SHORT_PRESS)break;
//
// switch(SysData.Freq_Weight)
// {
// case A_WEIGHT:
// SysData.Freq_Weight = C_WEIGHT;
// FREQ_WEIGHT_C;
// break;
//
// case C_WEIGHT:
// SysData.Freq_Weight = A_WEIGHT;
// FREQ_WEIGHT_A;
// break;
// }
// SysData.Save_Cnt=0;
// Disp_State(DISP_FREQ_WEIGHT);
break;
case SET_STATE:
if(Press_Mode == LONG_PRESS)
{
KEy[Num_Up].KeyProcessed = 0;
Tmp = KeyOffset;
}
else
{
Tmp = 1;
}
// if(SysFlag.DispSetEn)
// {
// break;
// }
SysFlag.FlickEn = 0;
SysData.SET_Value += Tmp;
SysData.WaitReleaseKey = 0;
Check_Set();
Disp_AlarmClockSet();
SysFlag.DispSetEn = 1;
break;
}
}
void DOWN_Key_Pro(PRESS_MODE_TypeDef Press_Mode)
{
u16 Tmp;
switch(SysData.Sys_State)
{
case MAIN_STATE:
//主界面温度切换
if(Press_Mode==LONG_PRESS)
{
SysData.Units = !SysData.Units;
Tmp = KeyOffset;
}
break;
case SET_STATE:
if(Press_Mode==LONG_PRESS)
{
KEy[Num_Down].KeyProcessed=0;
Tmp = KeyOffset;
}
else
{
Tmp=1;
}
SysFlag.FlickEn=0;//长按不允许闪烁
SysData.SET_Value-=Tmp;
SysData.WaitReleaseKey=0;
Check_Set();
Disp_AlarmClockSet();
SysFlag.DispSetEn=1;
break;
}
}
这个是上下键的代码
现在的要求是,原来进入到设置页面时,第一个调整的值是噪音的报警值,第二个是报警时长,第三个是报警模式,现在要把第一个调整的值改成温湿度的报警值设置,其它不变,怎么修改