📄 functions.c
字号:
#include "TempCtrl.h"
void FunSwitch(void);
/////////////////////////////////////////////////
//按键监视及Led显示
void Monitor()
{
//////////-------------------------------------------FUN键---------------------------------------------
if((KeySta & 0x01) && (FunCnt>25))
{
///TODO:在此添加处理
if(MeterSta!=STA_MAN)
FunSwitch();//纯粹的方便看而做
///END TODO
FunCnt=0;
FunFlag=0;//kf:905
}
else if((FunFlag && (!(KeySta & 0x01))))
{
///TODO:在此添加处理
if(MeterSta!=STA_MAN)
FunSwitch();//纯粹的方便看而做
///END TODO
FunFlag=0;
}
//////-----------------------------------------------MAN键-------------------------------------
if(ManFlag && (!(KeySta & 0x08)))//Man健处理
{//单次触发
///TODO:在此添加处理
if(MeterSta!=STA_MAN)//
{//变为手动
MeterSta=STA_MAN;
LedBuf[0]=LedCode[C_Fuhao];
LedBuf[1]=LedCode[C_Fuhao];
LedBuf[2]=LedCode[C_Fuhao];
LedBuf[3]=LedCode[C_Fuhao];
MAN_ON();
AdmitFlag=1; //0
PassWordLock=1;
FFSta=0;
}
else
{//变为自动,并且锁定
MeterSta=STA_AUTO;
PassWordLock=1;
//更新显示
LedH(Temperature);
DPA();
DataTemp=Read(EP_Sv);
InputTemp=DataTemp;
InputLimit=10000;
LedL(DataTemp);//设定
DPB();
AdmitFlag=1;//允许上排数据更新
MAN_OFF();
}
///END TODO
ManFlag=0;
}
/////=============================================上下键控制=================================
if((KeySta & 0x06)==0x06)
{//依赖密码来决定那种校正
if(InputCnt<10)
InputCnt+=1;
else
{//触发一次校准s
k1=Read(EP_Sr);
if(k1==3000)
FFSta=3000;//借用FFSta
else if(k1==3001)
FFSta=3001;
}
}
else if(KeySta & 0x02)//向上健优先
{
if(MeterSta==STA_MAN)
{
Output=100;
}
else if(UpCnt>InputSpeed)//8
{
///TODO:
if(InputCnt<5)
{
InputCnt+=1;
InputSpeed=10;
InputTemp+=1;
}
else if(InputCnt<25)
{
InputCnt+=1;
InputSpeed=2;
InputTemp+=1;
}
else if(InputCnt<80)
{
InputCnt+=1;
InputSpeed=1;
InputTemp+=11;
}
else
{
// InputCnt+=1;
InputSpeed=1;
InputTemp+=111;
}
while(InputTemp>=InputLimit)
InputTemp-=InputLimit;
if(MeterSta!=STA_AUTO)
ShowInputTemp();
else if((MeterSta==STA_AUTO)&&(InputTemp!=DataTemp))
{////自动时可以调整设定值
Setted_Temperature=InputTemp;
PassWordLock=0;
Write(EP_Sv,InputTemp);
PassWordLock=1;
LedL(Setted_Temperature);
DPB();
DataTemp=InputTemp;
}
///END TODO
UpCnt=0;
}
}
else if(KeySta & 0x04)
{
if(MeterSta==STA_MAN)
{
Output=-100;
}
else if(DownCnt>InputSpeed)
{
///TODO
if(InputCnt<5)
{
InputCnt+=1;
InputSpeed=10;
InputTemp-=1;
}
else if(InputCnt<25)
{
InputCnt+=1;
InputSpeed=5;
InputTemp-=1;
}
else if(InputCnt<80)
{
InputCnt+=1;
InputSpeed=1;
InputTemp-=11;
}
else
{
// InputCnt+=1;
InputSpeed=1;
InputTemp-=111;
}
while(InputTemp<0)
InputTemp+=InputLimit;
//InputTemp=0;
if(MeterSta!=STA_AUTO)
ShowInputTemp();
else if((MeterSta==STA_AUTO)&&(InputTemp!=DataTemp))
{////自动时可以调整设定值
Setted_Temperature=InputTemp;
PassWordLock=0;
Write(EP_Sv,InputTemp);
PassWordLock=1;
LedL(Setted_Temperature);
DPB();
DataTemp=InputTemp;
}
///END TODO
DownCnt=0;
}
}
else
{
if(MeterSta==STA_MAN)
{
Output=0;
}
InputCnt=0;
InputSpeed=10;
}
}
////////////////////////////////////////////////////////////
//公用子函数
void Wait(unsigned char x)
{
while(x>0)
{
_nop_();
x-=1;
}
}
//Led显示
void LedH(unsigned int dat)
{
char i=0;
while(dat>=10000)
dat-=10000;
while(dat>=1000)
{
dat-=1000;
i+=1;
}
LedBuf[0]=LedCode[i];
i=0;
while(dat>=100)
{
dat-=100;
i+=1;
}
LedBuf[1]=LedCode[i];
i=0;
while(dat>=10)
{
dat-=10;
i+=1;
}
LedBuf[2]=LedCode[i];
LedBuf[3]=LedCode[dat];
}
void LedL(unsigned int dat)
{
char i=0;
while(dat>=10000)
dat-=10000;
while(dat>=1000)
{
dat-=1000;
i+=1;
}
LedBuf[4]=LedCode[i];
i=0;
while(dat>=100)
{
dat-=100;
i+=1;
}
LedBuf[5]=LedCode[i];
i=0;
while(dat>=10)
{
dat-=10;
i+=1;
}
LedBuf[6]=LedCode[i];
LedBuf[7]=LedCode[dat];
}
void Led(unsigned int dat)//调试使用
{
char i=0;
while(dat>=10000)
{
dat-=10000;
i++;
}
LedH(i);
//dat%=10000;
LedL(dat);
}
void ShowInputTemp()
{
if(AdmitFlag==1)
return;
if((MeterSta!=STA_Sr)&&(PassWordLock==1))
return;
LedH(InputTemp);
switch(MeterSta)//加个小数点
{
//case STA_Sr://1
case STA_AUTO:
case STA_Sv:// 2
case STA_SH:// 3
case STA_SL:// 4
//case STA_oH:// 5
//case STA_oL:// 6
//case STA_P:// 7
//case STA_I:// 8
//case STA_d:// 9
//case STA_db:// 10
//case STA_Fd:// 11//Fun只在上述循环
DPA();
break;
case STA_oL://
case STA_P:// 7
case STA_I:// 8
case STA_d:// 9
LedBuf[1]+=128;
break;
default:
;
}
}
void FunSwitch()
{
MeterSta++;
if(MeterSta>=13)//不包含13
{
MeterSta=0;
MAN_OFF();
}
AdmitFlag=0;
switch(MeterSta)
{//此处仅存储和显示即可,更新InputTemp,DataTemp
case 0://STA_AUTO
//存储
if(DataTemp!=InputTemp)
{//功能键处理=========
k0=Read(EP_Fd);
switch(k0)
{
case 0:
if(InputTemp!=0)
switch(InputTemp)
{//单次功能实现
case 5555:
Write( EP_FT, 0xffff);
break;
case 1000:
case 2000:
case 2001:
FFSta=InputTemp;
break;
}
break;
case 1://升温下线
if(InputTemp>LineB)
{
Write(EP_FF1,InputTemp);
LineA=InputTemp;
}
break;
case 2://
if((InputTemp<LineA)&&(InputTemp>LineC))
{
Write(EP_FF2,InputTemp);
LineB=InputTemp;
}
break;
case 3://
if((InputTemp<LineB)&&(InputTemp>0))
{
Write(EP_FF3,InputTemp);
LineC=InputTemp;
}
break;
case 4://
if(InputTemp>LineC)
{
Write(EP_FF4,InputTemp);
LineD=InputTemp;
}
break;
default:
break;
}
}
//更新
LedH(Temperature);
DPA();
DataTemp=Read(EP_Sv);
InputTemp=DataTemp;
InputLimit=5001; //400.0 degree is upper limit
LedL(DataTemp);
DPB();
if(AdmitFlag==0)
AdmitFlag=1;//允许上排数据更新
break;
case 1://Sr 密码
//存储:不需
//更新
LedBuf[4]=LedCode[C_S];
LedBuf[5]=LedCode[C_r];
MieDown();
//更新
DataTemp=Read(EP_Sr);
LedH(DataTemp);
InputTemp=DataTemp;
InputLimit=10000;
break;
case 2://Sv 设定值
//存储
if(InputTemp!=DataTemp)
{//
PassWordLock=0;
Write(EP_Sr,InputTemp);
}
if(InputTemp==2000)
PassWordLock=0;//开锁
else
PassWordLock=1;
//更新
LedBuf[4]=LedCode[C_S];
LedBuf[5]=LedCode[C_v];
MieDown();
DataTemp=Read(EP_Sv);
InputTemp=DataTemp;
InputLimit=5001;///most 400.0 degree
LedH(DataTemp);
DPA();
break;
case 3://SH 上限
if(DataTemp!=InputTemp)
{
Setted_Temperature=InputTemp;
Write(EP_Sv,InputTemp);
}
//更新
LedBuf[4]=LedCode[C_S];
LedBuf[5]=LedCode[C_H];
MieDown();
DataTemp=Read(EP_SH);
InputTemp=DataTemp;
InputLimit=5001;//
LedH(DataTemp);
DPA();
break;
case 4://SL 下限
if(DataTemp!=InputTemp)
{
Write(EP_SH,InputTemp);
UpperLimit=Read(EP_SH);
}
//更新
LedBuf[4]=LedCode[C_S];
LedBuf[5]=LedCode[C_L];
MieDown();
DataTemp=Read(EP_SL);
InputTemp=DataTemp;
InputLimit=5001;//99%
LedH(DataTemp);
DPA();
break;
case 5://oH 开度上
if(DataTemp!=InputTemp)
{
Write(EP_SL,InputTemp);
LowerLimit=Read(EP_SL);
}
//更新
LedBuf[4]=LedCode[C_o];
LedBuf[5]=LedCode[C_H];
MieDown();
DataTemp=Read(EP_oH);
InputTemp=DataTemp;
InputLimit=101;//最大值加1
LedH(DataTemp);
break;
case 6://oL 开度下
if(DataTemp!=InputTemp)
{
Write(EP_oH,InputTemp);
//更新PID系数
UpdatePid();
}
//更新
LedBuf[4]=LedCode[C_o];
LedBuf[5]=LedCode[C_L];
MieDown();
DataTemp=Read(EP_oL);
InputTemp=DataTemp;
InputLimit=100;//99
LedH(DataTemp);
LedBuf[1]+=128;
break;
case 7://P
if(DataTemp!=InputTemp)
{
Write(EP_oL,InputTemp);
//更新输出下限
MinOutputLimit=MinOutputLimit;
}
//更新
LedBuf[4]=LedCode[C_P];
LedBuf[5]=LedCode[C_Mie];
MieDown();
DataTemp=Read(EP_P);
InputTemp=DataTemp;
InputLimit=10000;
LedH(DataTemp);
LedBuf[1]+=128;
break;
case 8://I
if(DataTemp!=InputTemp)
{
Write(EP_P,InputTemp);
UpdatePid();
}
//更新
LedBuf[4]=LedCode[C_I];
LedBuf[5]=LedCode[C_Mie];
MieDown();
DataTemp=Read(EP_I);
InputTemp=DataTemp;
InputLimit=10000;
LedH(DataTemp);
LedBuf[1]+=128;
break;
case 9://d
if(DataTemp!=InputTemp)
{
if(InputTemp!=0)
Write(EP_I,InputTemp);
UpdatePid();
}
//更新
LedBuf[4]=LedCode[C_d];
LedBuf[5]=LedCode[C_Mie];
MieDown();
DataTemp=Read(EP_d);
InputTemp=DataTemp;
InputLimit=10000;
LedH(DataTemp);
LedBuf[1]+=128;
break;
case 10://db 闸位死区
if(DataTemp!=InputTemp)
{
Write(EP_d,InputTemp);
UpdatePid();
}
//更新
LedBuf[4]=LedCode[C_d];
LedBuf[5]=LedCode[C_b];
MieDown();
DataTemp=Read(EP_db);
InputTemp=DataTemp;
InputLimit=100;//99
LedH(DataTemp);
break;
case 11://Fd
if(DataTemp!=InputTemp)
{
Write(EP_db,InputTemp);
DeathZone=InputTemp;
}
//更新
LedBuf[4]=LedCode[C_F];
LedBuf[5]=LedCode[C_d];
MieDown();
DataTemp=0;//Read(EP_Fd);
InputTemp=DataTemp;
InputLimit=100;//0~99
LedH(DataTemp);
break;
case 12://FF 功能键
Write(EP_Fd,InputTemp);
//更新
LedL(InputTemp);
LedBuf[4]=LedCode[C_F];
LedBuf[5]=LedCode[C_F];
//MieDown();
switch(InputTemp)
{
case 0:
InputLimit=10000;
break;
case 1://升温下线
DataTemp=Read(EP_FF1);
// InputTemp=DataTemp;
InputLimit=10000;//9999
break;
case 2://Pid区
DataTemp=Read(EP_FF2);
InputLimit=10000;//9999
break;
case 3://降温上线
DataTemp=Read(EP_FF3);
// InputTemp=DataTemp;
InputLimit=10000;//9999
break;
case 4://
DataTemp=Read(EP_FF4);
//InputTemp=DataTemp;
InputLimit=10000;//9999
default:
;
}
LedH(DataTemp);
InputTemp=DataTemp;
break;
default:
MeterSta=0;
}
}
void UpdatePid()
{
k0=Read(EP_P);
fK1=k0/100.0;//Kp
k0=Read(EP_I);
fK2=k0/100.0;//Ki
k0=Read(EP_d);
fK3=k0/100.0;//Kd
}
void UpdateFrZero()
{
k0=Read(EP_FrMin);
if(k0 & 0x8000)
{
k0=k0 & 0x7fff;
FrZero=-k0;
}
else
FrZero=k0;
k0=Read(EP_FrMax);
if(k0 & 0x8000)
{
k0=k0 & 0x7fff;
FrZero=FrZero-k0;
}
else
FrZero=FrZero+k0;
FrZero=FrZero/2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -