📄 aircontroler.c
字号:
} while(--i);
} while(--cnt);
}
void Delay_us(uint n)
{
uchar t;
t = (uchar)(n/(12/11.0592))|1;
while(--t != 0);
}
/********************* Driver_LED.c**********************/
void INITBuf(uchar LData)
{
uchar i;
for(i=0;i<5;i++)
{
OldDisBuf[i]=LData;
}
}
void SelectLED(uchar Index)
{
P2=0xFF;
if(CloseDelayTimer)LED_light=0;
switch(Index)
{
case 0: LED_0=0;break;
case 1: LED_1=0;break;
case 2: LED_2=0;break;
case 3: LED_3=0;break;
case 4: LED_4=0;break;
}
}
void ScanLED()
{
LEDDATAPORT=0xff;
SelectLED(ScanIndex);
/* switch(CurrLight)
{
case 0:PWM[0]=0;break;
case 1:if(TL2<40)PWM[1]=0xff;else PWM[1]=0;break;
case 2:if(TL2<80)PWM[2]=0xff;else PWM[2]=0;break;
case 3:if(TL2<120)PWM[3]=0xff;else PWM[3]=0;break;
case 4:if(TL2<160)PWM[4]=0xff;else PWM[4]=0;break;
case 5:if(TL2<200)PWM[5]=0xff;else PWM[5]=0;break;
case 6:if(TL2<240)PWM[6]=0xff;else PWM[6]=0;break;
}
LEDDATAPORT=(~LEDData[ScanIndex]) | PWM[CurrLight];
*/
if(CloseDisStatus==SYS_ERROR || LED_ON==1)LEDDATAPORT=~LEDData[ScanIndex];
else LEDDATAPORT=0xff;
ScanIndex++;
if(ScanIndex==5) ScanIndex=0;
}
void MoveBufToLEDBuf()
{
uchar i;
switch(SystemStatus)
{
case DIS_SYS_WAIT:
if(FlashType==WAIT_TIME)
{
for(i=0;i<4;i++)
{
if(FlashStatus==SYS_ERROR)
LEDData[i]=OldDisBuf[i] | 0x80;
else LEDData[i]=OldDisBuf[i] & 0x7f;
}
}
if(FlashType==WAIT_CURRTEMP)
{
for(i=0;i<4;i++)
{
// if(FlashStatus==SYS_ERROR)
LEDData[i]=OldDisBuf[i] & 0x7f;
}
}
LEDData[4]=LED;
break;
case DIS_SYS_INPUT:
for(i=0;i<4;i++)
{
if((FlashType&(0x80>>i)))
{
if(FlashStatus==SYS_OK)LEDData[i]=0; /* 设置位闪烁 */
else if(FlashType==FLASH_CLOCK_HOUR ||FlashType==FLASH_CLOCK_MIN ||
FlashType==FLASH_TIME_HOUR ||FlashType==FLASH_TIME_MIN)
LEDData[i]=OldDisBuf[i] | 0x80;
else LEDData[i]=OldDisBuf[i];
}
else if(FlashStatus==SYS_OK)LEDData[i]=OldDisBuf[i] & 0x7f;
else if(FlashType==FLASH_CLOCK_HOUR ||FlashType==FLASH_CLOCK_MIN ||
FlashType==FLASH_TIME_HOUR ||FlashType==FLASH_TIME_MIN)
LEDData[i]=OldDisBuf[i] | 0x80;
else LEDData[i]=OldDisBuf[i];
}
if(FlashStatus==SYS_OK)
LEDData[4]=LED & 0xfe;
else if(CLOCKLED==1)
LEDData[4]=LED | 0x01;
break;
}
}
void SetFanStatus()
{
LED &= 0xe1;
switch(FanSpeed)
{
case 1: FAN_LOW=1;break;
case 2: FAN_MIN=1;break;
case 3: FAN_HIGH=1;break;
case 4: FAN_AUTO=1;break;
default:break;
}
LEDData[4] = LED;
}
void DisposeCurrTime()
{
if(CurrSec<60) return;
CurrSec=0;
if(CurrTime[1]==59)
{
CurrTime[1]=0;
if(CurrTime[0]==23) CurrTime[0]=0;
else CurrTime[0]++;
}
else CurrTime[1]++;
SystemOldStatus=DIS_VOID;
}
//0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,度,H,o,L,t
//const uchar code LEDNUMCODE[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x77,0x7C,0x39,0x5e,0x79,0x71,0x63,0x76,0x5c,0x38,0x78};
void DisplayTemp(char Temp)
{
NN=SYS_ERROR;
if(Temp<0){Temp=-Temp; NN=SYS_OK;}
OldDisBuf[0]=LEDNUMCODE[Temp/10];
if(OldDisBuf[0]==0x3f)OldDisBuf[0]=0;
if(NN==SYS_OK)OldDisBuf[0] |=0x40; /* 显示负号 */
OldDisBuf[1]=LEDNUMCODE[Temp%10];
OldDisBuf[2]=LEDNUMCODE[0x10]; //"度"
OldDisBuf[3]=LEDNUMCODE[0x0C]; //"C"
}
void DisplayValue(uchar * Value)
{
OldDisBuf[0]=LEDNUMCODE[Value[0]/10];
OldDisBuf[1]=LEDNUMCODE[Value[0]%10];
OldDisBuf[2]=LEDNUMCODE[Value[1]/10];
OldDisBuf[3]=LEDNUMCODE[Value[1]%10];
}
void DisplayFloorNo(uchar FloorNo)
{
OldDisBuf[0]=LEDNUMCODE[0x0F];
OldDisBuf[1]=LEDNUMCODE[FloorNo / 100];
OldDisBuf[2]=LEDNUMCODE[(FloorNo % 100) / 10];
OldDisBuf[3]=LEDNUMCODE[FloorNo % 10];
}
void DisplayRoomNo(uchar RoomNo)
{
OldDisBuf[0]=LEDNUMCODE[0xA];
OldDisBuf[1]=LEDNUMCODE[RoomNo / 100];
OldDisBuf[2]=LEDNUMCODE[(RoomNo % 100) / 10];
OldDisBuf[3]=LEDNUMCODE[RoomNo % 10];
}
void DisplayMode(uchar True)
{
if(True)
{
OldDisBuf[0]=LEDNUMCODE[0x11]; /* H */
OldDisBuf[1]=LEDNUMCODE[0x12]; /* o */
OldDisBuf[2]=LEDNUMCODE[0x14]; /* t */
OldDisBuf[3]=0;
}
else
{
OldDisBuf[0]=LEDNUMCODE[0xC]; /* C */
OldDisBuf[1]=LEDNUMCODE[0x12]; /* o */
OldDisBuf[2]=LEDNUMCODE[0x12]; /* o */
OldDisBuf[3]=LEDNUMCODE[0x13]; /* L */
}
}
void UpdateDis(uchar status)
{
switch(status)
{
case DIS_SYS_WAIT: //等待设置状态
if(FlashType==WAIT_CURRTEMP) //温度
{
DisplayTemp(CurrTemp); //显示当前温度
dot=0; //小数点
}
else if(FlashType==WAIT_TIME) //时间
{
DisplayValue(&CurrTime[0]); //显示时间设置值
dot=1; //小数点
}
if(ClockStatus==SYS_ERROR)CLOCKLED=0; //闹铃灯不亮
else CLOCKLED=1; //已设置闹铃,闹铃灯长亮
break;
case DIS_SYS_INPUT:
switch(FlashType)
{
case FLASH_SETMODE: //设置空调方式时
DisplayMode(TmpValue[0]);
break;
case FLASH_SETTEMP: //温度设置状态时
DisplayTemp(TmpValue[0]);
break;
case FLASH_ADD_FLOOR: //楼层设置状态
DisplayFloorNo(TmpValue[0]);
break;
case FLASH_ADD_ROOM: //房号设置状态
DisplayRoomNo(TmpValue[0]);
break;
default: DisplayValue(&TmpValue[0]);//显示时间/设置时间
break;
}
break;
case DIS_SYS_TEST: //测试LED全亮
INITBuf(0xFF);
dot=1;
break;
case DIS_SYS_CLEAR: //测试LED全灭
INITBuf(0x0);
dot=0;
break;
}
OldDisBuf[4]=LED;
}
void DisposeDelay(uchar LType)
{
switch(LType)
{
case DIS_SYS_WAIT:
if(FlashType==WAIT_CURRTEMP)
{
// FlashType=WAIT_CURRTEMP;
FlashType=WAIT_TIME;
DelayTimer=4; /* 显示时钟约4秒 */
}
else
{
FlashType=WAIT_CURRTEMP;
DelayTimer=12; /* 显示时钟约12秒 */
}
SystemOldStatus=DIS_VOID;
break;
case DIS_SYS_INPUT:
if(FlashType==FLASH_SETTEMP)
{
SetTemp=TmpValue[0];
PARA_TEMP=1;
}
FlashType=WAIT_CURRTEMP;
DelayTimer=5;
SystemStatus=DIS_SYS_WAIT;
break;
}
}
/********************* Keyboard.c**********************/
uchar SCANKEY()
{
uchar Result=0;
//sbit bKey0 = P1^7; /* 键盘扫描线1,高有效 */
//sbit bKey1 = P1^6; /* 键盘扫描线2,高有效 */
//sbit bKey3 = P1^5; /* 键盘输入线1,低有效 */
//sbit bKey4 = P1^4; /* 键盘输入线2,低有效 */
bKey1=1;
Delay_us(100);
if(bKey3==0) Result+=2; //+
if(bKey4==0) Result+=1; //-
bKey1=0;
bKey2=1;
Delay_us(100);
if(bKey3==0) Result+=8; //风量
if(bKey4==0) Result+=4; //闹铃
bKey2=0;
return(Result);
}
uchar GetKey(uchar OldStatus)
{
uchar Status;
Status=SCANKEY();
if(Status==OldStatus) return(OldStatus); //无键按下,或某键长按
Delay_MS(30); //有按键,延时30MS削颤
if(Status!=SCANKEY()) return(0xFF); //错误按键
return(Status); //正常按键
}
void DisposeKeyboard()
{
InputStatus=GetKey(OldInputStatus);
if(InputStatus==0xFF) return; //错误按键,返回
if(InputStatus==0) //没按键或已松键,返回
{
OldInputStatus=InputStatus;
return;
}
CloseDelayTimer=DELAY_CLOSEDIS; //没按键,延时5秒关背光
LED_light=0; /* 有按键,开背光 */
CloseDisStatus=SYS_ERROR; //非关显示状态
if(InputStatus==OldInputStatus) //还是刚才的按键
{
FlashStatus=SYS_ERROR;
if(KeyTimer>0) return;
if(InputStatus==KEYCODE_CLOCK || InputStatus==KEYCODE_FAN) return;//非上下键不做同键处理
}
// FlashStatus=SYS_OK;
OldInputStatus=InputStatus;
DisposeKey(InputStatus);
KeyTimer=KEYDELAYTIME;
}
/*
3-1-3-2.工作原理及软件要求:
上电初始化,所有I/O口全部输出为高。
上电结束后,通过RC4、RC1、RC5、RC3、RC2对LED 显示进行扫描。在RB口输出显示数据。
4位LED数码管采用时间和环境温度交替显示的方式进行。翻屏时间为3秒。
如果与主机的通讯没有建立,显示的时间从00:00开始。建立通讯后,显示主机提供的时间。
风量调节
每按下一次风量调节按钮,风量显示从自动、小、中、大、停进行循环,将该状态提交主机,由主机通知控制器进行相应的
风量继电器切换。同时上传PC机。如果PC机设定插卡后空调自动运行,插卡后空调的风量在自动挡位;如果PC机设定插卡后
空调不自动运行,插卡后空调的风量在停止挡位。可以通过PC机开启房间风量和调节设定温度。
温度调节和控制
按一下向上调节开关,设定温度向上调节1℃,按一下向下调节开关,设定温度向下调节1℃。按钮长按,温度快速变化。
插卡后默认该温度为25℃。该温度的调节范围为15℃~30℃。
风量在自动挡位,房间温度与设定温度相差5℃以上风量为高;相差3℃风量为中,相差1℃为低。到达比设定温度高(制热)
或低(制冷)1℃时,关闭风机和水阀。温度回升到达比设定温度低(制热)或高(制冷)1℃时,开启风机和水阀。
风量如果在其它挡位,风量不进行变化,到达比设定温度高(制热)或低(制冷)1℃时,关闭水阀。温度回升到达比设定
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -