| //main.c
#pragma sfr #pragma VECT RST main #pragma INTERRUPT INTWT watchtime #pragma INTERRUPT INTAD0 adconveration #pragma INTERRUPT INTTM30 time30int #pragma DI #pragma EI #pragma STOP
#pragma realregister #pragma access #pragma asm #pragma NOP #pragma rot #pragma bcd #i nclude "statusdd.inc"
/*const unsigned char adtemperature[51]={65,68,70,73,75,78,80,83,86,89,91,94,97,100,103,106,108,111,114,117,120,123,126,128,131,134,137,140,142,145,148,150,153,155,158,161,163,165,168,170,172,175,177,179,181,183,185,187,189,191,193}; */ const degree0=65; const degree45=183; /*v髛wv&~?10K*/ const hfdegree10=122; const unsigned char number[10]={0x7d,0x60,0x3e,0x7a,0x63,0x5b,0x5f,0x70,0x7f,0x7b};
extern void initial();
extern unsigned char keydowntime; extern unsigned char oldkeyno; extern unsigned char keyscantime; extern unsigned char keypressedcount; extern unsigned char i; extern bit newkeypress; extern bit keyaffirmed; extern bit keyupflag,continouskey,doublekey;
sreg unsigned int ftemperature; sreg unsigned int ctemperature;
sreg unsigned int threeseconddelay; sreg unsigned int fiveseconddelay;
sreg unsigned char fsad; sreg unsigned char csad; sreg unsigned int adresult; sreg unsigned char adcount; sreg unsigned char rememberkey; sreg unsigned char displayflag; /*if displayflag=0, display temperature of set; if displayflag=1, display temperature of surrounding; if displayflag=2, display open time set; if displayflag=3, display close time set;*/ sreg unsigned char ADconverttime; sreg unsigned char ADdisplaytime; sreg unsigned char watchtimecount; sreg unsigned char timedelay;
sreg unsigned char codecount; sreg unsigned char code[4]; sreg unsigned char codecopy[4]; /*sreg unsigned char codesentcount;*/ sreg unsigned char preCR30; sreg unsigned char displaydelaycount; sreg unsigned char j;
sreg unsigned char ADnumber; sreg unsigned char sensorcodeno;
/*sreg bit sendkeyremember;*/ /*sreg bit onlyonetime;*/
sreg bit displaychange; sreg bit light; sreg bit keypress;
sreg bit ADintervaltimer; sreg bit ADconvertfinish;
sreg bit single;
sreg bit firstcopy; sreg bit firstcode; sreg bit inadtimecount; sreg bit waitcodesend; sreg bit haschanged;
sreg bit degreeflag; sreg bit entemptest; /*if =1, test environment temperature, if=0, not test environment */ sreg bit sendcodeflag; /*if this flag=1, code send allow, else forbid*/
sreg bit codeintflag; /*=1,in code send; else, in time count*/ /*sreg bit codesentflag;*/ sreg bit codeend; sreg bit codesendfinish; sreg bit preheadhigh; sreg bit datahigh; sreg bit datalow; sreg bit headhigh; sreg bit headlow; sreg bit aparthigh; sreg bit apartlow; sreg bit tempfeeling; /*sreg bit temperaturejust;*/ sreg bit ADresultwait; /*=1;wait AD result send, =0;no AD result will be send*/ /*void keycode();*/
void keyprocess(); void displayLCD(); void twoseconddelay(); void setsingle(); /*id watchdoginterval() { WDTM=0x98; }*/ void time30int() { unsigned register char tempcode; /* RUN=1;*/ if(sendcodeflag) { if(waitcodesend) { WDTMK=0; RUN=1; P6.0=0; /*LOW level*/ /* P6.0=1; /*HIGH level*/ i=0; TMC30=0X18; codesendfinish=0; /* TMMK30=1; TMIF30=0; TMMK30=0;*/ /* WTIMK=0; WTM0=1;*/ /**light up*/ if(sendcodeflag) { /* codeintflag=1;*/ /********************/ /* P6.0=0;*/ TMC40=0X06; CR40=0X43; /*carrier wave frequency is 39 KHz*,count pulse 4Mhz*/ CRH40=0X21; TCA40=0x03; TCE40=1; TOE40=1; CR30=0XB0;/*header is 4.5ms high*/ TCE30=1; waitcodesend=0; preheadhigh=1; if(light) { P1.1=0; } else { if(keypress) { P1.1=0; keypress=0; } } return; } else { codeend=1; } } if(preheadhigh) { /* CR30=0XAF;*/ TCA40=0X01; preheadhigh=0; headhigh=1; return; } if(headhigh) { CR30=0XAF; headhigh=0; headlow=1; TCA40=0X02; if(!firstcode) { if(sensorcodeno!=0) { } else { CR30=0X57; /*header is 2.25ms low*/ } /*if(sensorcodeno==2) { sensorcodeno=0; }*/ } return; } if(headlow||datalow) { CR30=22; TCA40=0X00; headlow=0; datalow=0; datahigh=1; if(firstcode||(sensorcodeno!=0)) { if(j==8) { codecount++; if((codecount==4)) /*toshiba mode: send 32 bit*/ { codecount=0; j=0; datahigh=0; codeend=1; if(firstcode) { firstcode=0; } if(sensorcodeno==1) { sensorcodeno=2; } else { if(sensorcodeno==2) { sensorcodeno=0; ADintervaltimer=0; } } return; } j=0; } code[codecount]=rolb(code[codecount],1); tempcode=code[codecount]&0x01; if(tempcode==1)/*cy*/ { /*cy=1*/ preCR30=64; } else { /*cy=0*/ preCR30=20; } j++; return;
} else datahigh=0; { codeend=1; return; } } if(datahigh) { CR30=preCR30; TCA40=0X02; datahigh=0; datalow=1; return; } if(codeend) { sendcodeflag=0; codesendfinish=1; datahigh=0; codeend=0; codeintflag=0; if(sensorcodeno==2) { codeintflag=1; } P6.0=0; /* P6.0=1;*/ /* if(onlyonetime) { P1.1=1; onlyonetime=0; }*/ TOE40=0; TCE40=0; TCE30=0; TMMK30=1; /*light off*/ /* WTIMK=0; // WTMK=0;*/ return; } } } void watchtime() { /* RUN=1;*/ /***************/ #asm MOV A,MK0 PUSH AX #endasm if(TMMK30) { MK0=0xff; } else { MK0=0xef; } /*******************************/ EI(); watchtimecount++; /* if(fiveseconddelay<12) { fiveseconddelay++; }*/ if(inadtimecount) {
ADdisplaytime++; ADconverttime++; if(ADnumber==0) { ADconverttime--; } if(ADconverttime==120) /*1 minute*/ { switch(ADnumber) { case 12: { ADconverttime=0; ADnumber=12; break; } case 0: { /* inadtimecount=0;*/ break; } case 1: { ADconverttime=108; ADnumber=2; break; } case 2: { ADconverttime=108; ADnumber=3; break; } case 3: { ADconverttime=96; /*12S*/ ADnumber=4; break; } case 4: { ADconverttime=84; /*20 second*/ ADnumber=5; break; } case 5: { ADconverttime=72; ADnumber=6; break; } case 6: { ADconverttime=60; ADnumber=7; break; } case 7: { ADconverttime=48; ADnumber=8; break; } case 8: { ADconverttime=36; ADnumber=9; break; } case 9: { ADconverttime=24; ADnumber=10; break; } case 10: { ADconverttime=12; ADnumber=11; break; } case 11: { ADconverttime=0; ADnumber=12; break; } default: { ADconverttime=0; ADnumber=12; break; } } DI(); #asm POP ax mov MK0,A #endasm ADIF0=0; ADMK0=0; /*enable AD convert*/ #asm MOV A,MK0 PUSH AX #endasm if(TMMK30) { MK0=0xff; } else { MK0=0xef; } EI(); ADconvertfinish=0; ADintervaltimer=1; ADM0=0xa0; } else { if(ADdisplaytime>=30) { ADdisplaytime=0; DI(); #asm POP ax mov MK0,A #endasm ADIF0=0; ADMK0=0; /*enable AD convert*/ #asm MOV A,MK0 PUSH AX #endasm if(TMMK30) { MK0=0xff; } else { MK0=0xef; } EI(); ADconvertfinish=0; ADM0=0xa0; } else { adresult=0; adcount=0; } } } #asm POP ax mov MK0,A #endasm } void adconveration() { /* const unsigned char adtemperature[51]={61,63,65,68,70,73,75,78,81,83,86,89,91,94,97,100,102,105,108,111,114,117,120,122,125,128,131,134,136,139,142,144,147,150,152,155,157,160,162,165,167,169,171,173,176,178,180,182,184,186,188};*//*100kOh*/ /* RUN=1;*/ /***************/ unsigned register char i; ADMK0=1; #asm MOV A,MK0 PUSH AX #endasm if(TMMK30) { MK0=0xff; } else { MK0=0xef; } /*******************************/ EI(); /* ADM0=0X20;*/ adresult=ADCR0;
for(i=1;i<=9;i++) { waitAD: if(ADIF0) { ADIF0=0; adresult+=ADCR0; } else { goto waitAD; } } ADM0=0X20; adresult=adresult/10; if (adresult<=degree0) { adresult=degree0; } else { if (adresult>=degree45) { adresult=degree45; } } adresult=(int)(adresult*120/89); /*檸?.5嶪晭蜅幚嫀茥帹帣淸帋臇儕枑幉媍AD泿?/ if(degreeflag) { ftemperature=(int)((adresult-22)/2); /*嶪晭蜅幚嫀?/ } else { ctemperature=(int)(((adresult-86)*5+9)/18);/*晝晭蜅幚嫀?/ } ADconvertfinish=1; displaychange=1; if(ADintervaltimer&&tempfeeling) { if(!codeintflag&&(keyupflag||doublekey||(!keyupflag&&(oldkeyno==sensoron)))) { codecount=0; sendcodeflag=1; keypress=0; if(adresult<hfdegree10) { code[3]=0; } else { if(adresult>(hfdegree10+120)) { code[3]=120; } else { code[3]=adresult-hfdegree10; } } setsingle(); code[0]=0x10; code[1]=0xaf; code[2]=0xf6; sensorcodeno=1; /***************/ TMIF30=0; TMMK30=0; TMC30=0X88; CR30=0X17; /*header is 1.5ms high*/ TCE30=1; i=0; PM6=0x02; /*port6.0 output */ P6.0=0; /*LOW level*/ /* P6.0=1; /*HIGH level*/ codeintflag=1; waitcodesend=1; codeend=0; } else { if(adresult<hfdegree10) { code[3]=0; } else { if(adresult>(hfdegree10+120)) { code[3]=120; } else { code[3]=adresult-hfdegree10; } } setsingle(); codecopy[3]=code[3]; codecopy[0]=0x10; codecopy[1]=0xaf; codecopy[2]=0xf6; ADresultwait=1; if(!tempfeeling) { ADresultwait=0; } /* if(sendkeyremember) { ADresultwait=0; }*/
} } #asm POP ax mov MK0,A #endasm }
void main() { DI(); PCC=0X00; SCKM=0X00; TCL2=0x04; /*watchdog interval=8.192ms*/ WDTM=0x08; /*used as interval*/ IF0=0; MK0=0xfe; EI(); #asm movw hl,#0fe10h mov a,#0h ?LclearRAMloop: mov [hl],a xch a,l add a,#1 xch a,l bnc $?LclearRAMloop movw ax,#0feefh; movw SP,ax; #endasm initial(); pokew(0xfa00,0x0f0f); pokew(0xfa02,0x0f0f); pokew(0xfa04,0x0f0f); pokew(0xfa06,0x0f0f); LCDC0=0X02; LCDVA0=0X01; LCDM0=0x40; /*VAON0=1*/ WTMK=0; WTM=0x83; watchtimecount=2; twoseconddelay(); LIPS0=1; LCDON0=1; WTM=0X83; watchtimecount=0; twoseconddelay(); ADMK0=0; /*enable AD convert*/ ADM0=0xa0; pokew(0xfa00,0x00); pokew(0xfa02,0x00); pokew(0xfa04,0x00); pokew(0xfa06,0x00); WTM=0X83; watchtimecount=0; twoseconddelay(); displayLCD(); inadtimecount=1; keyupflag=1; /* ADconverttime=0; ADnumber=12;*/ ADdisplaytime=0; codesendfinish=1; fiveseconddelay=610; WTM=0xc3; /*watch-time fetch from fxt, and interval time's interval is 1.95ms at 4.19M crystal*/ WTIF=0; /*clear watch-time request flag*/ WTIIF=0; /*clear interval request flag*/ TMC30=0X00; TMC40=0X06; KRMK00=0; loopstart: P0=0; /* if((P4==0x0f)&&(fiveseconddelay==610)&&(codeintflag==0))*/ if((!KRMK00)&&(fiveseconddelay==610)&&(codeintflag==0)) { DI(); /* sendkeyremember=0;*/ PM0=0xf0; P0=0; PCC=0x02; KRIF00=0; /*clear key request flag*/ KRM00=1; KRMK00=0; /*enable key-interrupt*/ WTIMK=1; OSTS=0; /*wait 819us after stop broken*/ WDTMK=1; RUN=1; /* DI();*/ NOP(); STOP(); NOP(); /* RUN=0x1;*/ PCC=0x00; WDTIF=0; WDTMK=0; EI(); } keyprocess(); if(displaychange) { displayLCD(); displaychange=0; } if(!codeintflag&&(keyupflag||doublekey))/*||(!keyupflag&&(oldkeyno==sensoron))))*/ { P1.1=1; if(ADresultwait) { ADresultwait=0; codecount=0; sendcodeflag=1; keypress=0; code[0]=codecopy[0]; code[1]=codecopy[1]; code[2]=codecopy[2]; code[3]=codecopy[3]; sensorcodeno=1; /***************/ TMIF30=0; TMMK30=0; TMC30=0X88; CR30=0X17; /*header is 1.5ms high*/ TCE30=1; i=0; PM6=0x02; /*port6.0 output */ P6.0=0; /*LOW level*/ /*P6.0=1; /*HIGH level*/ codeintflag=1; waitcodesend=1; codeend=0; } } goto loopstart; } void keyprocess() { unsigned register a; /* RUN=1;*/ if(keyaffirmed==1)/*&&(keypressedcount==1))*/ { keyaffirmed=0; keypressedcount=0; keypress=1; if(newkeypress) { firstcode=1; firstcopy=1; } /*{*/ switch(oldkeyno) { /*{{*/ case MechineOperator: { newkeypress=0; continouskey=1; ADnumber=0; ADconverttime=0; ADintervaltimer=0; /* sendkeyremember=1;*/ codecount=0; sendcodeflag=1; codeintflag=1; tempfeeling=1; code[0]=0x10; code[1]=0xaf; code[2]=0x88; code[3]=0x77; break; } case TempUp: { /* sendkeyremember=0;*/ /* if(newkeypress) { newkeypress=0; continouskey=1; timedelay=0; break; } /* else { if(timedelay<2) { timedelay++; continouskey=1; break; } } temperaturejust=1;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x70; code[3]=0x8f; break; } case Powersave: { newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; /* sendkeyremember=0;*/ codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x40; code[3]=0xbf; break; } case TempDown: { /* sendkeyremember=0;*/ /* if(newkeypress) { newkeypress=0; continouskey=1; timedelay=0; break; } /* else { if(timedelay<2) { timedelay++; continouskey=1; break; } } temperaturejust=1;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0xb0; code[3]=0x4f; break; } case cool: { /* sendkeyremember=0;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x90; code[3]=0x6f; break; } case sleeprun: { /* sendkeyremember=0;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x00; code[3]=0xff; break; } case timer: { /* sendkeyremember=0;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x60; code[3]=0x9f; break; } case fanrun: { /* sendkeyremember=0;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0xe0; code[3]=0x1f; break; } case speedup: { /* sendkeyremember=0;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x80; code[3]=0x7f; break; } case speeddown: { /* sendkeyremember=0;*/ newkeypress=0; continouskey=1; codecount=0; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0x20; code[3]=0xdf; break; } /* case sensor: { if(degreeflag) { code[3]=displayroomtemperature+10; } else { code[3]=roomtemperature; } setsingle(); code[0]=0x10; code[1]=0xaf; code[2]=0xf6; break; }*/ case autofan: { /* sendkeyremember=0;*/ codecount=0; newkeypress=0; continouskey=1; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0xf0; code[3]=0x0f; break; } case clearrun: { /* sendkeyremember=0;*/ codecount=0; newkeypress=0; continouskey=1; sendcodeflag=1; codeintflag=1; code[0]=0x10; code[1]=0xaf; code[2]=0xf1; code[3]=0x0e; break; } case sensoron: { if(!entemptest) { return; break; } /* if(!newkeypress) { return; break; }*/ WTM=0XC3; inadtimecount=1; codecount=0; newkeypress=0; continouskey=1; sendcodeflag=1; codeintflag=1; ADconvertfinish=0; ADIF0=0; ADMK0=0; ADM0=0XA0; waitADresult: if(!ADconvertfinish) { goto waitADresult; } ADconvertfinish=0; sensorcodeno=0; ADnumber=1; ADconverttime=108; /*6S*/ if(adresult<hfdegree10) { code[3]=0; } else { if(adresult>(hfdegree10+120)) { code[3]=120; } else { code[3]=adresult-hfdegree10; } } setsingle(); code[0]=0x10; code[1]=0xaf; code[2]=0xf5; tempfeeling=1; /* sendkeyremember=1;*/ /* onlyonetime=1;*/ break; } case sensoroff: { if(!entemptest) { return; break; } /* if(newkeypress) {*/ codecount=0; newkeypress=0; continouskey=1; code[0]=0x10; code[1]=0xaf; code[2]=0xf7; code[3]=0x08; sendcodeflag=1; codeintflag=1; ADintervaltimer=0; ADconverttime=0; ADnumber=0; tempfeeling=0; /* inadtimecount=0;*/ /* WTM=0XC0;*/ /* sendkeyremember=1;*/ /* onlyonetime=1;*/ /* }*/ break; } case changeID: { /* sendkeyremember=0;*/ newkeypress=0; if(haschanged) { break; } haschanged=1; degreeflag=!degreeflag; displaychange=1; if(degreeflag) { ftemperature=(int)((ctemperature*18+5)/10)+32; } else { ctemperature=(int)(((ftemperature-32)*10+9)/18); } break; } } } }
void displayLCD() { unsigned char register a,b; /* RUN=1;*/ if(degreeflag) { a=ftemperature; if(a>=99) { a=99; } a=btobcde(a); } else { a=ctemperature; if(a>=37) { a=37; } a=btobcde(a); } a=rorb(a,4); a&=0x0f; a=number[a]; pokeb(0xfa03,a); a=rorb(a,4); pokeb(0xfa04,a); if(!degreeflag) { a=ctemperature; if(a>=37) { a=37; } a=btobcde(a); } else { a=ftemperature; if(a>=99) { a=99; } a=btobcde(a); } a&=0x0f; a=number[a]; pokeb(0xfa05,a); a=rorb(a,4); pokeb(0xfa06,a); } void setsingle() { char i; code[2]=code[3]; code[0]=0; for(i=0;i<7;i++) { code[1]=code[2]&0x01; if(code[1]) { code[0]++; } code[2]=rorb(code[2],1); } code[1]=code[0]&0x01; if(code[1]) { code[3]&=0x7f; } else { code[3]|=0x80; } } void twoseconddelay() { watchloop: /* RUN=1;*/ if(watchtimecount==4) { /* WTM=0x80; /*stop watchtime count*/ } else { goto watchloop; } }
|