📄 我的空调程序.c
字号:
ucCloseDelaySec = 5; // 有按键,延时5秒关背光
cKEYCode = SCANKEY(); // 取有效键值
}
}
}
/******************************** 键盘扫描 *********************************/
uchar SCANKEY(void) //返回的是键值
{
uchar Result = 0;
bKey1 = 0;
if(bKey3 == 0)
{
Result += 8; // 开关
}
if(bKey4 == 0)
{
Result += 2; // +
}
bKey1 = 1;
bKey2 = 0;
if(bKey3 == 0)
{
Result += 4; // 风量
}
if(bKey4 == 0)
{
Result += 1; // -
}
bKey2 = 1;
return(Result);
}
/***************************** 按键处理 ********************************/
void DisposeKey() //按键处理
{
switch(cKEYCode) //根据键值不同,分别进行处理
{
case KEYCODE_UP://up=1
case KEYCODE_DOWN://down=02
ucDelaySec = 5; // 保持输入状态约5秒 */
if(ucSystemStatus == DIS_SYS_WAIT)
{
aucTmpValue[0] = cSetTemp;
ucFlashType = FLASH_SetTemp;
ucSystemStatus = DIS_SYS_INPUT;
}
else if(ucSystemStatus == DIS_SYS_INPUT)
{
switch(ucFlashType)
{
case FLASH_SetTemp: // 设置温度
if(cKEYCode == KEYCODE_UP)
{
if(aucTmpValue[0] < MAX_TEMP)
{
cSetTemp = ++aucTmpValue[0];
}
}
else
{
if(aucTmpValue[0] > MIN_TEMP)
{
cSetTemp = --aucTmpValue[0];
}
}
break;
case FLASH_PWM: // 设置占空比
if(cKEYCode == KEYCODE_UP)
{
if(ucPWM < 100)
{
ucPWM += 5;
}
}
else
{
if(ucPWM != 0)
{
ucPWM -= 5;
}
}
ucDelaySec = 5; // 保持输入状态约5秒 */
break;
}
}
ucDelayKey = 60;
break;
case KEYCODE_FAN: // 设置风速,案按键是设置风速的
if(bStill == 0) //
{
bStill = 1;
if(ucFanSpeed == 3)
{
ucFanSpeed = 0; // 停止送风?????
}
else
{
if(ucFanSpeed == 0)
{
ucFanSpeed = 4; // 自动风
}
else
{
if (ucFanSpeed == 4)
{
ucFanSpeed = 1; // 弱风
}
else
{
ucFanSpeed++;
}
if(ucFanSpeed == 5)
{
ucFanSpeed = 0;
}
}
}
}
break;
case KEYCODE_PWM://0c // 设置时间
if(ucSystemStatus == DIS_SYS_WAIT)
{
ucLongDelay++;
if(ucLongDelay < 3) //长按“风速”“-”组合键3秒才可设置时间
{
ucDelayKey = 240;
}
else
{
ucLongDelay=0;
ucFlashType = FLASH_PWM;
ucSystemStatus = DIS_SYS_INPUT;
}
}
ucDelaySec = 5; // 保持输入状态约5秒 */
break;
case KEYCODE_ONOFF: // 显示开关/确认键
if(bStill == 0)
{
bStill = 1;
if(ucSystemStatus == DIS_SYS_WAIT)
{
if(bPowerON == 1)
{
ucFanSpeed = 0;
ucCloseDelaySec = 0; /* 关背光 */
}
else
{
ucFanSpeed = 4;
}
ucSystemStatus = DIS_SYS_WAIT;
ucDelaySec = 0;
bPowerON = !bPowerON;
}
else //(ucSystemStatus == DIS_SYS_INPUT)
{
ucDelaySec = 5; // 保持输入状态约5秒 */
switch(ucFlashType)
{
case FLASH_SetTemp:
ucSystemStatus = DIS_SYS_WAIT;
ucFlashType = WAIT_cCurrTemp;
break;
default:
ucSystemStatus = DIS_SYS_WAIT;
ucDelaySec = 0;
break;
}
}
}
break;
default:
break;
}
cKEYCode = 0;
}
/**************************** 显示刷新 *********************************/
void ScanLED(void)
{
uchar a;
P2 = 0; // 先清显示
a=P0 & 0xe0; // 保护P0口高3位数据
P0 = a|aucLEDcs[ucScanIndex]; // 输出位选
if(bPowerON != 0)
{
P2 = ucLEDFlash[ucScanIndex]; // 输出段选数据
}
ucScanIndex++; // 位选移位
if(ucScanIndex==5)
{
ucScanIndex=0;
}
}
/************************** 设置风机转速 ****************************/
void SetFanStatus(void)
{
char cD;
cD = cCurrTemp - cSetTemp;
ucLED = 0;
if(ucFanSpeed == 4)
{ //自动风
bFAN_AUTO = 1;
if(cD >= 3 || cD <= -3)
{
ucPWM = 100; //温差>=3度,大风
}
else
{
if(cD == 2 || cD == -2)
{
ucPWM = 50; //温差=2度,中风
}
else
{
ucPWM = 25; //温差=1度,小风
}
}
}
else
{
switch(ucFanSpeed)
{
case 0:
ucPWM = 0;
break;
case 1:
ucPWM = 25;
bFAN_LOW = 1;
break;
case 2:
ucPWM = 50;
bFAN_MIN = 1;
break;
case 3:
ucPWM = 100;
bFAN_HIGH = 1;
break;
default:
break;
}
}
ucLEDFlash[4] = ucLED;
}
/**************************** 显示温度 *********************************/
void DisplayTemp(char Temp)
{
ucLEDData[0] = aucLEDNUMCODE[Temp/10];
if(ucLEDData[0] == 0x3f)
{
ucLEDData[0] = 0; // 第一位0不显示
}
if(bNeg)
{
ucLEDData[0] |= 0x40; // 显示负号
}
ucLEDData[1] = aucLEDNUMCODE[Temp%10];
ucLEDData[2] = aucLEDNUMCODE[0x0b]; //"度"
ucLEDData[3] = aucLEDNUMCODE[0x0a]; //"C"
}
/*************************** 显示时间等 ********************************/
/*************************** 显示PWM比例 ********************************/
void DisplayPWM(uchar Value)
{
ucLEDData[0] = 0x73; /* "P" */
ucLEDData[1] = 0x40; /* "-" */
if(Value == 100)
{
Value = 99;
}
ucLEDData[2] = aucLEDNUMCODE[Value/10];
ucLEDData[3] = aucLEDNUMCODE[Value%10];
}
/**************************** 处理显示 *********************************/
void UpdateDis(uchar status)
{
uchar cKey;
if(status == DIS_SYS_WAIT) // 非输入状态
{
if(ucFlashType == WAIT_cCurrTemp) // 显示温度
{
DisplayTemp(cCurrTemp); // 显示当前温度
}
}
else // 正在输入状态
{
cKey = SCANKEY();
switch(ucFlashType)
{
case FLASH_SetTemp: // 温度设置状态时
DisplayTemp(aucTmpValue[0]);
if((bFlash == 0) && (cKey == 0))
{
ucLEDData[0] = 0;
ucLEDData[1] = 0;
}
break;
case FLASH_PWM: // 占空比设置状态时
DisplayPWM(ucPWM);
if((bFlash == 0) && (cKey == 0))
{
ucLEDData[2] |= 0;
ucLEDData[3] |= 0;
}
break;
default:
break;
}
}
ucLEDFlash[0] = ucLEDData[0];
ucLEDFlash[1] = ucLEDData[1];
ucLEDFlash[2] = ucLEDData[2];
ucLEDFlash[3] = ucLEDData[3];
}
/***************************** 处理延时 ********************************/
void DisposeDelay(uchar LType)
{
switch(LType)
{
case DIS_SYS_WAIT:
if(ucFlashType==WAIT_cCurrTemp)
{
ucFlashType = WAIT_cCurrTemp;
ucDelaySec = 5; /* 显示温度约5秒 */
}
break;
case DIS_SYS_INPUT:
if(ucFlashType==FLASH_SetTemp)
{
cSetTemp = aucTmpValue[0];
ucFlashType = WAIT_cCurrTemp;
}
ucSystemStatus = DIS_SYS_WAIT; /* 自动退出输入状态 */
break;
default:
break;
}
}
/****************************** 处理当前时间 *******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -