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

📄 main.lis

📁 AVR模拟比较器(mega16系列单片机)
💻 LIS
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\桌面\avr程序设计\模拟比较器\main.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 41
 0000           ; //ICC-AVR application builder : 2007-3-15 8:22:58
 0000           ; // Target : M16
 0000           ; // Crystal: 7.3728Mhz
 0000           ; 
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include "delay.h"
 0000           ; 
 0000           ; //管脚定义
 0000           ; #define LED0          0       //PB0
 0000           ; #define AIN_P         2       //PB2(AIN0)
 0000           ; #define AIN_N         3       //PB3(AIN1)
 0000           ; 
 0000           ; //宏定义
 0000           ; #define LED0_ON()             PORTB|= (1<<LED0)   //输出高电平,灯亮
 0000           ; #define LED0_OFF()            PORTB&=~(1<<LED0)       //输出低电平,灯灭
 0000           ; 
 0000           ; //常量定义
 0000           ; /*
 0000           ;       模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源
 0000           ; 
 0000           ; 模拟比较器多工输入 (不常用,因为ADC将无法使用)
 0000           ;       可以选择ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。
 0000           ;       ADC复用器可用来完成这个功能。
 0000           ;       当然,为了使用这个功能首先必须关掉ADC。
 0000           ;       如果模拟比较器复用器使  能位(SFIOR 中的ACME) 被置位,且ADC 也已经关掉(ADCSRA 寄存器的ADEN 为0),
 0000           ;       则可以通过ADMUX 寄存器的MUX2..0 来选择替代模拟比较器负极输入的管脚,
 0000           ;       如果ACME 清零或ADEN 置位,则模拟比较器的负极输入为AIN1。
 0000           ;       
 0000           ; */
 0000           ; #define AC_ADC0                       0x00            //ADC0
 0000           ; #define AC_ADC1                       0x01            //ADC1
 0000           ; #define AC_ADC2                       0x02            //ADC2
 0000           ; #define AC_ADC3                       0x03            //ADC3
 0000           ; #define AC_ADC4                       0x04            //ADC4
 0000           ; #define AC_ADC5                       0x05            //ADC5
 0000           ; #define AC_ADC6                       0x06            //ADC6
 0000           ; #define AC_ADC7                       0x07            //ADC7
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 42
 0000           ;  PORTA = 0x00;
 0000 2224              clr R2
 0002 2BBA              out 0x1b,R2
 0004                   .dbline 43
 0004           ;  DDRA  = 0x00;
 0004 2ABA              out 0x1a,R2
 0006                   .dbline 44
 0006           ;  PORTB = ~((1<<AIN_P)|(1<<AIN_N)); //作模拟比较器输入时,不可使能内部上拉电阻。
 0006 83EF              ldi R24,243
 0008 88BB              out 0x18,R24
 000A                   .dbline 45
 000A           ;  DDRB = (1<<LED0);                            //PB0作输出
 000A 81E0              ldi R24,1
 000C 87BB              out 0x17,R24
 000E                   .dbline 46
 000E           ;  PORTC = 0x00; //m103 output only
 000E 25BA              out 0x15,R2
 0010                   .dbline 47
 0010           ;  DDRC  = 0x00;
 0010 24BA              out 0x14,R2
 0012                   .dbline 48
 0012           ;  PORTD = 0x00;
 0012 22BA              out 0x12,R2
 0014                   .dbline 49
 0014           ;  DDRD  = 0x00;
 0014 21BA              out 0x11,R2
 0016                   .dbline -2
 0016           L1:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbend
 0018                   .dbfunc e comparator_init _comparator_init fV
                        .even
 0018           _comparator_init::
 0018                   .dbline -1
 0018                   .dbline 55
 0018           ; }
 0018           ; 
 0018           ; //Comparator initialize
 0018           ; // trigger on: Output toggle
 0018           ; void comparator_init(void)
 0018           ; {
 0018                   .dbline 56
 0018           ;  ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
 0018 88B1              in R24,0x8
 001A 877F              andi R24,247
 001C 88B9              out 0x8,R24
 001E                   .dbline 57
 001E           ;  ACSR = 0xCC;
 001E 8CEC              ldi R24,204
 0020 88B9              out 0x8,R24
 0022                   .dbline -2
 0022           L2:
 0022                   .dbline 0 ; func end
 0022 0895              ret
 0024                   .dbend
                        .area vector(rom, abs)
                        .org 64
 0040 0C941200          jmp _ana_comp_isr
                        .area text(rom, con, rel)
 0024                   .dbfile D:\桌面\avr程序设计\模拟比较器\main.c
 0024                   .dbfunc e ana_comp_isr _ana_comp_isr fV
                        .even
 0024           _ana_comp_isr::
 0024 0E940000          xcall push_lset
 0028                   .dbline -1
 0028                   .dbline 65
 0028           ;  //ACSR=(1<<ACIE);
 0028           ;  // 使能模拟比较器中断,比较器输出变化即可触发中断,AIN0为正输入端,AIN1为负输入端。
 0028           ; 
 0028           ; }
 0028           ; 
 0028           ; #pragma interrupt_handler ana_comp_isr:17
 0028           ; void ana_comp_isr(void)
 0028           ; {
 0028                   .dbline 68
 0028           ;  //analog comparator compare event
 0028           ;      //硬件自动清除ACI标志位
 0028           ;     delay_us(10);
 0028 0AE0              ldi R16,10
 002A 10E0              ldi R17,0
 002C 0E940000          xcall _delay_us
 0030                   .dbline 69
 0030           ;     if ((ACSR&(1<<ACO))==0)   //检测ACO
 0030 4599              sbic 0x8,5
 0032 02C0              rjmp L4
 0034                   .dbline 70
 0034           ;       LED0_ON();                      //如果AIN0<AIN1(ACO=0),LED亮
 0034 C09A              sbi 0x18,0
 0036 01C0              xjmp L5
 0038           L4:
 0038                   .dbline 72
 0038           ;     else
 0038           ;       LED0_OFF();                     //否则 LED灭
 0038 C098              cbi 0x18,0
 003A           L5:
 003A                   .dbline 73
 003A           ;     delay_ms(200);            //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到  
 003A 08EC              ldi R16,200
 003C 10E0              ldi R17,0
 003E 0E940000          xcall _delay_ms
 0042                   .dbline -2
 0042           L3:
 0042 0E940000          xcall pop_lset
 0046                   .dbline 0 ; func end
 0046 1895              reti
 0048                   .dbend
 0048                   .dbfunc e init_devices _init_devices fV
                        .even
 0048           _init_devices::
 0048                   .dbline -1
 0048                   .dbline 78
 0048           ; }
 0048           ; 
 0048           ; //call this routine to initialize all peripherals
 0048           ; void init_devices(void)
 0048           ; {
 0048                   .dbline 80
 0048           ;  //stop errant interrupts until set up
 0048           ;  CLI(); //disable all interrupts
 0048 F894              cli
 004A                   .dbline 81
 004A           ;  port_init();
 004A DADF              xcall _port_init
 004C                   .dbline 82
 004C           ;  comparator_init();
 004C E5DF              xcall _comparator_init
 004E                   .dbline 84
 004E           ; 
 004E           ;  MCUCR = 0x00;
 004E 2224              clr R2
 0050 25BE              out 0x35,R2
 0052                   .dbline 85
 0052           ;  GICR  = 0x00;
 0052 2BBE              out 0x3b,R2
 0054                   .dbline 86
 0054           ;  TIMSK = 0x00; //timer interrupt sources
 0054 29BE              out 0x39,R2
 0056                   .dbline 87
 0056           ;  SEI(); //re-enable interrupts
 0056 7894              sei
 0058                   .dbline -2
 0058           L6:
 0058                   .dbline 0 ; func end
 0058 0895              ret
 005A                   .dbend
 005A                   .dbfunc e main _main fV
                        .even
 005A           _main::
 005A                   .dbline -1
 005A                   .dbline 92
 005A           ;  //all peripherals are now initialized
 005A           ; }
 005A           ; 
 005A           ; void main(void)
 005A           ; {
 005A                   .dbline 93
 005A           ;  init_devices();
 005A F6DF              xcall _init_devices
 005C           L8:
 005C                   .dbline 95
 005C           L9:
 005C                   .dbline 94
 005C FFCF              xjmp L8
 005E           X0:
 005E                   .dbline -2
 005E           L7:
 005E                   .dbline 0 ; func end
 005E 0895              ret
 0060                   .dbend

⌨️ 快捷键说明

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