⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hp.lst

📁 MCU控制程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -