📄 main.lis
字号:
.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 + -