📄 lyj.lst
字号:
00EB D171 RCALL _BeepN
(0214) break;
00EC C017 RJMP 0x0104
(0215) case CLAMP:
(0216) if ((PORTC&(1<<LAMP))==0)
00ED 99AA SBIC 0x15,2
00EE C005 RJMP 0x00F4
(0217) { LampOn();
00EF D152 RCALL _LampOn
(0218) BeepN(1);
00F0 E001 LDI R16,1
00F1 E010 LDI R17,0
00F2 D16A RCALL _BeepN
(0219) }
00F3 C010 RJMP 0x0104
(0220) else
(0221) { LampOff();
00F4 D14F RCALL _LampOff
(0222) BeepN(2);
00F5 E002 LDI R16,2
00F6 E010 LDI R17,0
00F7 D165 RCALL _BeepN
(0223) }
(0224) break;
00F8 C00B RJMP 0x0104
(0225) case CDIS:
(0226) if ((PORTC&(1<<DIS))==0)
00F9 99AB SBIC 0x15,3
00FA C005 RJMP 0x0100
(0227) { DisOn();
00FB D14F RCALL _DisOn
(0228) BeepN(1);
00FC E001 LDI R16,1
00FD E010 LDI R17,0
00FE D15E RCALL _BeepN
(0229) }
00FF C004 RJMP 0x0104
(0230) else
(0231) { DisOff();
0100 D14C RCALL _DisOff
(0232) BeepN(2);
0101 E002 LDI R16,2
0102 E010 LDI R17,0
0103 D159 RCALL _BeepN
(0233) }
(0234) break;
0104 D1AE RCALL pop_gset1
0105 9508 RET
(0235) }
(0236) }
(0237)
(0238) //红外解码
(0239) void CheckIR()
(0240) {uchar iNowBit,iPos;
(0241)
(0242) if ((PIND&(1<<IR))>0) iNowBit=0;else iNowBit=1;//先反相
_CheckIR:
iPos --> R16
iNowBit --> R18
0106 2422 CLR R2
0107 B380 IN R24,0x10
0108 7880 ANDI R24,0x80
0109 1628 CP R2,R24
010A F410 BCC 0x010D
010B 2722 CLR R18
010C C001 RJMP 0x010E
010D E021 LDI R18,1
(0243)
(0244) //把信号持续的处理作为公共处理
(0245) if ((iPreBit==1)&&(iNowBit==1))//hight++
010E 91800068 LDS R24,iPreBit
0110 3081 CPI R24,1
0111 F441 BNE 0x011A
0112 3021 CPI R18,1
0113 F431 BNE 0x011A
(0246) { iHight++;
0114 91800067 LDS R24,iHight
0116 5F8F SUBI R24,0xFF
0117 93800067 STS iHight,R24
(0247) return;
0119 C0BA RJMP 0x01D4
(0248) }
(0249) if ((iPreBit==0)&&(iNowBit==0))//low++
011A 90200068 LDS R2,iPreBit
011C 2022 TST R2
011D F441 BNE 0x0126
011E 2322 TST R18
011F F431 BNE 0x0126
(0250) { iLow++;
0120 91800066 LDS R24,iLow
0122 5F8F SUBI R24,0xFF
0123 93800066 STS iLow,R24
(0251) return;
0125 C0AE RJMP 0x01D4
(0252) }
(0253)
(0254) switch (iIrMode)
0126 91000065 LDS R16,iIrMode
0128 2711 CLR R17
0129 3000 CPI R16,0
012A 0701 CPC R16,R17
012B F051 BEQ 0x0136
012C 3001 CPI R16,1
012D E0E0 LDI R30,0
012E 071E CPC R17,R30
012F F179 BEQ 0x015F
0130 3002 CPI R16,2
0131 E0E0 LDI R30,0
0132 071E CPC R17,R30
0133 F409 BNE 0x0135
0134 C050 RJMP 0x0185
0135 C09B RJMP 0x01D1
(0255) {
(0256) case 0://等待9ms的高电平
(0257) if ((iPreBit==0)&&(iNowBit==1))//0->1:start
0136 90200068 LDS R2,iPreBit
0138 2022 TST R2
0139 F441 BNE 0x0142
013A 3021 CPI R18,1
013B F431 BNE 0x0142
(0258) { iPreBit=1;
013C E081 LDI R24,1
013D 93800068 STS iPreBit,R24
(0259) iHight=1;
013F 93800067 STS iHight,R24
(0260) return;
0141 C092 RJMP 0x01D4
(0261) }
(0262)
(0263) if ((iPreBit==1)&&(iNowBit==0))//1->0
0142 91800068 LDS R24,iPreBit
0144 3081 CPI R24,1
0145 F009 BEQ 0x0147
0146 C08D RJMP 0x01D4
0147 2322 TST R18
0148 F009 BEQ 0x014A
0149 C08A RJMP 0x01D4
(0264) { iPreBit=0;
014A 2422 CLR R2
014B 92200068 STS iPreBit,R2
(0265) if (iHight>85)//9.0ms
014D E585 LDI R24,0x55
014E 90200067 LDS R2,iHight
0150 1582 CP R24,R2
0151 F448 BCC 0x015B
(0266) { iIrMode=1;
0152 E081 LDI R24,1
0153 93800065 STS iIrMode,R24
(0267) iLow=1;
0155 93800066 STS iLow,R24
(0268) iHight=0;
0157 2422 CLR R2
0158 92200067 STS iHight,R2
(0269) //bCmdOk=1;iCmd=10;//Test..
(0270) }
015A C079 RJMP 0x01D4
(0271) else
(0272) {iHight=0;//reset
015B 2422 CLR R2
015C 92200067 STS iHight,R2
(0273) }
(0274) return;
015E C075 RJMP 0x01D4
(0275) }
(0276) break;
(0277)
(0278) case 1://等待4.5ms的低电平
(0279) if ((iPreBit==0)&&(iNowBit==1))//0->1
015F 90200068 LDS R2,iPreBit
0161 2022 TST R2
0162 F009 BEQ 0x0164
0163 C070 RJMP 0x01D4
0164 3021 CPI R18,1
0165 F009 BEQ 0x0167
0166 C06D RJMP 0x01D4
(0280) { iPreBit=1;
0167 E081 LDI R24,1
0168 93800068 STS iPreBit,R24
(0281) if (iLow>40)//4.5ms
016A E288 LDI R24,0x28
016B 90200066 LDS R2,iLow
016D 1582 CP R24,R2
016E F490 BCC 0x0181
(0282) { iIrMode=2;
016F E082 LDI R24,2
0170 93800065 STS iIrMode,R24
(0283) iBitCount=0;
0172 2422 CLR R2
0173 92200064 STS iBitCount,R2
(0284) iIrData[0]=0;iIrData[1]=0;iIrData[2]=0;iIrData[3]=0;
0175 92200060 STS iIrData,R2
0177 92200061 STS iIrData+1,R2
0179 92200062 STS iIrData+2,R2
017B 92200063 STS iIrData+3,R2
(0285) iHight=1;
017D E081 LDI R24,1
017E 93800067 STS iHight,R24
(0286) //bCmdOk=1;iCmd=10;//Test..
(0287) }
0180 C053 RJMP 0x01D4
(0288) else
(0289) { iIrMode=0;
0181 2422 CLR R2
0182 92200065 STS iIrMode,R2
(0290) //确实只发送一次,后面的是按键保持信号,无按键码信息
(0291) }
(0292) return;
0184 C04F RJMP 0x01D4
(0293) }
(0294)
(0295) break;
(0296)
(0297) case 2://接收用户码和按键码,共32Bit
(0298)
(0299) if ((iPreBit==1)&&(iNowBit==0))//1->0
0185 91800068 LDS R24,iPreBit
0187 3081 CPI R24,1
0188 F441 BNE 0x0191
0189 2322 TST R18
018A F431 BNE 0x0191
(0300) { iPreBit=0;
018B 2422 CLR R2
018C 92200068 STS iPreBit,R2
(0301) iLow=1;
018E E081 LDI R24,1
018F 93800066 STS iLow,R24
(0302) }
(0303) if ((iPreBit==0)&&(iNowBit==1))//0->1
0191 90200068 LDS R2,iPreBit
0193 2022 TST R2
0194 F009 BEQ 0x0196
0195 C03E RJMP 0x01D4
0196 3021 CPI R18,1
0197 F009 BEQ 0x0199
0198 C03B RJMP 0x01D4
(0304) { iPreBit=1;
0199 E081 LDI R24,1
019A 93800068 STS iPreBit,R24
(0305) //已经接收1Bit,根据占空比判断01
(0306) if (iLow>(iHight+iHight)) iNowBit=0;else iNowBit=1;
019C 90200067 LDS R2,iHight
019E 2C32 MOV R3,R2
019F 0C32 ADD R3,R2
01A0 90200066 LDS R2,iLow
01A2 1432 CP R3,R2
01A3 F410 BCC 0x01A6
01A4 2722 CLR R18
01A5 C001 RJMP 0x01A7
01A6 E021 LDI R18,1
(0307)
(0308) //Bit0在前,右移位
(0309) iPos=iBitCount/8;
01A7 91000064 LDS R16,iBitCount
01A9 9506 LSR R16
01AA 9506 LSR R16
01AB 9506 LSR R16
(0310) iIrData[iPos]=iIrData[iPos]>>1;
01AC E680 LDI R24,0x60
01AD E090 LDI R25,0
01AE 2E20 MOV R2,R16
01AF 2433 CLR R3
01B0 0E28 ADD R2,R24
01B1 1E39 ADC R3,R25
01B2 01F1 MOVW R30,R2
01B3 8040 LDD R4,Z+0
01B4 9446 LSR R4
01B5 8240 STD Z+0,R4
(0311) if (iNowBit==1) iIrData[iPos]|=0x80;
01B6 3021 CPI R18,1
01B7 F441 BNE 0x01C0
01B8 2E20 MOV R2,R16
01B9 2433 CLR R3
01BA 0E28 ADD R2,R24
01BB 1E39 ADC R3,R25
01BC 01F1 MOVW R30,R2
01BD 8180 LDD R24,Z+0
01BE 6880 ORI R24,0x80
01BF 8380 STD Z+0,R24
(0312)
(0313) iBitCount++;
01C0 91800064 LDS R24,iBitCount
01C2 5F8F SUBI R24,0xFF
01C3 93800064 STS iBitCount,R24
(0314) if (iBitCount>=32)
01C5 3280 CPI R24,0x20
01C6 F030 BCS 0x01CD
(0315) { bIrCmdOk=1;
01C7 E081 LDI R24,1
01C8 9380006B STS bIrCmdOk,R24
(0316) iIrMode=0;
01CA 2422 CLR R2
01CB 92200065 STS iIrMode,R2
(0317) //bCmdOk=1;iCmd=10;//Test..
(0318) }
(0319)
(0320) iHight=1;//must!
01CD E081 LDI R24,1
01CE 93800067 STS iHight,R24
(0321) }
(0322) break;
01D0 C003 RJMP 0x01D4
(0323) default:
(0324) iIrMode=0;
01D1 2422 CLR R2
01D2 92200065 STS iIrMode,R2
(0325) break;
01D4 9508 RET
(0326) }
(0327) }
(0328)
(0329) //对红外命令判断操作
(0330) void CheckIrCmd()
(0331) {uchar i;
(0332) bIrCmdOk=0;
_CheckIrCmd:
i --> R16
01D5 2422 CLR R2
01D6 9220006B STS bIrCmdOk,R2
(0333) if (iIrData[0]!=(~iIrData[1]))
01D8 90200061 LDS R2,iIrData+1
01DA 9420 COM R2
01DB 90300060 LDS R3,iIrData
01DD 1432 CP R3,R2
01DE F009 BEQ 0x01E0
(0334) { return;//custom码就不对
01DF C046 RJMP 0x0226
(0335) }
(0336) if (iIrData[2]!=(~iIrData[3])) return;//按键码不对
01E0 90200063 LDS R2,iIrData+3
01E2 9420 COM R2
01E3 90300062 LDS R3,iIrData+2
01E5 1432 CP R3,R2
01E6 F009 BEQ 0x01E8
01E7 C03E RJMP 0x0226
(0337)
(0338) i=iIrData[2]&0x0f;
01E8 91000062 LDS R16,iIrData+2
01EA 700F ANDI R16,0xF
(0339) //BeepN(i&0x0f);
(0340) switch (i)
01EB 2711 CLR R17
01EC 3002 CPI R16,2
01ED E0E0 LDI R30,0
01EE 071E CPC R17,R30
01EF F149 BEQ 0x0219
01F0 3002 CPI R16,2
01F1 E0E0 LDI R30,0
01F2 071E CPC R17,R30
01F3 F194 BLT 0x0226
01F4 3007 CPI R16,7
01F5 E0E0 LDI R30,0
01F6 071E CPC R17,R30
01F7 F0D1 BEQ 0x0212
01F8 300A CPI R16,0xA
01F9 E0E0 LDI R30,0
01FA 071E CPC R17,R30
01FB F049 BEQ 0x0205
01FC 300B CPI R16,0xB
01FD E0E0 LDI R30,0
01FE 071E CPC R17,R30
01FF F059 BEQ 0x020B
0200 300E CPI R16,0xE
0201 E0E0 LDI R30,0
0202 071E CPC R17,R30
0203 F0E1 BEQ 0x0220
0204 C021 RJMP 0x0226
(0341) { case IRSTOP:
(0342) bCmdOk=1;iCmd=CSTOP;
0205 E081 LDI R24,1
0206 9380006C STS bCmdOk,R24
0208 93800069 STS iCmd,R24
(0343) break;
020A C01B RJMP 0x0226
(0344) case IRUP:
(0345) bCmdOk=1;iCmd=CUP;
020B E081 LDI R24,1
020C 9380006C STS bCmdOk,R24
020E E082 LDI R24,2
020F 93800069 STS iCmd,R24
(0346) break;
0211 C014 RJMP 0x0226
(0347) case IRDOWN:
(0348) bCmdOk=1;iCmd=CDOWN;
0212 E081 LDI R24,1
0213 9380006C STS bCmdOk,R24
0215 E083 LDI R24,3
0216 93800069 STS iCmd,R24
(0349) break;
0218 C00D RJMP 0x0226
(0350) case IRLAMP:
(0351) bCmdOk=1;iCmd=CLAMP;
0219 E081 LDI R24,1
021A 9380006C STS bCmdOk,R24
021C E084 LDI R24,4
021D 93800069 STS iCmd,R24
(0352) break;
021F C006 RJMP 0x0226
(0353) case IRDIS:
(0354) bCmdOk=1;iCmd=CDIS;
0220 E081 LDI R24,1
0221 9380006C STS bCmdOk,R24
0223 E085 LDI R24,5
0224 93800069 STS iCmd,R24
(0355) break;
0226 9508 RET
(0356) }
(0357) }
(0358)
(0359) //判断限位开关
(0360) void CheckStop()
(0361) {
(0362) if (((PIND&(1<<UPX))==0) || ((PIND&(1<<DWNX))==0))
_CheckStop:
0227 9B82 SBIS 0x10,2
0228 C002 RJMP 0x022B
0229 9983 SBIC 0x10,3
022A C004 RJMP 0x022F
(0363) { MotorStop();
022B D013 RCALL _MotorStop
(0364) BeepN(2);
022C E002 LDI R16,2
022D E010 LDI R17,0
022E D02E RCALL _BeepN
(0365) }
022F 9508 RET
(0366)
(0367) }
(0368)
(0369) void TimerFunc()
(0370) {
(0371) bTimer=0;
_TimerFunc:
0230 2422 CLR R2
0231 9220006D STS bTimer,R2
(0372) CPL(PORTB,LED);
0233 E082 LDI R24,2
0234 B228 IN R2,0x18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -