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

📄 sleep.lst

📁 ATmega16休眠模式的应用:使用程序关闭没有使用的模块
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0146 0000      NOP
(0164)    EN_0;
    0147 9897      CBI	0x12,7
(0165)    delay125ns; 
    0148 0000      NOP
(0166)    RS_0;
    0149 9894      CBI	0x12,4
(0167)    RW_1;
    014A 9A95      SBI	0x12,5
    014B 940E0396  CALL	pop_gset1
    014D 9508      RET
(0168) }
(0169) void LcdInit(void)
(0170) {
(0171)    LCDReady();
_LcdInit:
    014E DFDD      RCALL	_LCDReady
(0172)    FunctionSet();
    014F DFA5      RCALL	_FunctionSet
(0173)    LCDReady();
    0150 DFDB      RCALL	_LCDReady
(0174)    DdramSet(0);
    0151 2700      CLR	R16
    0152 DFB6      RCALL	_DdramSet
(0175)    LCDReady();
    0153 DFD8      RCALL	_LCDReady
(0176)    VisionSet();
    0154 DF8F      RCALL	_VisionSet
(0177)    LCDReady();
    0155 DFD6      RCALL	_LCDReady
(0178)    InputSet();
    0156 DF7D      RCALL	_InputSet
(0179)    LCDReady();
    0157 DFD4      RCALL	_LCDReady
(0180)    ClearLcd();
    0158 DF58      RCALL	_ClearLcd
(0181)    LCDReady();
    0159 DFD2      RCALL	_LCDReady
(0182)    home();
    015A DF69      RCALL	_home
(0183)    delay_us(10);
    015B E00A      LDI	R16,0xA
    015C E010      LDI	R17,0
    015D 940E01BB  CALL	_delay_us
    015F 9508      RET
_CharsWrite:
  addr                 --> R22
  s                    --> R20
  addry                --> R12
  addrx                --> R10
    0160 940E038D  CALL	push_gset4
    0162 2EC2      MOV	R12,R18
    0163 2EA0      MOV	R10,R16
    0164 8548      LDD	R20,Y+8
    0165 8559      LDD	R21,Y+9
(0184) }
(0185) void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
(0186) {
(0187)    unsigned char addr;
(0188)    if (addry==1)
    0166 2D8C      MOV	R24,R12
    0167 3081      CPI	R24,1
    0168 F411      BNE	0x016B
(0189)    {
(0190)       addr = addrx;
    0169 2D6A      MOV	R22,R10
(0191)    }
    016A C007      RJMP	0x0172
(0192)    else if (addry==2)
    016B 2D8C      MOV	R24,R12
    016C 3082      CPI	R24,2
    016D F419      BNE	0x0171
(0193)    {
(0194)       addr = (addrx+0x40);
    016E 2D6A      MOV	R22,R10
    016F 5C60      SUBI	R22,0xC0
(0195)    }
    0170 C001      RJMP	0x0172
(0196)    else
(0197)    {
(0198)       addr = 0;
    0171 2766      CLR	R22
(0199)    }
(0200)    DdramSet(0);     //初始化ddram地址
    0172 2700      CLR	R16
    0173 DF95      RCALL	_DdramSet
(0201)    LCDReady();
    0174 DFB7      RCALL	_LCDReady
(0202)    DdramSet(addr);  //设定ddram地址
    0175 2F06      MOV	R16,R22
    0176 DF92      RCALL	_DdramSet
(0203)    delay_us(80);
    0177 E500      LDI	R16,0x50
    0178 E010      LDI	R17,0
    0179 940E01BB  CALL	_delay_us
    017B C009      RJMP	0x0185
(0204)    while(*s)
(0205)    {
(0206)      CharWrite(*s);
    017C 01FA      MOVW	R30,R20
    017D 8100      LDD	R16,Z+0
    017E DFBA      RCALL	_CharWrite
(0207) 	 s++;
    017F 5F4F      SUBI	R20,0xFF
    0180 4F5F      SBCI	R21,0xFF
(0208) 	 delay_us(80);   //等待写入操作完成
    0181 E500      LDI	R16,0x50
    0182 E010      LDI	R17,0
    0183 940E01BB  CALL	_delay_us
    0185 01FA      MOVW	R30,R20
    0186 8020      LDD	R2,Z+0
    0187 2022      TST	R2
    0188 F799      BNE	0x017C
    0189 940E0388  CALL	pop_gset4
    018B 9508      RET
_DataWrite:
  addr                 --> R22
  s                    --> R20
  addry                --> R12
  addrx                --> R10
    018C 940E038D  CALL	push_gset4
    018E 2EC2      MOV	R12,R18
    018F 2EA0      MOV	R10,R16
    0190 8548      LDD	R20,Y+8
    0191 8559      LDD	R21,Y+9
(0209)    }
(0210) }
(0211) void DataWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
(0212) {
(0213)    unsigned char addr;
(0214)    if (addry==1)
    0192 2D8C      MOV	R24,R12
    0193 3081      CPI	R24,1
    0194 F411      BNE	0x0197
(0215)    {
(0216)       addr = addrx;
    0195 2D6A      MOV	R22,R10
(0217)    }
    0196 C007      RJMP	0x019E
(0218)    else if (addry==2)
    0197 2D8C      MOV	R24,R12
    0198 3082      CPI	R24,2
    0199 F419      BNE	0x019D
(0219)    {
(0220)       addr = (addrx+0x40);
    019A 2D6A      MOV	R22,R10
    019B 5C60      SUBI	R22,0xC0
(0221)    }
    019C C001      RJMP	0x019E
(0222)    else
(0223)    {
(0224)       addr = 0;
    019D 2766      CLR	R22
(0225)    }
(0226)    DdramSet(0);     //初始化ddram地址
    019E 2700      CLR	R16
    019F DF69      RCALL	_DdramSet
(0227)    LCDReady();
    01A0 DF8B      RCALL	_LCDReady
(0228)    DdramSet(addr);  //设定ddram地址
    01A1 2F06      MOV	R16,R22
    01A2 DF66      RCALL	_DdramSet
(0229)    delay_us(80);
    01A3 E500      LDI	R16,0x50
    01A4 E010      LDI	R17,0
    01A5 940E01BB  CALL	_delay_us
    01A7 C00A      RJMP	0x01B2
(0230)    while(*s!=0XFF)
(0231)    {
(0232)      CharWrite((*s)+0x30);
    01A8 01FA      MOVW	R30,R20
    01A9 8100      LDD	R16,Z+0
    01AA 5D00      SUBI	R16,0xD0
    01AB DF8D      RCALL	_CharWrite
(0233) 	 s++;
    01AC 5F4F      SUBI	R20,0xFF
    01AD 4F5F      SBCI	R21,0xFF
(0234) 	 delay_us(80);   //等待写入操作完成
    01AE E500      LDI	R16,0x50
    01AF E010      LDI	R17,0
    01B0 940E01BB  CALL	_delay_us
    01B2 01FA      MOVW	R30,R20
    01B3 8180      LDD	R24,Z+0
    01B4 3F8F      CPI	R24,0xFF
    01B5 F791      BNE	0x01A8
    01B6 940E0388  CALL	pop_gset4
    01B8 9508      RET
FILE: F:\radio\第十二篇\sleep\delay.c
(0001) /*时钟为8MHZ*/
(0002) void delay_1us(void)
(0003) {
(0004)    asm("nop");
_delay_1us:
    01B9 0000      NOP
    01BA 9508      RET
_delay_us:
  itemp                --> R20
  itimes               --> R22
    01BB 940E0391  CALL	push_gset2
    01BD 01B8      MOVW	R22,R16
(0005) }
(0006) void delay_us(unsigned int itimes)
(0007) {
(0008)    unsigned int itemp;
(0009)    for (itemp=0;itemp<itimes;itemp++)
    01BE 2744      CLR	R20
    01BF 2755      CLR	R21
    01C0 C003      RJMP	0x01C4
(0010)       {
(0011) 	     delay_1us();
    01C1 DFF7      RCALL	_delay_1us
    01C2 5F4F      SUBI	R20,0xFF
    01C3 4F5F      SBCI	R21,0xFF
    01C4 1746      CP	R20,R22
    01C5 0757      CPC	R21,R23
    01C6 F3D0      BCS	0x01C1
    01C7 940E0385  CALL	pop_gset2
    01C9 9508      RET
(0012) 	  }
(0013) }
(0014) void delay_1ms(void)
(0015) {
(0016)    unsigned int itemp;
(0017)    for(itemp=1;itemp<1142;itemp++);
_delay_1ms:
  itemp                --> R16
    01CA E001      LDI	R16,1
    01CB E010      LDI	R17,0
    01CC C002      RJMP	0x01CF
    01CD 5F0F      SUBI	R16,0xFF
    01CE 4F1F      SBCI	R17,0xFF
    01CF 3706      CPI	R16,0x76
    01D0 E0E4      LDI	R30,4
    01D1 071E      CPC	R17,R30
    01D2 F3D0      BCS	0x01CD
    01D3 9508      RET
_delay_ms:
  itemp                --> R20
  itimes               --> R22
    01D4 940E0391  CALL	push_gset2
    01D6 01B8      MOVW	R22,R16
(0018) }
(0019) void delay_ms(unsigned int itimes)
(0020) {
(0021)    unsigned int itemp;
(0022)    for (itemp=0;itemp<itimes;itemp++)
    01D7 2744      CLR	R20
    01D8 2755      CLR	R21
    01D9 C003      RJMP	0x01DD
(0023)       {
(0024) 	     delay_1ms();
    01DA DFEF      RCALL	_delay_1ms
    01DB 5F4F      SUBI	R20,0xFF
    01DC 4F5F      SBCI	R21,0xFF
    01DD 1746      CP	R20,R22
    01DE 0757      CPC	R21,R23
    01DF F3D0      BCS	0x01DA
    01E0 940E0385  CALL	pop_gset2
    01E2 9508      RET
FILE: F:\radio\第十二篇\sleep\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) #include "usart.h"
(0005) #include "delay.h"
(0006) #define vref   256
(0007) volatile unsigned int extint_count=0;
(0008) volatile unsigned char act_flag=0;
(0009) volatile unsigned int adc_result;
(0010) unsigned char adc_show[6];
(0011) /** /
(0012) volatile:数据类型声明,表明该变量在程序执行中可被隐含改变
(0013) 编译器有时会将SRAM中的数据拷贝到通用寄存器中以提高程序的执行效率
(0014) (在通用寄存器中对数据的操作速度比操作SRAM中的数据要快),这样会带来
(0015) 一个问题,如果该SRAM中的数据已经被隐含改变(比如中断),那么编译器仍然
(0016) 读取寄存器中之前的SRAM拷贝值显然与其实际值不同,从而出现错误。
(0017) 本例中extint_count的值在外部中断服务程序中被改变,通过volatile
(0018) 声明通知编译器。
(0019) /**/
(0020) /** /
(0021) MCUCR &= 0X40;   //将休眠模式清0,即休眠模式1
(0022) 
(0023) MCUCR |= 0X10;  //将休眠模式为1,即休眠模式2
(0024) /**/
(0025) void port_init(void)
(0026) {
(0027)  PORTA = 0xFE;
_port_init:
    01E3 EF8E      LDI	R24,0xFE
    01E4 BB8B      OUT	0x1B,R24
(0028)  DDRA  = 0xFE;
    01E5 BB8A      OUT	0x1A,R24
(0029)  PORTB = 0xFF;
    01E6 EF8F      LDI	R24,0xFF
    01E7 BB88      OUT	0x18,R24
(0030)  DDRB  = 0xFF;
    01E8 BB87      OUT	0x17,R24
(0031)  PORTC = 0xFF; 
    01E9 BB85      OUT	0x15,R24
(0032)  DDRC  = 0xFF;
    01EA BB84      OUT	0x14,R24
(0033)  DDRD  = 0xFB;  //PD2(INT0)引脚设置为输入
    01EB EF8B      LDI	R24,0xFB
    01EC BB81      OUT	0x11,R24
(0034)  PORTD = 0xFB;  //关闭内部上拉
    01ED BB82      OUT	0x12,R24
    01EE 9508      RET
_adc_isr:
  temp                 --> R16
    01EF 922A      ST	R2,-Y
    01F0 923A      ST	R3,-Y
    01F1 930A      ST	R16,-Y
    01F2 931A      ST	R17,-Y
    01F3 93EA      ST	R30,-Y
    01F4 B62F      IN	R2,0x3F
    01F5 922A      ST	R2,-Y
(0035) }
(0036) /*      AD转换程序     */
(0037) #pragma interrupt_handler adc_isr:15
(0038) void adc_isr(void)
(0039) {
(0040)    unsigned int temp=0;
    01F6 2700      CLR	R16
    01F7 2711      CLR	R17
    01F8 C002      RJMP	0x01FB
(0041)    while(temp<6)
(0042)       temp++;                //短延时
    01F9 5F0F      SUBI	R16,0xFF
    01FA 4F1F      SBCI	R17,0xFF
    01FB 3006      CPI	R16,6
    01FC E0E0      LDI	R30,0
    01FD 071E      CPC	R17,R30
    01FE F3D0      BCS	0x01F9
(0043)    adc_result = ADC;         //读取AD转换值
    01FF B024      IN	R2,0x04
    0200 B035      IN	R3,0x05
    0201 923000C4  STS	adc_result+1,R3
    0203 922000C3  STS	adc_result,R2
    0205 9029      LD	R2,Y+
    0206 BE2F      OUT	0x3F,R2
    0207 91E9      LD	R30,Y+
    0208 9119      LD	R17,Y+
    0209 9109      LD	R16,Y+
    020A 9039      LD	R3,Y+
    020B 9029      LD	R2,Y+
    020C 9518      RETI
_data_con:
  i                    --> R10
  temp                 --> R12
    020D 940E038D  CALL	push_gset4
(0044) 	   
(0045)    //ADCSRA |= (1<<ADSC);      //再次启动转换 			 	 		 
(0046) } 
(0047) void data_con(void)
(0048) {
(0049)    unsigned int temp;
(0050)    unsigned char i;
(0051)    temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
    020F 902000C3  LDS	R2,adc_result
    0211 903000C4  LDS	R3,adc_result+1
    0213 2444      CLR	R4
    0214 2455      CLR	R5
    0215 E040      LDI	R20,0
    0216 E051      LDI	R21,1
    0217 E060      LDI	R22,0
    0218 E070      LDI	R23,0
    0219 925A      ST	R5,-Y
    021A 924A      ST	R4,-Y
    021B 923A      ST	R3,-Y
    021C 922A      ST	R2,-Y
    021D 018A      MOVW	R16,R20
    021E 019B      MOVW	R18,R22
    021F 940E0355  CALL	empy32s
    0221 E08A      LDI	R24,0xA
    0222 E090      LDI	R25,0
    0223 938A      ST	R24,-Y
    0224 940E03CF  CALL	lsr32
    0226 0168      MOVW	R12,R16
(0052)    for(i=0;i<3;i++)
    0227 24AA      CLR	R10
    0228 C019      RJMP	0x0242
(0053)    {
(0054) 	  adc_show[3-i]=temp%10+0x30;  //转换电压值用来在LCD上显示
    0229 2C2A      MOV	R2,R10
    022A 2433      CLR	R3
    022B E0E3      LDI	R30,3
    022C E0F0      LDI	R31,0
    022D 19E2      SUB	R30,R2
    022E 09F3      SBC	R31,R3
    022F EB8D      LDI	R24,0xBD
    0230 E090      LDI	R25,0
    0231 0FE8      ADD	R30,R24
    0232 1FF9      ADC	R31,R25
    0233 E02A      LDI	R18,0xA
    0234 E030      LDI	R19,0
    0235 0186      MOVW	R16,R12
    0236 940E0339  CALL	mod16u
    0238 01C8      MOVW	R24,R16
    0239 96C0      ADIW	R24,0x30
    023A 8380      STD	Z+0,R24
(0055) 	  temp=temp/10;
    023B E02A      LDI	R18,0xA
    023C E030      LDI	R19,0
    023D 0186      MOVW	R16,R12
    023E 940E033B  CALL	div16u
    0240 0168      MOVW	R12,R16
    0241 94A3      INC	R10
    0242 2D8A      MOV	R24,R10
    0243 3083      CPI	R24,3
    0244 F320      BCS	0x0229
(0056)    }
(0057) 	adc_show[0]=adc_show[1];
    0245 902000BE  LDS	R2,adc_show+1
    0247 922000BD  STS	adc_show,R2
(0058) 	adc_show[1]='.';	
    0249 E28E      LDI	R24,0x2E
    024A 938000BE  STS	adc_show+1,R24
(0059) 	adc_show[4]='V';	
    024C E586      LDI	R24,0x56
    024D 938000C1  STS	0xC1,R24
(0060) 	adc_show[5]=0;	              //数组结束标记
    024F 2422      CLR	R2
    0250 922000C2  STS	0xC2,R2
    0252 940E0388  CALL	pop_gset4
    0254 9508      RET
_int0_isr:
    0255 938A      ST	R24,-Y
    0256 939A      ST	R25,-Y
    0257 B78F      IN	R24,0x3F
    0258 938A      ST	R24,-Y
(0061) }
(0062) 
(0063) #pragma interrupt_handler int0_isr:2
(0064) void int0_isr(void)
(0065) {
(0066)    extint_count++;
    0259 91800060  LDS	R24,extint_count
    025B 91900061  LDS	R25,extint_count+1
    025D 9601      ADIW	R24,1
    025E 93900061  STS	extint_count+1,R25
    0260 93800060  STS	extint_count,R24
(0067)    if (act_flag!=1)
    0262 91800062  LDS	R24,act_flag
    0264 3081      CPI	R24,1
    0265 F019      BEQ	0x0269
(0068)    {
(0069)       act_flag = 1;
    0266 E081      LDI	R24,1
    0267 93800062  STS	act_flag,R24
(0070)    }
    0269 9189      LD	R24,Y+
    026A BF8F      OUT	0x3F,R24
    026B 9199      LD	R25,Y+
    026C 9189      LD	R24,Y+
    026D 9518      RETI
(0071) }
(0072) void adc_init(void)
(0073) {
(0074)    ADMUX = (1<<REFS1)|
_adc_init:
    026E EC80      LDI	R24,0xC0
    026F B987      OUT	0x07,R24
(0075)            (1<<REFS0)|    //选择内部2.56v作为参考电压

⌨️ 快捷键说明

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