📄 模拟比较器.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0093 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\模拟比较器\delay.h
(0001) #define xtal 1 //1MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
004B C002 RJMP 0x004E
(0010) while(time>1)
(0011) time--;
004C 5001 SUBI R16,1
004D 4010 SBCI R17,0
004E E081 LDI R24,1
004F E090 LDI R25,0
0050 1780 CP R24,R16
0051 0791 CPC R25,R17
0052 F3C8 BCS 0x004C
0053 9508 RET
_DelayMS:
i --> R20
time --> R16
0054 940E00A0 CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
0056 C009 RJMP 0x0060
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0057 E041 LDI R20,1
0058 E050 LDI R21,0
0059 C002 RJMP 0x005C
005A 5F4F SUBI R20,0xFF
005B 4F5F SBCI R21,0xFF
005C 384D CPI R20,0x8D
005D E0E0 LDI R30,0
005E 075E CPC R21,R30
005F F3D0 BCS 0x005A
0060 0118 MOVW R2,R16
0061 5001 SUBI R16,1
0062 4010 SBCI R17,0
0063 2022 TST R2
0064 F791 BNE 0x0057
0065 2033 TST R3
0066 F781 BNE 0x0057
0067 940E00A3 CALL pop_gset1
0069 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\模拟比较器\模拟比较器.c
(0001) //内部晶振 8M
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include"delay.h"
(0005)
(0006)
(0007)
(0008) /*------宏定义------*/
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011) #define LED_on PORTA&=~BIT(PA0)
(0012) #define LED_off PORTA|=BIT(PA0)
(0013)
(0014) //端口初始化
(0015) void port_init(void)
(0016) {
(0017) PORTA = 0xFF;//端口初始化
_port_init:
006A EF8F LDI R24,0xFF
006B BB8B OUT 0x1B,R24
(0018) DDRA = 0xFF;
006C BB8A OUT 0x1A,R24
(0019) PORTB = 0x00;
006D 2422 CLR R2
006E BA28 OUT 0x18,R2
(0020) DDRB = 0x00;
006F BA27 OUT 0x17,R2
(0021) PORTC = 0x00;
0070 BA25 OUT 0x15,R2
(0022) DDRC = 0x00;
0071 BA24 OUT 0x14,R2
(0023) PORTD = 0x00;
0072 BA22 OUT 0x12,R2
(0024) DDRD = 0x00;
0073 BA21 OUT 0x11,R2
0074 9508 RET
(0025) }
(0026)
(0027)
(0028) //模拟比较器初始化
(0029) void comparator_init(void)
(0030) {
(0031) ACSR &= ~BIT(ACIE);//确保修改时不产生中断
_comparator_init:
0075 9843 CBI 0x08,3
(0032) ACSR = 0x48;//比较输出器变化触发中断
0076 E488 LDI R24,0x48
0077 B988 OUT 0x08,R24
0078 9508 RET
_ana_comp_isr:
0079 940E00B7 CALL push_lset
(0033) }
(0034)
(0035)
(0036) //模拟比较中断函数
(0037) #pragma interrupt_handler ana_comp_isr:17
(0038) void ana_comp_isr(void)
(0039) {
(0040) DelayUS(10);
007B E00A LDI R16,0xA
007C E010 LDI R17,0
007D DFCD RCALL _DelayUS
(0041)
(0042) if (ACSR&(1<<ACO)) //检测ACO
007E 9B45 SBIS 0x08,5
007F C002 RJMP 0x0082
(0043)
(0044) LED_on; //如果LED亮
0080 98D8 CBI 0x1B,0
0081 C001 RJMP 0x0083
(0045)
(0046) else
(0047)
(0048) LED_off; //否则 LED灭
0082 9AD8 SBI 0x1B,0
(0049)
(0050) DelayMS(200); //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到
0083 EC08 LDI R16,0xC8
0084 E010 LDI R17,0
0085 DFCE RCALL _DelayMS
0086 940E00CE CALL pop_lset
0088 9518 RETI
(0051)
(0052) //通过判断ACO位来知道比较结果
(0053) }
(0054)
(0055)
(0056) void init_devices(void)
(0057) {
(0058) CLI(); //禁止所有中断
_init_devices:
0089 94F8 BCLR 7
(0059) MCUCR = 0x00;//INT0、INT1中断触发方式
008A 2422 CLR R2
008B BE25 OUT 0x35,R2
(0060) MCUCSR = 0x80;//禁止JTAG
008C E880 LDI R24,0x80
008D BF84 OUT 0x34,R24
(0061) GICR = 0x00;//外部中断使能
008E BE2B OUT 0x3B,R2
(0062) port_init();
008F DFDA RCALL _port_init
(0063) comparator_init();
0090 DFE4 RCALL _comparator_init
(0064) SEI();//开全局中断
0091 9478 BSET 7
0092 9508 RET
(0065) }
(0066) //主函数
(0067) void main(void)
(0068) {
(0069) init_devices();
_main:
0093 DFF5 RCALL _init_devices
0094 C001 RJMP 0x0096
(0070) //在这继续添加你的代码
(0071) while(1)
(0072) {
(0073) NOP();
FILE: <library>
0095 0000 NOP
0096 CFFE RJMP 0x0095
0097 9508 RET
push_gset5:
0098 92FA ST R15,-Y
0099 92EA ST R14,-Y
push_gset4:
009A 92DA ST R13,-Y
009B 92CA ST R12,-Y
push_gset3:
009C 92BA ST R11,-Y
009D 92AA ST R10,-Y
push_gset2:
009E 937A ST R23,-Y
009F 936A ST R22,-Y
push_gset1:
00A0 935A ST R21,-Y
00A1 934A ST R20,-Y
00A2 9508 RET
pop_gset1:
00A3 E0E1 LDI R30,1
pop:
00A4 9149 LD R20,Y+
00A5 9159 LD R21,Y+
00A6 FDE0 SBRC R30,0
00A7 9508 RET
00A8 9169 LD R22,Y+
00A9 9179 LD R23,Y+
00AA FDE1 SBRC R30,1
00AB 9508 RET
00AC 90A9 LD R10,Y+
00AD 90B9 LD R11,Y+
00AE FDE2 SBRC R30,2
00AF 9508 RET
00B0 90C9 LD R12,Y+
00B1 90D9 LD R13,Y+
00B2 FDE3 SBRC R30,3
00B3 9508 RET
00B4 90E9 LD R14,Y+
00B5 90F9 LD R15,Y+
00B6 9508 RET
push_lset:
00B7 93FA ST R31,-Y
00B8 93EA ST R30,-Y
00B9 93BA ST R27,-Y
00BA 93AA ST R26,-Y
00BB 939A ST R25,-Y
00BC 938A ST R24,-Y
00BD 933A ST R19,-Y
00BE 932A ST R18,-Y
00BF 931A ST R17,-Y
00C0 930A ST R16,-Y
00C1 929A ST R9,-Y
00C2 928A ST R8,-Y
00C3 927A ST R7,-Y
00C4 926A ST R6,-Y
00C5 925A ST R5,-Y
00C6 924A ST R4,-Y
00C7 923A ST R3,-Y
00C8 922A ST R2,-Y
00C9 921A ST R1,-Y
00CA 920A ST R0,-Y
00CB B60F IN R0,0x3F
00CC 920A ST R0,-Y
00CD 9508 RET
pop_lset:
00CE 9009 LD R0,Y+
00CF BE0F OUT 0x3F,R0
00D0 9009 LD R0,Y+
00D1 9019 LD R1,Y+
00D2 9029 LD R2,Y+
00D3 9039 LD R3,Y+
00D4 9049 LD R4,Y+
00D5 9059 LD R5,Y+
00D6 9069 LD R6,Y+
00D7 9079 LD R7,Y+
00D8 9089 LD R8,Y+
00D9 9099 LD R9,Y+
00DA 9109 LD R16,Y+
00DB 9119 LD R17,Y+
00DC 9129 LD R18,Y+
00DD 9139 LD R19,Y+
00DE 9189 LD R24,Y+
00DF 9199 LD R25,Y+
00E0 91A9 LD R26,Y+
00E1 91B9 LD R27,Y+
00E2 91E9 LD R30,Y+
00E3 91F9 LD R31,Y+
00E4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -