📄 hp.lst
字号:
0204 90400072 LDS R4,_Time+2
0206 90500073 LDS R5,_Time+3
0208 90200070 LDS R2,_Time
020A 90300071 LDS R3,_Time+1
020C EF4F LDI R20,0xFF
020D EF5F LDI R21,0xFF
020E EF6F LDI R22,0xFF
020F EF7F LDI R23,0xFF
0210 1942 SUB R20,R2
0211 0953 SBC R21,R3
0212 0964 SBC R22,R4
0213 0975 SBC R23,R5
0214 01FE MOVW R30,R28
0215 8340 STD Z+0,R20
0216 8351 STD Z+1,R21
0217 8362 STD Z+2,R22
0218 8373 STD Z+3,R23
(0463) if(i<=ATime)
0219 2E20 MOV R2,R16
021A 2433 CLR R3
021B 2444 CLR R4
021C 2455 CLR R5
021D 01FE MOVW R30,R28
021E 8060 LDD R6,Z+0
021F 8071 LDD R7,Z+1
0220 8082 LDD R8,Z+2
0221 8093 LDD R9,Z+3
0222 1426 CP R2,R6
0223 0437 CPC R3,R7
0224 0448 CPC R4,R8
0225 0459 CPC R5,R9
0226 F0F8 BCS 0x0246
(0464) {
(0465) Time.VS.TH++;
0227 91800074 LDS R24,0x74
0229 91900075 LDS R25,0x75
022B 9601 ADIW R24,1
022C 93900075 STS 0x75,R25
022E 93800074 STS 0x74,R24
(0466) Time.VS.TL=ATime-i;
0230 01FE MOVW R30,R28
0231 8020 LDD R2,Z+0
0232 8031 LDD R3,Z+1
0233 8042 LDD R4,Z+2
0234 8053 LDD R5,Z+3
0235 2E60 MOV R6,R16
0236 2477 CLR R7
0237 2488 CLR R8
0238 2499 CLR R9
0239 1862 SUB R6,R2
023A 0873 SBC R7,R3
023B 0884 SBC R8,R4
023C 0895 SBC R9,R5
023D 92700071 STS _Time+1,R7
023F 92600070 STS _Time,R6
0241 92900073 STS _Time+3,R9
0243 92800072 STS _Time+2,R8
(0467) }
0245 C018 RJMP 0x025E
(0468) else
(0469) {
(0470) Time.VS.TL+=ATime;
0246 2E20 MOV R2,R16
0247 2433 CLR R3
0248 2444 CLR R4
0249 2455 CLR R5
024A 90800072 LDS R8,_Time+2
024C 90900073 LDS R9,_Time+3
024E 90600070 LDS R6,_Time
0250 90700071 LDS R7,_Time+1
0252 0C62 ADD R6,R2
0253 1C73 ADC R7,R3
0254 1C84 ADC R8,R4
0255 1C95 ADC R9,R5
0256 92700071 STS _Time+1,R7
0258 92600070 STS _Time,R6
025A 92900073 STS _Time+3,R9
025C 92800072 STS _Time+2,R8
(0471) }
025E 9624 ADIW R28,4
025F 940E114B CALL pop_gset2
0261 9508 RET
_DecTime:
i --> Y+0
Atime --> R16
0262 940E116B CALL push_gset2
0264 9724 SBIW R28,4
(0472)
(0473) }
(0474) void DecTime(char Atime)
(0475) {
(0476) unsigned long i;
(0477) if(Time.VS.TL>8)
0265 E048 LDI R20,0x8
0266 E050 LDI R21,0
0267 E060 LDI R22,0
0268 E070 LDI R23,0
0269 90400072 LDS R4,_Time+2
026B 90500073 LDS R5,_Time+3
026D 90200070 LDS R2,_Time
026F 90300071 LDS R3,_Time+1
0271 1542 CP R20,R2
0272 0553 CPC R21,R3
0273 0564 CPC R22,R4
0274 0575 CPC R23,R5
0275 F4C8 BCC 0x028F
(0478) {
(0479) Time.VS.TL=Time.VS.TL-Atime;
0276 2E20 MOV R2,R16
0277 2433 CLR R3
0278 2444 CLR R4
0279 2455 CLR R5
027A 90800072 LDS R8,_Time+2
027C 90900073 LDS R9,_Time+3
027E 90600070 LDS R6,_Time
0280 90700071 LDS R7,_Time+1
0282 1862 SUB R6,R2
0283 0873 SBC R7,R3
0284 0884 SBC R8,R4
0285 0895 SBC R9,R5
0286 92700071 STS _Time+1,R7
0288 92600070 STS _Time,R6
028A 92900073 STS _Time+3,R9
028C 92800072 STS _Time+2,R8
(0480) }
028E C029 RJMP 0x02B8
(0481) else
(0482) {
(0483) Time.VS.TH--;
028F 91800074 LDS R24,0x74
0291 91900075 LDS R25,0x75
0293 9701 SBIW R24,1
0294 93900075 STS 0x75,R25
0296 93800074 STS 0x74,R24
(0484) Time.VS.TL=0xffffffff-Atime+Time.VS.TL;
0298 2E20 MOV R2,R16
0299 2433 CLR R3
029A 2444 CLR R4
029B 2455 CLR R5
029C EF4F LDI R20,0xFF
029D EF5F LDI R21,0xFF
029E EF6F LDI R22,0xFF
029F EF7F LDI R23,0xFF
02A0 1942 SUB R20,R2
02A1 0953 SBC R21,R3
02A2 0964 SBC R22,R4
02A3 0975 SBC R23,R5
02A4 90400072 LDS R4,_Time+2
02A6 90500073 LDS R5,_Time+3
02A8 90200070 LDS R2,_Time
02AA 90300071 LDS R3,_Time+1
02AC 0D42 ADD R20,R2
02AD 1D53 ADC R21,R3
02AE 1D64 ADC R22,R4
02AF 1D75 ADC R23,R5
02B0 93500071 STS _Time+1,R21
02B2 93400070 STS _Time,R20
02B4 93700073 STS _Time+3,R23
02B6 93600072 STS _Time+2,R22
(0485) }
02B8 9624 ADIW R28,4
02B9 940E114B CALL pop_gset2
02BB 9508 RET
(0486) }
(0487) /*********************************************
(0488) // port initialize when you open and close the machine
(0489) //port_open_machine_set 主要实现MCU收到开机指令后的端口设置
(0490) //port_close_machine_set 主要实现MCU收到关机指令后的端口设置,与上电后一致
(0491) //可以将十六进制改成二进制,表示和更改更直观
(0492) *********************************************/
(0493) void port_open_machine_set(void)
(0494) {
(0495) WDR();
_port_open_machine_set:
02BC 95A8 WDR
(0496) PORTA&= 0xfd; //pin37 pa0=0 pin37 PA0=1在定时器中delay 2s 实现
02BD B38B IN R24,0x1B
02BE 7F8D ANDI R24,0xFD
02BF BB8B OUT 0x1B,R24
(0497) // PORTA|= 0x02; //pin36 pa1=1
(0498) // PORTB|= 0x80; //pin3 pb7=1
(0499) // PORTC|= 0x80; //pin26 pc7=1
(0500) // PORTC&= 0xbf; //pin25 pc6=0
(0501) PORTD&= 0x7f; //pin16 pd7=0
02C0 B382 IN R24,0x12
02C1 778F ANDI R24,0x7F
02C2 BB82 OUT 0x12,R24
(0502) // PORTC = 0x0c;
(0503) PORTC&=~(1<<RS232_SW1); //0
02C3 98AE CBI 0x15,6
(0504) PORTC|=(1<<RS232_SW2); //1
02C4 9AAF SBI 0x15,7
(0505) // PORTD|= 0x20; //pin14 pd5=1
(0506) // PORTD&= 0xef; //pin13 pd4=0
(0507) WDR();
02C5 95A8 WDR
02C6 9508 RET
(0508) }
(0509)
(0510) void port_close_machine_set(void)
(0511) {
(0512) WDR();
_port_close_machine_set:
02C7 95A8 WDR
(0513) PORTA = 0x4c; //将PA4 SPDIF_SW 暂时定义在高阻态 PA6 HOTPLUG保持为高 pa0=0 A_MUTE为低
02C8 E48C LDI R24,0x4C
02C9 BB8B OUT 0x1B,R24
(0514) DDRA = 0xE3; //未使能 PA4 SPDIF_SW
02CA EE83 LDI R24,0xE3
02CB BB8A OUT 0x1A,R24
(0515) PORTB = 0xff; //内部上拉使能
02CC EF8F LDI R24,0xFF
02CD BB88 OUT 0x18,R24
(0516) DDRB = 0x80;
02CE E880 LDI R24,0x80
02CF BB87 OUT 0x17,R24
(0517) // PORTC = 0x4c; //m103 output only
(0518) PORTC = 0x0c;
02D0 E08C LDI R24,0xC
02D1 BB85 OUT 0x15,R24
(0519) PORTC|=(1<<RS232_SW1); //1
02D2 9AAE SBI 0x15,6
(0520) PORTC&=~(1<<RS232_SW2); //0 --串口初始化
02D3 98AF CBI 0x15,7
(0521)
(0522) // PORTC = 0x0c; //m103 output only 串口切换为00---mcu通道
(0523)
(0524) DDRC = 0xf4; //pwrbt 去掉更改为备用的实时的中断输入引脚;
02D4 EF84 LDI R24,0xF4
02D5 BB84 OUT 0x14,R24
(0525) PORTD = 0x60;
02D6 E680 LDI R24,0x60
02D7 BB82 OUT 0x12,R24
(0526) DDRD = 0xF3;
02D8 EF83 LDI R24,0xF3
02D9 BB81 OUT 0x11,R24
(0527)
(0528) WDR();
02DA 95A8 WDR
02DB 9508 RET
(0529) }
(0530)
(0531)
(0532)
(0533)
(0534)
(0535) /******************************************
(0536) //Watchdog initialize
(0537) // prescale: 1024K
(0538) ******************************************/
(0539) void watchdog_init(void)
(0540) {
(0541) WDR(); //this prevents a timout on enabling
_watchdog_init:
02DC 95A8 WDR
(0542) WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
02DD E08E LDI R24,0xE
02DE BD81 OUT 0x21,R24
02DF 9508 RET
(0543) }
(0544)
(0545)
(0546)
(0547) /*****************************************
(0548) //TIMER0 initialize - prescale:64
(0549) // WGM: Normal
(0550) // desired value: 1KHz
(0551) // actual value: 1.002KHz (0.2%)
(0552) //主要实现时序中的毫秒级的计数
(0553) //同时实现输入端口的电平检测
(0554) *****************************************/
(0555) void timer0_init(void)
(0556) {
(0557) TCCR0 = 0x00; //stop
_timer0_init:
02E0 2422 CLR R2
02E1 BE23 OUT 0x33,R2
(0558) TCNT0 = 0x8D; //set count
02E2 E88D LDI R24,0x8D
02E3 BF82 OUT 0x32,R24
(0559) OCR0 = 0x73; //set compare
02E4 E783 LDI R24,0x73
02E5 BF8C OUT 0x3C,R24
(0560) TCCR0 = 0x03; //start timer
02E6 E083 LDI R24,3
02E7 BF83 OUT 0x33,R24
02E8 9508 RET
(0561) }
(0562) void time0_cl(void)
(0563) {
(0564) if(machine_open_start==1) //开机进入第一阶段reset未开始
_time0_cl:
02E9 918000B0 LDS R24,_machine_open_start
02EB 3081 CPI R24,1
02EC F5A9 BNE 0x0322
(0565) {
(0566)
(0567) /* if(pwrbt_count>=0&&pwrbt_count<pwrbt_high_time)
(0568) {
(0569) DDRC|=0x08;
(0570) PORTC|=0x08; //pwrbt=1
(0571) }
(0572) */
(0573) if(pwrbt_count>=pwrbt_high_time&&pwrbt_count<pwrbt_low_time)
02ED 918000BC LDS R24,_pwrbt_count
02EF 308A CPI R24,0xA
02F0 F038 BCS 0x02F8
02F1 308F CPI R24,0xF
02F2 F428 BCC 0x02F8
(0574) {
(0575) // DDRC|=0x08;
(0576) // PORTC&=0xf7; //pwrbt=0
(0577) open_to_close_station=0; //强制赋值,出于稳定考虑,可以省略
02F3 2422 CLR R2
02F4 922000B1 STS _open_to_close_station,R2
(0578) close_machine_enable=0; //强制赋值,出于稳定考虑,可以省略
02F6 922000AE STS _close_machine_enable,R2
(0579) }
(0580) if(pwrbt_count>=pwrbt_low_time&&pwrbt_count<255)
02F8 918000BC LDS R24,_pwrbt_count
02FA 308F CPI R24,0xF
02FB F0B8 BCS 0x0313
02FC 3F8F CPI R24,0xFF
02FD F4A8 BCC 0x0313
(0581) {
(0582) // PORTC|=0x04; //rly_on=1
(0583) PORTC&=0xfb; //rly_on=0
02FE B385 IN R24,0x15
02FF 7F8B ANDI R24,0xFB
0300 BB85 OUT 0x15,R24
(0584) open_to_close_count=0;
0301 2422 CLR R2
0302 2433 CLR R3
0303 923000BE STS _open_to_close_count+1,R3
0305 922000BD STS _open_to_close_count,R2
(0585) vs_on_open_count=0;
0307 922000B8 STS _vs_on_open_count,R2
(0586) reset_open_count=0; //强制付值,出于稳定考虑,可以省略
0309 922000BB STS _reset_open_count,R2
(0587) machine_open_start=2; //开机进入第二阶段reset开始
030B E082 LDI R24,2
030C 938000B0 STS _machine_open_start,R24
(0588) open_to_close_station=1; //开机计时,到20s可以关机
030E E081 LDI R24,1
030F 938000B1 STS _open_to_close_station,R24
(0589) pwrbt_count=0; //防止益处,出于稳定考虑,可以省略
0311 922000BC STS _pwrbt_count,R2
(0590)
(0591) }
(0592) pwrbt_count++;
0313 918000BC LDS R24,_pwrbt_count
0315 5F8F SUBI R24,0xFF
0316 938000BC STS _pwrbt_count,R24
(0593) if(pwrbt_count>=(pwrbt_low_time+1)&&pwrbt_count<=255)
0318 3180 CPI R24,0x10
0319 F040 BCS 0x0322
031A EF8F LDI R24,0xFF
031B 902000BC LDS R2,_pwrbt_count
031D 1582 CP R24,R2
031E F018 BCS 0x0322
(0594) {
(0595) pwrbt_count=0; //防止益处,出于稳定考虑,可以省略
031F 2422 CLR R2
0320 922000BC STS _pwrbt_count,R2
(0596) }
(0597) /*
(0598) if((PINA&0x08)==0) //掉电检测
(0599) {
(0600) power_down_count++;
(0601) if(power_down_count>=20) //10ms检测
(0602) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -