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

📄 main.lis

📁 ATmega16内部ADC的应用:ATmega16内部集成了8路10位逐次逼近型模数转换器
💻 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\第十一篇\test-adc\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\第十一篇\test-adc\main.c
 0003                   .dbsym e act_flag _act_flag c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\radio\第十一篇\test-adc\main.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 21
 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           ; void port_init(void)
 0000           ; {
 0000                   .dbline 22
 0000           ;  PORTA = 0xFE;
 0000 8EEF              ldi R24,254
 0002 8BBB              out 0x1b,R24
 0004                   .dbline 23
 0004           ;  DDRA  = 0xFE;
 0004 8ABB              out 0x1a,R24
 0006                   .dbline 24
 0006           ;  PORTB = 0xFF;
 0006 8FEF              ldi R24,255
 0008 88BB              out 0x18,R24
 000A                   .dbline 25
 000A           ;  DDRB  = 0xFF;
 000A 87BB              out 0x17,R24
 000C                   .dbline 26
 000C           ;  PORTC = 0xFF; 
 000C 85BB              out 0x15,R24
 000E                   .dbline 27
 000E           ;  DDRC  = 0xFF;
 000E 84BB              out 0x14,R24
 0010                   .dbline 28
 0010           ;  DDRD  = 0xFB;  //PD2(INT0)引脚设置为输入
 0010 8BEF              ldi R24,251
 0012 81BB              out 0x11,R24
 0014                   .dbline 29
 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\第十一篇\test-adc\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 34
 0026           ; }
 0026           ; /*      AD转换程序     */
 0026           ; #pragma interrupt_handler adc_isr:15
 0026           ; void adc_isr(void)
 0026           ; {
 0026                   .dbline 35
 0026           ;    unsigned int temp=0;
 0026 0027              clr R16
 0028 1127              clr R17
 002A 02C0              xjmp L4
 002C           L3:
 002C                   .dbline 37
 002C 0F5F              subi R16,255  ; offset = 1
 002E 1F4F              sbci R17,255
 0030           L4:
 0030                   .dbline 36
 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 38
 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 40
 0044           ;          
 0044           ;    ADCSRA |= (1<<ADSC);      //再次启动转换                                            
 0044 369A              sbi 0x6,6
 0046                   .dbline -2
 0046           L2:
 0046 2990              ld R2,y+
 0048 2FBE              out 0x3f,R2
 004A E991              ld R30,y+
 004C 1991              ld R17,y+
 004E 0991              ld R16,y+
 0050 3990              ld R3,y+
 0052 2990              ld R2,y+
 0054                   .dbline 0 ; func end
 0054 1895              reti
 0056                   .dbsym r temp 16 i
 0056                   .dbend
 0056                   .dbfunc e data_con _data_con fV
 0056           ;              i -> R10
 0056           ;           temp -> R12,R13
                        .even
 0056           _data_con::
 0056 0E940000          xcall push_gset4
 005A                   .dbline -1
 005A                   .dbline 43
 005A           ; } 
 005A           ; void data_con(void)
 005A           ; {
 005A                   .dbline 46
 005A           ;    unsigned int temp;
 005A           ;    unsigned char i;
 005A           ;    temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
 005A 20900600          lds R2,_adc_result
 005E 30900700          lds R3,_adc_result+1
 0062 4424              clr R4
 0064 5524              clr R5
 0066 40E0              ldi R20,0
 0068 51E0              ldi R21,1
 006A 60E0              ldi R22,0
 006C 70E0              ldi R23,0
 006E 5A92              st -y,R5
 0070 4A92              st -y,R4
 0072 3A92              st -y,R3
 0074 2A92              st -y,R2
 0076 8A01              movw R16,R20
 0078 9B01              movw R18,R22
 007A 0E940000          xcall empy32u
 007E 8AE0              ldi R24,10
 0080 90E0              ldi R25,0
 0082 8A93              st -y,R24
 0084 0E940000          xcall lsr32
 0088 6801              movw R12,R16
 008A                   .dbline 47
 008A           ;    for(i=0;i<3;i++)
 008A AA24              clr R10
 008C 19C0              xjmp L10
 008E           L7:
 008E                   .dbline 48
 008E                   .dbline 49
 008E 2A2C              mov R2,R10
 0090 3324              clr R3
 0092 E3E0              ldi R30,3
 0094 F0E0              ldi R31,0
 0096 E219              sub R30,R2
 0098 F309              sbc R31,R3
 009A 80E0              ldi R24,<_adc_show
 009C 90E0              ldi R25,>_adc_show
 009E E80F              add R30,R24
 00A0 F91F              adc R31,R25
 00A2 2AE0              ldi R18,10
 00A4 30E0              ldi R19,0
 00A6 8601              movw R16,R12
 00A8 0E940000          xcall mod16u
 00AC C801              movw R24,R16
 00AE C096              adiw R24,48
 00B0 8083              std z+0,R24
 00B2                   .dbline 50
 00B2 2AE0              ldi R18,10
 00B4 30E0              ldi R19,0
 00B6 8601              movw R16,R12
 00B8 0E940000          xcall div16u
 00BC 6801              movw R12,R16
 00BE                   .dbline 51
 00BE           L8:
 00BE                   .dbline 47
 00BE A394              inc R10
 00C0           L10:
 00C0                   .dbline 47
 00C0 8A2D              mov R24,R10
 00C2 8330              cpi R24,3
 00C4 20F3              brlo L7
 00C6                   .dbline 52
 00C6           ;    {
 00C6           ;         adc_show[3-i]=temp%10+0x30;  //转换电压值用来在LCD上显示
 00C6           ;         temp=temp/10;
 00C6           ;    }
 00C6           ;       adc_show[0]=adc_show[1];
 00C6 20900100          lds R2,_adc_show+1
 00CA 20920000          sts _adc_show,R2
 00CE                   .dbline 53
 00CE           ;       adc_show[1]='.';        
 00CE 8EE2              ldi R24,46
 00D0 80930100          sts _adc_show+1,R24
 00D4                   .dbline 54
 00D4           ;       adc_show[4]='V';        
 00D4 86E5              ldi R24,86
 00D6 80930400          sts _adc_show+4,R24
 00DA                   .dbline 55
 00DA           ;       adc_show[5]=0;                //数组结束标记
 00DA 2224              clr R2
 00DC 20920500          sts _adc_show+5,R2
 00E0                   .dbline -2
 00E0           L6:
 00E0 0E940000          xcall pop_gset4
 00E4                   .dbline 0 ; func end
 00E4 0895              ret
 00E6                   .dbsym r i 10 c
 00E6                   .dbsym r temp 12 i
 00E6                   .dbend
                        .area vector(rom, abs)
                        .org 4
 0004 0C947300          jmp _int0_isr
                        .area text(rom, con, rel)
 00E6                   .dbfile F:\radio\第十一篇\test-adc\main.c
 00E6                   .dbfunc e int0_isr _int0_isr fV
                        .even
 00E6           _int0_isr::
 00E6 8A93              st -y,R24
 00E8 9A93              st -y,R25
 00EA 8FB7              in R24,0x3f
 00EC 8A93              st -y,R24
 00EE                   .dbline -1
 00EE                   .dbline 60
 00EE                   .dbline 61
 00EE 80910000          lds R24,_extint_count
 00F2 90910100          lds R25,_extint_count+1

⌨️ 快捷键说明

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