📄 frigwndw.c
字号:
//***********************************************************//
// Frigidaire窗机控制 //
// cpu: NEC uPD789104A clock: 4MHz //
// Main, C Program V2.6 //
// by ZhangZhihua 2003.06.15 //
//***********************************************************//
//#pragma PC(9104A)
#ifdef __K0S__
#pragma sfr
#endif
#pragma asm
// CPU管脚使用分布及定义
//
// 78F9116
// __________________ __________________
// | U |
// REMOTE——— 1|P23/INTP0/CPT20/^SS20 P22/SI20/RXD20|28 ———BUTTON COM1
// BUZZER——— 2|P24/INTP1/TO80/TO20 P21/SO20/TXD20|27 ———Filter Plus
// ZERO CROSS——— 3|P25/INTP2/TI80 P20/^SCK20/ASCK20|26 ———LED COM2
// ——— 4|AVDD P11|25 ———FAN
// ROOM TEMP——— 5|P60/ANI0 P10|24 ———COMPRESSOR
// DEFROST TEMP——— 6|P61/ANI1 VDD|23 ———
// LINE VOLTAGE——— 7|P62/ANI2 VSS|22 ———
// BUTTON COM2——— 8|P63/ANI3 CL1|21 ———
// GND——— 9|AVSS CL2|20 ———
// 7-SEG COM2——— 10|P50 IC(Vpp)|19 ———
// 7-SEG COM1——— 11|P51 ~RESET|18 ———
// LED COM1——— 12|P52 P03|17 ———EEPROM SDA(DATA)
// FILTER CHECK LED——— 13|P53 P02|16 ———EEPROM SCL(CLOCK)
// 164 CLOCK——— 14|P00 P01|15 ———164 DATA
// |_____________________________________|
//
// I/O port address define
#define PIO_LEDSensor P5.3 //
#define PIO_FiltPlus P2.1 //
// constant define
#define ON 1
#define OFF 0
#define TRUE 1
#define FALSE 0
#define P0IOMODE 0b11111000 // P00~P02 -- (out), P03 -- (input)
#define P0INIT 0b11111100 //
#define P0PULLUP 0b00000000 // no pullup
#define P1IOMODE 0b11111100 // P10~P11 -- (out)
#define P1INIT 0b11111100 //
#define P2IOMODE 0b11101100 // P20~P21 -- (out), P22~P23 -- (input), P24 -- (output), P25 -- (input)
//#define P2IOMODE 0b11101110 // P20 -- (out), P21~P23 -- (input), P24 -- (output), P25 -- (input)
#define P2PULLUP 0b00101000 // P23, P25 -- (pullup)
#define P2INIT 0b00101100 //
//#define P2INIT 0b00101110 //
#define P5IOMODE 0b11110000 // P50~P53 -- (out)
#define P5INIT 0b00001111 //
#define T80MODE 0b00000010 // clock:Fx/8 -- 2.0US (Fx = 4MHz)
#define T80TM125US 63 // 125US/2.0US = 62.5 ---> 63,126US
#define T20MODE 0b00000000 // clock:Fx/4 -- 1.0US (Fx = 4MHz), no capture, no output, no convert
#define INTWDTEN 0x01 // MK0.0
#define INTP0EN 0x02 // MK0.1
#define INTP1EN 0x04 // MK0.2
#define INTP2EN 0x08 // MK0.3
#define INTSR20EN 0x10 // MK0.4
#define INTST20EN 0x20 // MK0.5
#define INTTM80EN 0x40 // MK0.6
#define INTTM20EN 0x80 // MK0.7
#define INTAD0EN 0x01 // MK1.0
// LED通道值 0 ~ 7
#define LEDSLOW 0
#define LEDFAST 1
#define LEDPWRSAV 2
#define LEDCOOL 3
#define LEDAUTO 4
#define LEDSLEEP 5
#define LEDFAN 6
#define LEDTIMER 7
#define LEDPLUS 6
#define LEDCHECK 5
// 按键通道值 0 ~ 15
#define BTNCDOWN 0
#define BTNCUP 1
#define BTNCSLOW 2
#define BTNCFAST 3
#define BTNCNODEF 4
#define BTNCMODE 5
#define BTNCAUTO 6
#define BTNCSLEEP 7
#define BTNCPLUS 8
#define BTNCTIMER 9
#define BTNCCHECK 10
#define BTNCPWR 11
#define BTNCSEL1 12
#define BTNCSEL2 13
#define BTNCSEL3 14
#define BTNCSEL4 15
// 按键值 0 ~ 15
#define BTNPWR 0x88
#define BTNSLOW 0x20
#define BTNFAST 0x80
#define BTNAUTO 0x0f0
#define BTNCHECK 0x4
#define BTNCOOL 0x90
#define BTNPWRSAV 0x40
#define BTNSLEEP 0x0
#define BTNFAN 0x0e0
#define BTNTIMER 0x60
#define BTNDOWN 0x0b0
#define BTNUP 0x70
#define BTNPLUS 0x0f1
#define BTNMODE 0x0f2
#define BTNNODEF 0x0f3
#define BTNIFON 0x0f5
#define BTNIFTP 0x0f6
#define BTNIFOFF 0x0f7
#define BTNSEL1 0x0ff
#define BTNSEL2 0x0ff
#define BTNSEL3 0x0ff
#define BTNSEL4 0x0ff
#define KEYDEPRESS 0b00100000
#define KEYPRESSED 0b01000000
#define KEYANSWER 0b10000000
// 风机速度常数
#define FANLOW 10
#define FANMID 50
#define FANHIGH 99
#define TRIGWIDE 1500 // 1500uS
#define TRIGNARROW 600 // 600uS
#define TRIGW2N 1500 // 1500uS
#define TRIGFAST 340 // 340uS
#define RATEVOL1 0x0AF // 230V/115V
#define RATEVOL2 0x09C // 230V/115V
#define RATEVOL3 0x091 // 230V/115V
#define RATEVOL4 0x085 // 230V/115V
// 设定温度限值,摄氏16 ~ 32,华氏60 ~ 90
#define CTEMPSETL 16
#define CTEMPSETH 32
#define FTEMPSETL 60
#define FTEMPSETH 90
// 化霜温度,华氏温度->摄氏
#define TEMP30F 60 // 30F = -1℃
#define TEMP55F 110 // 55F = 12.8℃
#define TEMP60F 71 // 15.6℃
#define TEMP62F5 74 // 16.9℃
#define TEMP61F5 73 // 16.4℃
#define TEMP59F 70 // 15℃
#define TEMP2F5 5 //
#define TEMP1F5 3 //
#define TEMPN1F 2 //
#define TEMP0F5 1 //
#define TEMP2F 4 //
#define TEMP4F 8 //
// 数码管特殊显示信息
#define T1ERRCODEH 0x6D // 室温传感器故障代码显示,高位 --- 5
#define T1ERRCODEL 0x3F // 室温传感器故障代码显示,低位 --- 0
#define T2ERRCODEH 0x7D // 管温传感器故障代码显示,高位 --- 6
#define T2ERRCODEL 0x80 // 管温传感器故障代码显示,低位 --- .
#define BYPASSH 0x73 // bypass模式显示,高位 --- P
#define BYPASSL 0x7C // bypass模式显示,低位 --- b
#define PWRERRH 0x79 // 电源故障显示,高位 --- E
#define PWRERRL 0x50 // 电源故障显示,低位 --- r
#define MEMERRH 0x79 // EEPROM故障显示,高位 --- E
#define MEMERRL 0x5C // EEPROM故障模式显示,低位 --- o
#define DBYPASS 0x80
#define DFANSET 0x40
#define DTEMPSET 0x20
#define DTIMESET 0x10
// 时间常数
#define MAXWAIT 0x0ff // 255*125us = 31.875ms
#define ZCROSSMIN 80 // 50Hz--100, 60Hz--120
#define BEEPTIME 30 // 300Ms/10ms
#define TIM100MS 10 // 100ms/10ms
#define TIM160MS 25//16 // 160ms/10ms
#define TIM200MS 20 // 200ms/10ms
#define TIM150MS 15 // 150ms/10ms
#define TIM330MS 33 // 330ms/10ms
#define TIM350MS 35 // 350ms/10ms
#define TIM1S 100 // 1S/10ms
#define TIM2S5 250 // 2.5S/10ms
#define TIMK1S 10 // 1S/100ms
#define TIMK2S 20 // 2S/100ms
#define TIM2S 20 // 2S/100ms
#define TIMK4S 40 // 4S/100ms
#define TIMD2S5 16 // 2.5S/xxxms
#define TIMD5S 35 // 5S/xxxms
#define TIM3S 3 // 3S/1S
#define TIM5S 5 // 5S/1S
#define TIM10S 10 // 10S/1S
#define TIM30S 30 // 30S/1S
#define TIM60S 60 // 60S/1S
#define TIM1MIN 60 // 1M/1S
#define TIM200S 200 // 200S/1S
#define TIM3MIN 18 // 3M/10S
#define TIM5MIN 30 // 5M/10S
#define TIM2MIN 12 // 2M/10S
#define TIM10MIN 60 // 10M/10S
#define TIM30MIN 180 // 30M/10S
#define TIM60MIN 360 // 60M/10S
#define TIM8H 2880 // 8H/10S
#define TIM250H 250
extern bit b_BT10MS;
extern bit b_ErrEeprom, b_SysRestore;
extern bit b_ErrT1Sensor, b_ErrT2Sensor, b_T2Open;
extern bit b_RTDataOk, b_RTSameCode, b_RTRepeat;
bit b_TestRun;
bit b_FanCycle;
bit b_FanOut;
bit b_CompOut;
bit b_CompPort;
bit b_FiltOut;
bit b_Defrost;
bit b_AutoFan;
bit b_ModeCool;
bit b_ModePwrSav;
bit b_ModeSleep;
bit b_ModeFan;
bit b_Bypass;
bit b_Runing;
bit b_IFeel;
bit b_F2C2F;
bit b_DispCgrade;
bit b_RunTimer;
bit b_TimerTemp;
bit b_TimerTempA;
bit b_KeyRepeatA;
bit b_KeyRepeatB;
bit b_NewKey;
bit b_TempSetChg;
bit b_RTKeyHold;
bit b_IsRepeatA;
bit b_IsRepeatB;
bit b_SysBack;
bit b_ErrSysData;
bit b_ErrSystem;
bit b_BTimer02S;
bit b_BTimer1S;
bit b_BTimer10S;
bit b_BTimer60S;
extern unsigned char n_ADMin;
extern unsigned char n_ADMax;
extern unsigned char n_ADData[2];
extern unsigned char n_Button[16];
extern unsigned char n_RTLast[6];
extern unsigned char n_LEDDisp[2];
extern unsigned char n_NumDisp[2];
extern unsigned char n_SysData[];
extern unsigned char n_SysBack[];
extern unsigned char n_ZCrossCnt;
extern unsigned n_TrigDelay;
extern unsigned n_TrigDurat;
unsigned char n_GenBuf;
unsigned char n_BT01SCnt;
unsigned char n_BT02SCnt;
unsigned char n_BT1SCnt;
unsigned char n_BT10SCnt;
//unsigned char n_BT60SCnt;
unsigned char n_TempSet;
unsigned char n_TempSetD;
unsigned char n_IFTemp;
unsigned char n_FanSpeed;
unsigned char n_FanSel;
unsigned char n_FanSelAdj;
unsigned char n_VolLast;
unsigned char n_TimerSet;
unsigned char n_KeyInput;
unsigned char n_RTKeyLast;
unsigned char n_DispMode;
unsigned char n_DispTime;
unsigned char n_BeepTime;
unsigned char n_LEDIFDelay;
unsigned char n_LEDIFFlash;
unsigned char n_IFeelTime;
unsigned char n_TestStep1S;
unsigned char n_TempChg3S;
unsigned char n_TempDisp2S;
unsigned char n_SysBack10S;
unsigned char n_Restore1S;
unsigned char n_Frost1S;
unsigned char n_Defrost1S;
unsigned char n_CompWaitCnt;
unsigned char n_Comp1Min;
unsigned char n_Comp3Min;
unsigned char n_Comp5Min;
unsigned char n_FanFst035S;
unsigned char n_Fan30SCnt;
unsigned char n_FanStop3S;
unsigned char n_FanCycleCnt;
unsigned char n_Fan30Min;
unsigned char n_VolAdj5S;
unsigned char n_Fan1MinCnt;
unsigned char n_KeyRepeatA;
unsigned char n_KeyRepeatB;
unsigned char n_KeyRT200MS;
unsigned char n_KeyHold2S;
unsigned char n_KeyHold4S;
unsigned char n_KeyUPWait;
unsigned char n_KeyDNWait;
unsigned char n_Timer30Min;
unsigned n_SleepTime;
unsigned n_LEDIFLight;
static const unsigned char TBL_Button[16];
static const unsigned char TBL_FanSelAdj[4][13];
static const unsigned char TBL_PwrVolAdj[4][18];
static const unsigned TBL_PwrAdjTrig[18];
static const unsigned TBL_LEDBright[36];
static const unsigned TBL_TrigD[27];
static const unsigned char TBL_Trig[27][18];
extern void BtnDisp(void);
extern void IF_LED(void);
extern void ADSample(void);
extern void TempToDisp(void);
extern void TpSetToDisp(void);
extern void SpeedToDisp(void);
extern void TimeToDisp(void);
extern void TempF2C(void);
extern void TempD2S(void);
extern void TpSetDC2F2C(void);
extern void ReadEeprom(void);
extern void WriteEeprom(void);
extern void RTSignWait(void);
void DeviceInit(void);
void DataInit(void);
void TimerProc(void);
void Display(void);
void LEDIFStart(void);
void GetIFTemp(void);
void IFTempProc(void);
void TempDisp(void);
void SysDataBack(void);
void FanOut(void);
void CompOut(void);
void FiltOut(void);
void Defrost(void);
void FanVolAdj(void);
void FanSpeed(void);
void KeyDeal(void);
void ModeDeal(void);
void IsRepeat(void);
void main()
{
__asm("\tdi");
#asm
movw hl, #0FE00H ; RAM start, SADDR RAM start #0FE20H
?LRamClr: ; RAM memory clear
xor a, a
mov [hl], a
incw hl
movw ax, hl
cmpw ax, #0FF00H ; SADDR RAM end #0FEFFH
bc $?LRamClr
movw ax, #0FEFFH
movw sp, ax
#endasm
DeviceInit();
DataInit();
__asm("\tei");
for(;;){
RUN = 1;
RTSignWait();
TimerProc();
ADSample();
IFTempProc();
KeyDeal();
ModeDeal();
Display();
BtnDisp();
IF_LED();
if(!n_VolAdj5S){
n_VolAdj5S = TIM60S;
FanVolAdj();
}
FanSpeed();
FanOut();
Defrost();
CompOut();
FiltOut();
SysDataBack();
// IF_LED();
}
}
void DeviceInit()
{
PCC = 0;
// CSS = 0;
// SCKM = 0;
// Watchdog timer
// TCL2 = 0x02; // Time Interval:2^13/Fx = 1.6384mS (Fx=5MHz)
TCL2 = 0x06; // Time Interval:2^17/Fx = 32.8mS (Fx=4MHz)
TMIF4 = 0;
WDTM = 0b00011000; // reset when overflow
// 通用端口
P0 = P0INIT;
PM0 = P0IOMODE;
P1 = P1INIT;
PM1 = P1IOMODE;
P2 = P2INIT;
PUB2 = P2PULLUP;
PM2 = P2IOMODE;
P5 = P5INIT;
PM5 = P5IOMODE;
/*
// UART通讯
PORT_REDE = 1; // receive mode
CSIM20 = 0x0;
ASIM20 = 0b00001000; // 8 bit data 1 stop bit
BRGC20 = 0x60; // 2046 Bauds
TXS20 = 0xff;
*/
// AD转换
ADM0 = 0b00000000; // STOP, Convert time:144/Fx = 34.37uS
ADS0 = 0; // select channel 0
TMC80 = T80MODE;
CR80 = T80TM125US;
TCE80 = 1;
TMC20 = T20MODE;
// INTM0 = INTM0P1F;
IF0 = 0;
IF1 = 0;
INTM0 = 0;
MK0 = ~(/*INTWDTEN+*/INTP0EN/*+INTP1EN*/+INTP2EN/*+INTSR20EN+INTST20EN*/+INTTM80EN/*+INTTM20EN*/);
MK1 = 0xFF; /*INTAD0EN*/
}
void DataInit(void)
{
n_ADMax = 0;
n_ADMin = 0xff;
ADCS0 = TRUE; // ADM0.7, start AD convert
n_Comp3Min = TIM3MIN;
n_Fan30Min = TIM30MIN;
n_Timer30Min = TIM30MIN;
n_RTKeyLast = n_KeyInput = 0x0ff;
n_VolAdj5S = TIM10S;
Display();
for(n_GenBuf=100; n_GenBuf>0; n_GenBuf--){
BtnDisp();
ADSample();
}
if(n_Button[BTNCSEL1] & KEYPRESSED) n_FanSel |= 0x01;
if(n_Button[BTNCSEL2] & KEYPRESSED) n_FanSel |= 0x02;
if(n_Button[BTNCSEL3] & KEYPRESSED) n_FanSel |= 0x04;
if(n_Button[BTNCSEL4] & KEYPRESSED) n_FanSel |= 0x08;
// b_SysRestore = 0;
ReadEeprom();
if(b_ErrEeprom) ReadEeprom();
if(b_ErrEeprom){
b_ErrSysData = 1;
n_SysData[0] =RATEVOL1;
n_SysData[1] =RATEVOL2;
n_SysData[2] =RATEVOL3;
n_SysData[3] =RATEVOL4;
n_SysData[4] =0;
// n_SysData[5] =0;
}
n_VolLast = n_SysData[0];
n_FanSelAdj = 5;
b_SysRestore = 1;
ReadEeprom();
if(b_ErrEeprom) ReadEeprom();
if(!b_ErrEeprom){
n_TempSetD = n_SysBack[0];
n_FanSpeed = n_SysBack[1];
if(n_SysBack[2] & 0x01) b_ModeFan = 1;
if(n_SysBack[2] & 0x02) b_ModeCool = 1;
if(n_SysBack[2] & 0x04){ b_ModePwrSav = 1; /*n_FanCycleCnt = TIM10MIN;*/}
if(n_SysBack[2] & 0x08) b_ModeSleep = 1;
if(n_SysBack[3] & 0x01) b_AutoFan = 1;
if(n_SysBack[3] & 0x02) b_DispCgrade = 1;
if(n_SysBack[3] & 0x04){ b_RunTimer = 1; n_TimerSet = n_SysBack[4];}
if(n_SysBack[3] & 0x08){ n_Restore1S = TIM1S+1;}//b_Runing = 1; n_BeepTime = BEEPTIME;}
if(n_SysBack[3] & 0x10) b_FiltOut = 1;
// if(n_SysBack[3] & 0x80) b_Filt30Min = 1;
// n_CheckTime = n_SysBack[5];
TempD2S();
}
else{
n_TempSet = 120;
n_TempSetD = 60;
n_FanSpeed = FANHIGH; //
b_ModeCool = 1;
b_DispCgrade = 0;
n_SysBack[3] &= ~0x80;
n_SysBack[5] = 0;
SysDataBack();
}
}
void SysDataBack()
{
if(!b_SysBack) return;
b_SysBack = 0;
n_SysBack[0] = n_TempSetD;
n_SysBack[1] = n_FanSpeed;
n_SysBack[2] = 0;
if(b_ModeFan) n_SysBack[2] |= 0x01;
if(b_ModeCool) n_SysBack[2] |= 0x02;
if(b_ModePwrSav) n_SysBack[2] |= 0x04;
if(b_ModeSleep) n_SysBack[2] |= 0x08;
n_SysBack[3] &= 0x80; // Filter 30分钟计时
if(b_AutoFan) n_SysBack[3] |= 0x01;
if(b_DispCgrade) n_SysBack[3] |= 0x02;
if(n_TimerSet) n_SysBack[3] |= 0x04;
if(b_Runing) n_SysBack[3] |= 0x08;
if(b_FiltOut) n_SysBack[3] |= 0x10;
n_SysBack[4] = n_TimerSet;
#asm
mov c, #6 ; total 8bytes
movw ax, #_n_SysBack
movw hl, ax
xor a, a
mov x, a
?LSysBk01:
add a, [hl]
bnc $?LSysBk02
inc x
?LSysBk02:
incw hl
dbnz c, $?LSysBk01
add a, #2eh
bnc $?LSysBk03
inc x
?LSysBk03:
mov [hl], a
xch a, x
mov [hl+1], a
#endasm
b_SysRestore = 1;
WriteEeprom();
// if(b_ErrEeprom) WriteEeprom();
}
void Display()
{
if(!b_Runing){
if(b_RunTimer){
n_LEDDisp[0] = (1<<LEDCOOL | 1<<LEDTIMER);
if(b_TimerTemp) TpSetToDisp();
else TimeToDisp();
}
else{
n_LEDDisp[0] = 0x0;
n_NumDisp[0] = 0x0;
n_NumDisp[1] = 0x0;
}
// PIO_LEDSensor = 1;
n_LEDIFDelay = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -