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

📄 main.lis

📁 ATmega16休眠模式的应用:使用程序关闭没有使用的模块
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module main.c
                        .area data(ram, con, rel)
 0000           _extint_count::
 0000                   .blkb 2
                        .area idata
 0000 0000              .word 0
                        .area data(ram, con, rel)
 0002                   .dbfile F:\radio\第十二篇\sleep\main.c
 0002                   .dbsym e extint_count _extint_count i
 0002           _act_flag::
 0002                   .blkb 1
                        .area idata
 0002 00                .byte 0
                        .area data(ram, con, rel)
 0003                   .dbfile F:\radio\第十二篇\sleep\main.c
 0003                   .dbsym e act_flag _act_flag c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\radio\第十二篇\sleep\main.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 26
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include "lcd.h"
 0000           ; #include "usart.h"
 0000           ; #include "delay.h"
 0000           ; #define vref   256
 0000           ; volatile unsigned int extint_count=0;
 0000           ; volatile unsigned char act_flag=0;
 0000           ; volatile unsigned int adc_result;
 0000           ; unsigned char adc_show[6];
 0000           ; /** /
 0000           ; volatile:数据类型声明,表明该变量在程序执行中可被隐含改变
 0000           ; 编译器有时会将SRAM中的数据拷贝到通用寄存器中以提高程序的执行效率
 0000           ; (在通用寄存器中对数据的操作速度比操作SRAM中的数据要快),这样会带来
 0000           ; 一个问题,如果该SRAM中的数据已经被隐含改变(比如中断),那么编译器仍然
 0000           ; 读取寄存器中之前的SRAM拷贝值显然与其实际值不同,从而出现错误。
 0000           ; 本例中extint_count的值在外部中断服务程序中被改变,通过volatile
 0000           ; 声明通知编译器。
 0000           ; /**/
 0000           ; /** /
 0000           ; MCUCR &= 0X40;   //将休眠模式清0,即休眠模式1
 0000           ; 
 0000           ; MCUCR |= 0X10;  //将休眠模式为1,即休眠模式2
 0000           ; /**/
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 27
 0000           ;  PORTA = 0xFE;
 0000 8EEF              ldi R24,254
 0002 8BBB              out 0x1b,R24
 0004                   .dbline 28
 0004           ;  DDRA  = 0xFE;
 0004 8ABB              out 0x1a,R24
 0006                   .dbline 29
 0006           ;  PORTB = 0xFF;
 0006 8FEF              ldi R24,255
 0008 88BB              out 0x18,R24
 000A                   .dbline 30
 000A           ;  DDRB  = 0xFF;
 000A 87BB              out 0x17,R24
 000C                   .dbline 31
 000C           ;  PORTC = 0xFF; 
 000C 85BB              out 0x15,R24
 000E                   .dbline 32
 000E           ;  DDRC  = 0xFF;
 000E 84BB              out 0x14,R24
 0010                   .dbline 33
 0010           ;  DDRD  = 0xFB;  //PD2(INT0)引脚设置为输入
 0010 8BEF              ldi R24,251
 0012 81BB              out 0x11,R24
 0014                   .dbline 34
 0014           ;  PORTD = 0xFB;  //关闭内部上拉
 0014 82BB              out 0x12,R24
 0016                   .dbline -2
 0016           L1:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbend
                        .area vector(rom, abs)
                        .org 56
 0038 0C940C00          jmp _adc_isr
                        .area text(rom, con, rel)
 0018                   .dbfile F:\radio\第十二篇\sleep\main.c
 0018                   .dbfunc e adc_isr _adc_isr fV
 0018           ;           temp -> R16,R17
                        .even
 0018           _adc_isr::
 0018 2A92              st -y,R2
 001A 3A92              st -y,R3
 001C 0A93              st -y,R16
 001E 1A93              st -y,R17
 0020 EA93              st -y,R30
 0022 2FB6              in R2,0x3f
 0024 2A92              st -y,R2
 0026                   .dbline -1
 0026                   .dbline 39
 0026           ; }
 0026           ; /*      AD转换程序     */
 0026           ; #pragma interrupt_handler adc_isr:15
 0026           ; void adc_isr(void)
 0026           ; {
 0026                   .dbline 40
 0026           ;    unsigned int temp=0;
 0026 0027              clr R16
 0028 1127              clr R17
 002A 02C0              xjmp L4
 002C           L3:
 002C                   .dbline 42
 002C 0F5F              subi R16,255  ; offset = 1
 002E 1F4F              sbci R17,255
 0030           L4:
 0030                   .dbline 41
 0030           ;    while(temp<6)
 0030 0630              cpi R16,6
 0032 E0E0              ldi R30,0
 0034 1E07              cpc R17,R30
 0036 D0F3              brlo L3
 0038                   .dbline 43
 0038           ;       temp++;                //短延时
 0038           ;    adc_result = ADC;         //读取AD转换值
 0038 24B0              in R2,0x4
 003A 35B0              in R3,0x5
 003C 30920700          sts _adc_result+1,R3
 0040 20920600          sts _adc_result,R2
 0044                   .dbline -2
 0044           L2:
 0044 2990              ld R2,y+
 0046 2FBE              out 0x3f,R2
 0048 E991              ld R30,y+
 004A 1991              ld R17,y+
 004C 0991              ld R16,y+
 004E 3990              ld R3,y+
 0050 2990              ld R2,y+
 0052                   .dbline 0 ; func end
 0052 1895              reti
 0054                   .dbsym r temp 16 i
 0054                   .dbend
 0054                   .dbfunc e data_con _data_con fV
 0054           ;              i -> R10
 0054           ;           temp -> R12,R13
                        .even
 0054           _data_con::
 0054 0E940000          xcall push_gset4
 0058                   .dbline -1
 0058                   .dbline 48
 0058           ;          
 0058           ;    //ADCSRA |= (1<<ADSC);      //再次启动转换                                                  
 0058           ; } 
 0058           ; void data_con(void)
 0058           ; {
 0058                   .dbline 51
 0058           ;    unsigned int temp;
 0058           ;    unsigned char i;
 0058           ;    temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
 0058 20900600          lds R2,_adc_result
 005C 30900700          lds R3,_adc_result+1
 0060 4424              clr R4
 0062 5524              clr R5
 0064 40E0              ldi R20,0
 0066 51E0              ldi R21,1
 0068 60E0              ldi R22,0
 006A 70E0              ldi R23,0
 006C 5A92              st -y,R5
 006E 4A92              st -y,R4
 0070 3A92              st -y,R3
 0072 2A92              st -y,R2
 0074 8A01              movw R16,R20
 0076 9B01              movw R18,R22
 0078 0E940000          xcall empy32u
 007C 8AE0              ldi R24,10
 007E 90E0              ldi R25,0
 0080 8A93              st -y,R24
 0082 0E940000          xcall lsr32
 0086 6801              movw R12,R16
 0088                   .dbline 52
 0088           ;    for(i=0;i<3;i++)
 0088 AA24              clr R10
 008A 19C0              xjmp L10
 008C           L7:
 008C                   .dbline 53
 008C                   .dbline 54
 008C 2A2C              mov R2,R10
 008E 3324              clr R3
 0090 E3E0              ldi R30,3
 0092 F0E0              ldi R31,0
 0094 E219              sub R30,R2
 0096 F309              sbc R31,R3
 0098 80E0              ldi R24,<_adc_show
 009A 90E0              ldi R25,>_adc_show
 009C E80F              add R30,R24
 009E F91F              adc R31,R25
 00A0 2AE0              ldi R18,10
 00A2 30E0              ldi R19,0
 00A4 8601              movw R16,R12
 00A6 0E940000          xcall mod16u
 00AA C801              movw R24,R16
 00AC C096              adiw R24,48
 00AE 8083              std z+0,R24
 00B0                   .dbline 55
 00B0 2AE0              ldi R18,10
 00B2 30E0              ldi R19,0
 00B4 8601              movw R16,R12
 00B6 0E940000          xcall div16u
 00BA 6801              movw R12,R16
 00BC                   .dbline 56
 00BC           L8:
 00BC                   .dbline 52
 00BC A394              inc R10
 00BE           L10:
 00BE                   .dbline 52
 00BE 8A2D              mov R24,R10
 00C0 8330              cpi R24,3
 00C2 20F3              brlo L7
 00C4                   .dbline 57
 00C4           ;    {
 00C4           ;         adc_show[3-i]=temp%10+0x30;  //转换电压值用来在LCD上显示
 00C4           ;         temp=temp/10;
 00C4           ;    }
 00C4           ;       adc_show[0]=adc_show[1];
 00C4 20900100          lds R2,_adc_show+1
 00C8 20920000          sts _adc_show,R2
 00CC                   .dbline 58
 00CC           ;       adc_show[1]='.';        
 00CC 8EE2              ldi R24,46
 00CE 80930100          sts _adc_show+1,R24
 00D2                   .dbline 59
 00D2           ;       adc_show[4]='V';        
 00D2 86E5              ldi R24,86
 00D4 80930400          sts _adc_show+4,R24
 00D8                   .dbline 60
 00D8           ;       adc_show[5]=0;                //数组结束标记
 00D8 2224              clr R2
 00DA 20920500          sts _adc_show+5,R2
 00DE                   .dbline -2
 00DE           L6:
 00DE 0E940000          xcall pop_gset4
 00E2                   .dbline 0 ; func end
 00E2 0895              ret
 00E4                   .dbsym r i 10 c
 00E4                   .dbsym r temp 12 i
 00E4                   .dbend
                        .area vector(rom, abs)
                        .org 4
 0004 0C947200          jmp _int0_isr
                        .area text(rom, con, rel)
 00E4                   .dbfile F:\radio\第十二篇\sleep\main.c
 00E4                   .dbfunc e int0_isr _int0_isr fV
                        .even
 00E4           _int0_isr::
 00E4 8A93              st -y,R24
 00E6 9A93              st -y,R25
 00E8 8FB7              in R24,0x3f
 00EA 8A93              st -y,R24
 00EC                   .dbline -1
 00EC                   .dbline 65
 00EC                   .dbline 66
 00EC 80910000          lds R24,_extint_count
 00F0 90910100          lds R25,_extint_count+1
 00F4 0196              adiw R24,1
 00F6 90930100          sts _extint_count+1,R25
 00FA 80930000          sts _extint_count,R24
 00FE                   .dbline 67
 00FE 80910200          lds R24,_act_flag
 0102 8130              cpi R24,1
 0104 19F0              breq L16
 0106                   .dbline 68
 0106                   .dbline 69
 0106 81E0              ldi R24,1
 0108 80930200          sts _act_flag,R24
 010C                   .dbline 70
 010C           L16:
 010C                   .dbline -2
 010C           L15:
 010C 8991              ld R24,y+
 010E 8FBF              out 0x3f,R24
 0110 9991              ld R25,y+
 0112 8991              ld R24,y+
 0114                   .dbline 0 ; func end
 0114 1895              reti
 0116                   .dbend
 0116                   .dbfunc e adc_init _adc_init fV
                        .even
 0116           _adc_init::
 0116                   .dbline -1
 0116                   .dbline 73
 0116           ; }
 0116           ; 
 0116           ; #pragma interrupt_handler int0_isr:2
 0116           ; void int0_isr(void)
 0116           ; {
 0116           ;    extint_count++;
 0116           ;    if (act_flag!=1)
 0116           ;    {
 0116           ;       act_flag = 1;
 0116           ;    }
 0116           ; }
 0116           ; void adc_init(void)
 0116           ; {
 0116                   .dbline 74
 0116           ;    ADMUX = (1<<REFS1)|
 0116 80EC              ldi R24,192
 0118 87B9              out 0x7,R24
 011A                   .dbline 78
 011A           ;            (1<<REFS0)|    //选择内部2.56v作为参考电压
 011A           ;            0x00;          //使用ad转换0通道
 011A           ;                                 //ADLAR = 0,转换结果选择右对齐
 011A           ;    ADCSRA = //(1<<ADEN)|     //ADC使能
 011A 8EE1              ldi R24,30
 011C 86B9              out 0x6,R24
 011E                   .dbline -2
 011E           L18:
 011E                   .dbline 0 ; func end
 011E 0895              ret
 0120                   .dbend
 0120                   .dbfunc e sleep_init _sleep_init fV
                        .even
 0120           _sleep_init::
 0120                   .dbline -1
 0120                   .dbline 85
 0120           ;             //(1<<ADSC)|     //开始一次ad转换
 0120           ;                   (1<<ADIF)|     //写1,将ADIF位清0
 0120           ;                   (1<<ADIE)|     //允许ADC中断
 0120           ;                   0x06;          //时钟分频系数为64
 0120           ; }
 0120           ; void sleep_init(void)
 0120           ; {
 0120                   .dbline 86
 0120           ;    MCUCR |= 0X40;  //使能休眠
 0120 85B7              in R24,0x35
 0122 8064              ori R24,64
 0124 85BF              out 0x35,R24
 0126                   .dbline -2
 0126           L19:
 0126                   .dbline 0 ; func end
 0126 0895              ret
 0128                   .dbend
 0128                   .dbfunc e init_devices _init_devices fV
                        .even
 0128           _init_devices::
 0128                   .dbline -1
 0128                   .dbline 90
 0128           ; }
 0128           ; //call this routine to initialize all peripherals
 0128           ; void init_devices(void)
 0128           ; {

⌨️ 快捷键说明

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