📄 模拟比较器.lis
字号:
.module _模拟比较器.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\模拟比较器/delay.h
0000 .dbfunc e DelayUS _DelayUS fV
0000 ; time -> R16,R17
.even
0000 _DelayUS::
0000 .dbline -1
0000 .dbline 9
0000 ; //内部晶振 8M
0000 ; #include <ioM16v.h>
0000 ; #include <macros.h>
0000 ; #include"delay.h"
0000 ;
0000 ;
0000 ;
0000 ; /*------宏定义------*/
0000 ; #define uchar unsigned char
0000 02C0 xjmp L3
0002 L2:
0002 .dbline 11
0002 0150 subi R16,1
0004 1040 sbci R17,0
0006 L3:
0006 .dbline 10
0006 ; #define uint unsigned int
0006 81E0 ldi R24,1
0008 90E0 ldi R25,0
000A 8017 cp R24,R16
000C 9107 cpc R25,R17
000E C8F3 brlo L2
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbsym r time 16 i
0012 .dbend
0012 .dbfunc e DelayMS _DelayMS fV
0012 ; i -> R20,R21
0012 ; time -> R16,R17
.even
0012 _DelayMS::
0012 0E940000 xcall push_gset1
0016 .dbline -1
0016 .dbline 20
0016 ; #define LED_on PORTA&=~BIT(PA0)
0016 ; #define LED_off PORTA|=BIT(PA0)
0016 ;
0016 ; //端口初始化
0016 ; void port_init(void)
0016 ; {
0016 ; PORTA = 0xFF;//端口初始化
0016 ; DDRA = 0xFF;
0016 ; PORTB = 0x00;
0016 ; DDRB = 0x00;
0016 09C0 xjmp L7
0018 L6:
0018 .dbline 23
0018 ; PORTC = 0x00;
0018 ; DDRC = 0x00;
0018 ; PORTD = 0x00;
0018 .dbline 24
0018 ; DDRD = 0x00;
0018 41E0 ldi R20,1
001A 50E0 ldi R21,0
001C 02C0 xjmp L12
001E L9:
001E .dbline 25
001E L10:
001E .dbline 24
001E 4F5F subi R20,255 ; offset = 1
0020 5F4F sbci R21,255
0022 L12:
0022 .dbline 24
0022 4D38 cpi R20,141
0024 E0E0 ldi R30,0
0026 5E07 cpc R21,R30
0028 D0F3 brlo L9
002A .dbline 26
002A L7:
002A .dbline 22
002A 1801 movw R2,R16
002C 0150 subi R16,1
002E 1040 sbci R17,0
0030 2220 tst R2
0032 91F7 brne L6
0034 3320 tst R3
0036 81F7 brne L6
0038 X0:
0038 .dbline -2
0038 L5:
0038 0E940000 xcall pop_gset1
003C .dbline 0 ; func end
003C 0895 ret
003E .dbsym r i 20 i
003E .dbsym r time 16 i
003E .dbend
003E .dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\模拟比较器\模拟比较器.c
003E .dbfunc e port_init _port_init fV
.even
003E _port_init::
003E .dbline -1
003E .dbline 16
003E .dbline 17
003E 8FEF ldi R24,255
0040 8BBB out 0x1b,R24
0042 .dbline 18
0042 8ABB out 0x1a,R24
0044 .dbline 19
0044 2224 clr R2
0046 28BA out 0x18,R2
0048 .dbline 20
0048 27BA out 0x17,R2
004A .dbline 21
004A 25BA out 0x15,R2
004C .dbline 22
004C 24BA out 0x14,R2
004E .dbline 23
004E 22BA out 0x12,R2
0050 .dbline 24
0050 21BA out 0x11,R2
0052 .dbline -2
0052 L13:
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbend
0054 .dbfunc e comparator_init _comparator_init fV
.even
0054 _comparator_init::
0054 .dbline -1
0054 .dbline 30
0054 ; }
0054 ;
0054 ;
0054 ; //模拟比较器初始化
0054 ; void comparator_init(void)
0054 ; {
0054 .dbline 31
0054 ; ACSR &= ~BIT(ACIE);//确保修改时不产生中断
0054 4398 cbi 0x8,3
0056 .dbline 32
0056 ; ACSR = 0x48;//比较输出器变化触发中断
0056 88E4 ldi R24,72
0058 88B9 out 0x8,R24
005A .dbline -2
005A L14:
005A .dbline 0 ; func end
005A 0895 ret
005C .dbend
.area vector(rom, abs)
.org 64
0040 0C942E00 jmp _ana_comp_isr
.area text(rom, con, rel)
005C .dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\模拟比较器\模拟比较器.c
005C .dbfunc e ana_comp_isr _ana_comp_isr fV
.even
005C _ana_comp_isr::
005C 0E940000 xcall push_lset
0060 .dbline -1
0060 .dbline 39
0060 ; }
0060 ;
0060 ;
0060 ; //模拟比较中断函数
0060 ; #pragma interrupt_handler ana_comp_isr:17
0060 ; void ana_comp_isr(void)
0060 ; {
0060 .dbline 40
0060 ; DelayUS(10);
0060 0AE0 ldi R16,10
0062 10E0 ldi R17,0
0064 CDDF xcall _DelayUS
0066 .dbline 42
0066 ;
0066 ; if (ACSR&(1<<ACO)) //检测ACO
0066 459B sbis 0x8,5
0068 02C0 rjmp L16
006A .dbline 44
006A ;
006A ; LED_on; //如果LED亮
006A D898 cbi 0x1b,0
006C 01C0 xjmp L17
006E L16:
006E .dbline 48
006E ;
006E ; else
006E ;
006E ; LED_off; //否则 LED灭
006E D89A sbi 0x1b,0
0070 L17:
0070 .dbline 50
0070 ;
0070 ; DelayMS(200); //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到
0070 08EC ldi R16,200
0072 10E0 ldi R17,0
0074 CEDF xcall _DelayMS
0076 .dbline -2
0076 L15:
0076 0E940000 xcall pop_lset
007A .dbline 0 ; func end
007A 1895 reti
007C .dbend
007C .dbfunc e init_devices _init_devices fV
.even
007C _init_devices::
007C .dbline -1
007C .dbline 57
007C ;
007C ; //通过判断ACO位来知道比较结果
007C ; }
007C ;
007C ;
007C ; void init_devices(void)
007C ; {
007C .dbline 58
007C ; CLI(); //禁止所有中断
007C F894 cli
007E .dbline 59
007E ; MCUCR = 0x00;//INT0、INT1中断触发方式
007E 2224 clr R2
0080 25BE out 0x35,R2
0082 .dbline 60
0082 ; MCUCSR = 0x80;//禁止JTAG
0082 80E8 ldi R24,128
0084 84BF out 0x34,R24
0086 .dbline 61
0086 ; GICR = 0x00;//外部中断使能
0086 2BBE out 0x3b,R2
0088 .dbline 62
0088 ; port_init();
0088 DADF xcall _port_init
008A .dbline 63
008A ; comparator_init();
008A E4DF xcall _comparator_init
008C .dbline 64
008C ; SEI();//开全局中断
008C 7894 sei
008E .dbline -2
008E L18:
008E .dbline 0 ; func end
008E 0895 ret
0090 .dbend
0090 .dbfunc e main _main fV
.even
0090 _main::
0090 .dbline -1
0090 .dbline 68
0090 ; }
0090 ; //主函数
0090 ; void main(void)
0090 ; {
0090 .dbline 69
0090 ; init_devices();
0090 F5DF xcall _init_devices
0092 01C0 xjmp L21
0094 L20:
0094 .dbline 72
0094 .dbline 73
0094 0000 nop
0096 .dbline 74
0096 L21:
0096 .dbline 71
0096 FECF xjmp L20
0098 X1:
0098 .dbline -2
0098 L19:
0098 .dbline 0 ; func end
0098 0895 ret
009A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -