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

📄 sleep.lst

📁 ATmega16休眠模式的应用:使用程序关闭没有使用的模块
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0076)            0x00;          //使用ad转换0通道
(0077) 		                  //ADLAR = 0,转换结果选择右对齐
(0078)    ADCSRA = //(1<<ADEN)|     //ADC使能
    0270 E18E      LDI	R24,0x1E
    0271 B986      OUT	0x06,R24
    0272 9508      RET
(0079)             //(1<<ADSC)|     //开始一次ad转换
(0080) 		    (1<<ADIF)|     //写1,将ADIF位清0
(0081) 		    (1<<ADIE)|     //允许ADC中断
(0082) 		    0x06;          //时钟分频系数为64
(0083) }
(0084) void sleep_init(void)
(0085) {
(0086)    MCUCR |= 0X40;  //使能休眠
_sleep_init:
    0273 B785      IN	R24,0x35
    0274 6480      ORI	R24,0x40
    0275 BF85      OUT	0x35,R24
    0276 9508      RET
(0087) }
(0088) //call this routine to initialize all peripherals
(0089) void init_devices(void)
(0090) {
(0091)  CLI();         //关闭全局中断
_init_devices:
    0277 94F8      BCLR	7
(0092)  port_init();   //CPU端口初始化
    0278 DF6A      RCALL	_port_init
(0093)  /** /
(0094)  MCUCR = 0x02;  //INT0引脚上的下降沿触发中断
(0095)  GICR  = 0x40;  //外部中断0请求使能
(0096)  /**/
(0097)  /**/
(0098)   MCUCR = 0x00;  //INT0引脚上的低电平触发中断
    0279 2422      CLR	R2
    027A BE25      OUT	0x35,R2
(0099)   GICR  = 0x40;  //外部中断0请求使能
    027B E480      LDI	R24,0x40
    027C BF8B      OUT	0x3B,R24
(0100)  /**/
(0101)  /** /
(0102)   MCUCR = 0x01;  //INT0引脚上的上升沿和下降沿都触发中断
(0103)   GICR  = 0x40;  //外部中断0请求使能
(0104)  /**/
(0105)  /** /
(0106)   MCUCR = 0x03;  //INT0引脚上的上升沿触发中断
(0107)   GICR  = 0x40;  //外部中断0请求使能
(0108)  /**/
(0109)  adc_init();
    027D DFF0      RCALL	_adc_init
(0110)  sleep_init();
    027E DFF4      RCALL	_sleep_init
(0111)  SEI(); //打开全局中断
    027F 9478      BSET	7
    0280 9508      RET
_main:
  temp                 --> Y+3
  temp_show            --> Y+2
  i                    --> R20
    0281 9727      SBIW	R28,7
(0112)  
(0113) }
(0114) void main(void)
(0115) {
(0116)    char temp_show[5];  //定义数组用作在液晶屏上进行显示
(0117)    unsigned char i;
(0118)    unsigned int temp;
(0119)    for(i=0;i<5;i++)
    0282 2744      CLR	R20
    0283 C009      RJMP	0x028D
(0120)    {
(0121)       temp_show[i] = 0;
    0284 01CE      MOVW	R24,R28
    0285 9602      ADIW	R24,2
    0286 2FE4      MOV	R30,R20
    0287 27FF      CLR	R31
    0288 0FE8      ADD	R30,R24
    0289 1FF9      ADC	R31,R25
    028A 2422      CLR	R2
    028B 8220      STD	Z+0,R2
    028C 9543      INC	R20
    028D 3045      CPI	R20,5
    028E F3A8      BCS	0x0284
(0122)    }
(0123)    temp_show[4] = 0xff;  //显示结束标志
    028F EF8F      LDI	R24,0xFF
    0290 838E      STD	Y+6,R24
(0124)    /**/
(0125)    init_devices();
    0291 DFE5      RCALL	_init_devices
(0126)    LCDReady();
    0292 940E012C  CALL	_LCDReady
(0127)    LcdInit();          //LCD初始化
    0294 940E014E  CALL	_LcdInit
(0128)    CharsWrite(0,1,"SYSTEM INIT");  //在LCD的第一行显示"SYSTEM INIT"
    0296 EB81      LDI	R24,0xB1
    0297 E090      LDI	R25,0
    0298 8399      STD	Y+1,R25
    0299 8388      STD	Y+0,R24
    029A E021      LDI	R18,1
    029B 2700      CLR	R16
    029C 940E0160  CALL	_CharsWrite
(0129)    CharsWrite(0,2,"......");            //在第二行显示“......”
    029E EA8A      LDI	R24,0xAA
    029F E090      LDI	R25,0
    02A0 8399      STD	Y+1,R25
    02A1 8388      STD	Y+0,R24
    02A2 E022      LDI	R18,2
    02A3 2700      CLR	R16
    02A4 940E0160  CALL	_CharsWrite
(0130)    uart_init();        //串口初始化
    02A6 940E00A8  CALL	_uart_init
(0131)    delay_ms(1000);
    02A8 EE08      LDI	R16,0xE8
    02A9 E013      LDI	R17,3
    02AA 940E01D4  CALL	_delay_ms
    02AC C089      RJMP	0x0336
(0132)    /**/
(0133)    while(1)
(0134)    {
(0135)       ClearLcd();     //清屏LCD
    02AD 940E00B1  CALL	_ClearLcd
(0136) 	  delay_us(80);   //等待清屏操作完成
    02AF E500      LDI	R16,0x50
    02B0 E010      LDI	R17,0
    02B1 940E01BB  CALL	_delay_us
(0137) 	  CharsWrite(0,1,"SLEEP IN IDLE");
    02B3 E98C      LDI	R24,0x9C
    02B4 E090      LDI	R25,0
    02B5 8399      STD	Y+1,R25
    02B6 8388      STD	Y+0,R24
    02B7 E021      LDI	R18,1
    02B8 2700      CLR	R16
    02B9 940E0160  CALL	_CharsWrite
(0138) 	  MCUCR &= 0X40;   ////将休眠模式位清0,即休眠模式1
    02BB B785      IN	R24,0x35
    02BC 7480      ANDI	R24,0x40
    02BD BF85      OUT	0x35,R24
(0139) 	  asm("sleep");   //在线嵌入汇编,CPU进入idle休眠模式
    02BE 9588      SLEEP
(0140) 	                  //等待外部中断唤醒
(0141) 	  PORTA = 0X00;    //点亮PA口LED
    02BF 2422      CLR	R2
    02C0 BA2B      OUT	0x1B,R2
(0142) 	  CharsWrite(0,2,"NOW MCU WAKEUP");
    02C1 E88D      LDI	R24,0x8D
    02C2 E090      LDI	R25,0
    02C3 8399      STD	Y+1,R25
    02C4 8388      STD	Y+0,R24
    02C5 E022      LDI	R18,2
    02C6 2700      CLR	R16
    02C7 940E0160  CALL	_CharsWrite
(0143) 	  delay_ms(5000);
    02C9 E808      LDI	R16,0x88
    02CA E113      LDI	R17,0x13
    02CB 940E01D4  CALL	_delay_ms
(0144) 	  PORTA = 0XFF;   //55秒钟后熄灭PA口LED   
    02CD EF8F      LDI	R24,0xFF
    02CE BB8B      OUT	0x1B,R24
(0145) 	  
(0146) 	                  //测试ADC噪声抑制模式
(0147) 	                    
(0148) 	  ClearLcd();     //清屏LCD
    02CF 940E00B1  CALL	_ClearLcd
(0149) 	  delay_us(80);   //等待清屏操作完成
    02D1 E500      LDI	R16,0x50
    02D2 E010      LDI	R17,0
    02D3 940E01BB  CALL	_delay_us
(0150) 	  ADCSRA |= (1<<ADEN);    //使能ADC
    02D5 9A37      SBI	0x06,7
(0151) 	  CharsWrite(0,1,"SLEEP IN ADC:");  //在LCD的第一行显示"SLEEP IN ADC"
    02D6 E78F      LDI	R24,0x7F
    02D7 E090      LDI	R25,0
    02D8 8399      STD	Y+1,R25
    02D9 8388      STD	Y+0,R24
    02DA E021      LDI	R18,1
    02DB 2700      CLR	R16
    02DC 940E0160  CALL	_CharsWrite
(0152) 	  MCUCR &= 0X40;   
    02DE B785      IN	R24,0x35
    02DF 7480      ANDI	R24,0x40
    02E0 BF85      OUT	0x35,R24
(0153) 	  MCUCR |= 0X10;  //将休眠模式位送1,即休眠模式2,ADC噪声抑制模式
    02E1 B785      IN	R24,0x35
    02E2 6180      ORI	R24,0x10
    02E3 BF85      OUT	0x35,R24
(0154) 	  asm("sleep");   //在线嵌入汇编,CPU进入ADC休眠模式
    02E4 9588      SLEEP
(0155) 	                  //在此模式下,进入休眠会自动启动一次AD转换,转换完成中断将唤醒MCU
(0156) 	  PORTA = 0X00;    //ADC转换完成唤醒MCU,点亮PA口LED
    02E5 2422      CLR	R2
    02E6 BA2B      OUT	0x1B,R2
(0157) 	  CharsWrite(0,2,"NOW MCU WAKEUP");
    02E7 E88D      LDI	R24,0x8D
    02E8 E090      LDI	R25,0
    02E9 8399      STD	Y+1,R25
    02EA 8388      STD	Y+0,R24
    02EB E022      LDI	R18,2
    02EC 2700      CLR	R16
    02ED 940E0160  CALL	_CharsWrite
(0158) 	  delay_ms(5000);   //5秒钟后显示AD转换结果 
    02EF E808      LDI	R16,0x88
    02F0 E113      LDI	R17,0x13
    02F1 940E01D4  CALL	_delay_ms
(0159) 	  data_con();                      //将ad转换值转换为电压值
    02F3 DF19      RCALL	_data_con
(0160) 	  ClearLcd();     //清屏LCD
    02F4 940E00B1  CALL	_ClearLcd
(0161) 	  delay_us(80);   //等待清屏操作完成
    02F6 E500      LDI	R16,0x50
    02F7 E010      LDI	R17,0
    02F8 940E01BB  CALL	_delay_us
(0162) 	  CharsWrite(0,1,"ADO VOLTAGE:"); 
    02FA E782      LDI	R24,0x72
    02FB E090      LDI	R25,0
    02FC 8399      STD	Y+1,R25
    02FD 8388      STD	Y+0,R24
    02FE E021      LDI	R18,1
    02FF 2700      CLR	R16
    0300 940E0160  CALL	_CharsWrite
(0163) 	  CharsWrite(0,2,adc_show);        //在LCD上显示转换电压值
    0302 EB8D      LDI	R24,0xBD
    0303 E090      LDI	R25,0
    0304 8399      STD	Y+1,R25
    0305 8388      STD	Y+0,R24
    0306 E022      LDI	R18,2
    0307 2700      CLR	R16
    0308 940E0160  CALL	_CharsWrite
(0164) 	  delay_ms(5000);
    030A E808      LDI	R16,0x88
    030B E113      LDI	R17,0x13
    030C 940E01D4  CALL	_delay_ms
(0165) 	  PORTA = 0XFF;            //关闭LED
    030E EF8F      LDI	R24,0xFF
    030F BB8B      OUT	0x1B,R24
(0166) 	  ADCSRA &=~ (1<<ADEN);    //禁止ADC,因为进入IDLE模式,如果ADC被使能,
    0310 9837      CBI	0x06,7
(0167) 	                           //也将开始一次AD转换
(0168) 	  ClearLcd();     //清屏LCD
    0311 940E00B1  CALL	_ClearLcd
(0169) 	  delay_us(80);   //等待清屏操作完成						   
    0313 E500      LDI	R16,0x50
    0314 E010      LDI	R17,0
    0315 940E01BB  CALL	_delay_us
(0170) 	  CharsWrite(0,1,"POWERDOWN MODE"); 
    0317 E683      LDI	R24,0x63
    0318 E090      LDI	R25,0
    0319 8399      STD	Y+1,R25
    031A 8388      STD	Y+0,R24
    031B E021      LDI	R18,1
    031C 2700      CLR	R16
    031D 940E0160  CALL	_CharsWrite
(0171) 	  MCUCR &= 0X40;   
    031F B785      IN	R24,0x35
    0320 7480      ANDI	R24,0x40
    0321 BF85      OUT	0x35,R24
(0172) 	  MCUCR |= 0X20;  //将休眠模式位送1,即休眠模式2,ADC噪声抑制模式
    0322 B785      IN	R24,0x35
    0323 6280      ORI	R24,0x20
    0324 BF85      OUT	0x35,R24
(0173) 	  asm("sleep");   //在线嵌入汇编,CPU进入掉电休眠模式
    0325 9588      SLEEP
(0174) 	                  //等待外部中断唤醒
(0175) 	  PORTA = 0X00;    //点亮PA口LED
    0326 2422      CLR	R2
    0327 BA2B      OUT	0x1B,R2
(0176) 	  CharsWrite(0,2,"NOW MCU WAKEUP");
    0328 E88D      LDI	R24,0x8D
    0329 E090      LDI	R25,0
    032A 8399      STD	Y+1,R25
    032B 8388      STD	Y+0,R24
    032C E022      LDI	R18,2
    032D 2700      CLR	R16
    032E 940E0160  CALL	_CharsWrite
(0177) 	  delay_ms(5000);
    0330 E808      LDI	R16,0x88
    0331 E113      LDI	R17,0x13
    0332 940E01D4  CALL	_delay_ms
(0178) 	  PORTA = 0XFF;   //1秒钟后熄灭PA口LED   
FILE: <library>
    0334 EF8F      LDI	R24,0xFF
    0335 BB8B      OUT	0x1B,R24
    0336 CF76      RJMP	0x02AD
    0337 9627      ADIW	R28,7
    0338 9508      RET
mod16u:
    0339 9468      BSET	6
    033A C001      RJMP	xdiv16u
div16u:
    033B 94E8      BCLR	6
xdiv16u:
    033C 92EA      ST	R14,-Y
    033D 92FA      ST	R15,-Y
    033E 938A      ST	R24,-Y
    033F 24EE      CLR	R14
    0340 24FF      CLR	R15
    0341 E180      LDI	R24,0x10
    0342 0F00      LSL	R16
    0343 1F11      ROL	R17
    0344 1CEE      ROL	R14
    0345 1CFF      ROL	R15
    0346 16E2      CP	R14,R18
    0347 06F3      CPC	R15,R19
    0348 F018      BCS	0x034C
    0349 1AE2      SUB	R14,R18
    034A 0AF3      SBC	R15,R19
    034B 9503      INC	R16
    034C 958A      DEC	R24
    034D F7A1      BNE	0x0342
    034E F416      BRTC	0x0351
    034F 2D0E      MOV	R16,R14
    0350 2D1F      MOV	R17,R15
    0351 9189      LD	R24,Y+
    0352 90F9      LD	R15,Y+
    0353 90E9      LD	R14,Y+
    0354 9508      RET
empy32s:
empy32u:
    0355 940E03AA  CALL	long_prolog
    0357 927F      PUSH	R7
    0358 940E03C3  CALL	tstzero1
    035A F139      BEQ	0x0382
    035B 2477      CLR	R7
    035C 940E03C9  CALL	tstzero2
    035E F419      BNE	0x0362
    035F 018C      MOVW	R16,R24
    0360 019D      MOVW	R18,R26
    0361 C020      RJMP	0x0382
    0362 9F08      MUL	R16,R24
    0363 2CB0      MOV	R11,R0
    0364 2CA1      MOV	R10,R1
    0365 9F28      MUL	R18,R24
    0366 2C90      MOV	R9,R0
    0367 2C81      MOV	R8,R1
    0368 9F18      MUL	R17,R24
    0369 0CA0      ADD	R10,R0
    036A 1C91      ADC	R9,R1
    036B 1C87      ADC	R8,R7
    036C 9F09      MUL	R16,R25
    036D 0CA0      ADD	R10,R0
    036E 1C91      ADC	R9,R1
    036F 1C87      ADC	R8,R7
    0370 9F19      MUL	R17,R25
    0371 0C90      ADD	R9,R0
    0372 1C81      ADC	R8,R1
    0373 9F0A      MUL	R16,R26
    0374 0C90      ADD	R9,R0
    0375 1C81      ADC	R8,R1
    0376 9F38      MUL	R19,R24
    0377 0C80      ADD	R8,R0
    0378 9F29      MUL	R18,R25
    0379 0C80      ADD	R8,R0
    037A 9F1A      MUL	R17,R26
    037B 0C80      ADD	R8,R0
    037C 9F0B      MUL	R16,R27
    037D 0C80      ADD	R8,R0
    037E 2D0B      MOV	R16,R11
    037F 2D1A      MOV	R17,R10
    0380 2D29      MOV	R18,R9
    0381 2D38      MOV	R19,R8
    0382 907F      POP	R7
    0383 940C03B8  JMP	long_epilog
pop_gset2:
    0385 E0E2      LDI	R30,2
    0386 940C0397  JMP	pop
pop_gset4:
    0388 E0E8      LDI	R30,0x8
    0389 940C0397  JMP	pop
push_gset5:
    038B 92FA      ST	R15,-Y
    038C 92EA      ST	R14,-Y
push_gset4:
    038D 92DA      ST	R13,-Y
    038E 92CA      ST	R12,-Y
push_gset3:
    038F 92BA      ST	R11,-Y
    0390 92AA      ST	R10,-Y
push_gset2:
    0391 937A      ST	R23,-Y
    0392 936A      ST	R22,-Y
push_gset1:
    0393 935A      ST	R21,-Y
    0394 934A      ST	R20,-Y
    0395 9508      RET
pop_gset1:
    0396 E0E1      LDI	R30,1
pop:
    0397 9149      LD	R20,Y+
    0398 9159      LD	R21,Y+
    0399 FDE0      SBRC	R30,0
    039A 9508      RET
    039B 9169      LD	R22,Y+
    039C 9179      LD	R23,Y+
    039D FDE1      SBRC	R30,1
    039E 9508      RET
    039F 90A9      LD	R10,Y+
    03A0 90B9      LD	R11,Y+
    03A1 FDE2      SBRC	R30,2
    03A2 9508      RET
    03A3 90C9      LD	R12,Y+
    03A4 90D9      LD	R13,Y+
    03A5 FDE3      SBRC	R30,3
    03A6 9508      RET
    03A7 90E9      LD	R14,Y+
    03A8 90F9      LD	R15,Y+
    03A9 9508      RET
long_prolog:
    03AA 928A      ST	R8,-Y
    03AB 929A      ST	R9,-Y
    03AC 92AA      ST	R10,-Y
    03AD 92BA      ST	R11,-Y
    03AE 93EA      ST	R30,-Y
    03AF 938A      ST	R24,-Y
    03B0 939A      ST	R25,-Y
    03B1 93AA      ST	R26,-Y
    03B2 93BA      ST	R27,-Y
    03B3 8589      LDD	R24,Y+9
    03B4 859A      LDD	R25,Y+10
    03B5 85AB      LDD	R26,Y+11
    03B6 85BC      LDD	R27,Y+12
    03B7 9508      RET
long_epilog:
    03B8 91B9      LD	R27,Y+
    03B9 91A9      LD	R26,Y+
    03BA 9199      LD	R25,Y+
    03BB 9189      LD	R24,Y+
    03BC 91E9      LD	R30,Y+
    03BD 90B9      LD	R11,Y+
    03BE 90A9      LD	R10,Y+
    03BF 9099      LD	R9,Y+
    03C0 9089      LD	R8,Y+
    03C1 9624      ADIW	R28,4
    03C2 9508      RET
tstzero1:
    03C3 27EE      CLR	R30
    03C4 2BE0      OR	R30,R16
    03C5 2BE1      OR	R30,R17
    03C6 2BE2      OR	R30,R18
    03C7 2BE3      OR	R30,R19
    03C8 9508      RET
tstzero2:
    03C9 27EE      CLR	R30
    03CA 2BE8      OR	R30,R24
    03CB 2BE9      OR	R30,R25
    03CC 2BEA      OR	R30,R26
    03CD 2BEB      OR	R30,R27
    03CE 9508      RET
lsr32:
    03CF 920F      PUSH	R0
    03D0 9009      LD	R0,Y+
    03D1 2000      TST	R0
    03D2 F031      BEQ	0x03D9
    03D3 9536      LSR	R19
    03D4 9527      ROR	R18
    03D5 9517      ROR	R17
    03D6 9507      ROR	R16
    03D7 940A      DEC	R0
    03D8 CFF8      RJMP	0x03D1
    03D9 900F      POP	R0
    03DA 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -