📄 laser.lst
字号:
__start:
__text_start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E0 CPI R30,0x60
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D01F RCALL _main
_exit:
0032 CFFF RJMP _exit
_DelayUs:
a --> R20
t --> R16
0033 D0C2 RCALL push_gset1
FILE: C:\DOCUME~2\hb\MYDOCU~1\电子窗户防盗网\单片机程序1.1\LaserBeam.c
(0001) /*
(0002) 电子窗户防盗网
(0003) main.c
(0004) 硬件:CA-M8
(0005) 时钟:1MHz
(0006) */
(0007)
(0008) #include <io8515v.h>
(0009) #include <macros.h>
(0010)
(0011) void DelayUs(unsigned int t)
(0012) {
(0013) int a;
(0014) for (a = 1; a<t; a++){;}
0034 E041 LDI R20,1
0035 E050 LDI R21,0
0036 C002 RJMP 0x0039
0037 5F4F SUBI R20,0xFF
0038 4F5F SBCI R21,0xFF
0039 1740 CP R20,R16
003A 0751 CPC R21,R17
003B F3D8 BCS 0x0037
(0015) }
003C D0BC RCALL pop_gset1
003D 9508 RET
_DelayMs:
a --> R20
b --> R22
t --> R16
003E D0CE RCALL push_gset2
(0016)
(0017) void DelayMs(unsigned int t)
(0018) {
(0019) int a, b;
(0020) for (a = 1; a<t; a++){
003F E041 LDI R20,1
0040 E050 LDI R21,0
0041 C00A RJMP 0x004C
(0021) for (b = 1; b<150; b++){;}
0042 E061 LDI R22,1
0043 E070 LDI R23,0
0044 5F6F SUBI R22,0xFF
0045 4F7F SBCI R23,0xFF
0046 3966 CPI R22,0x96
0047 E0E0 LDI R30,0
0048 077E CPC R23,R30
0049 F3D4 BLT 0x0044
004A 5F4F SUBI R20,0xFF
004B 4F5F SBCI R21,0xFF
004C 1740 CP R20,R16
004D 0751 CPC R21,R17
004E F398 BCS 0x0042
(0022) }
(0023) }
004F D0A4 RCALL pop_gset2
0050 9508 RET
_main:
Alarm2_Time --> Y+6
Alarm1_Time --> Y+4
Alarm2_triggered --> Y+2
Time_Alarm --> R14
Alarm1_triggered --> Y+0
d --> R20
b --> R22
i --> R10
a --> R12
0051 9728 SBIW R28,0x8
(0024)
(0025) void main()
(0026) {
(0027) unsigned char i,a,b,d;
(0028) int Alarm1_triggered,Alarm2_triggered;
(0029) int Time_Alarm,Alarm1_Time,Alarm2_Time;
(0030)
(0031) Alarm1_triggered =0; //警报1触发标记,没有触发为0,触发为1
0052 2400 CLR R0
0053 2411 CLR R1
0054 8219 STD Y+1,R1
0055 8208 STD Y+0,R0
(0032) Alarm2_triggered =0; //警报2触发标记,没有触发为0,触发为1
0056 821B STD Y+3,R1
0057 820A STD Y+2,R0
(0033) Alarm1_Time = 30; //第一级(低音)报警时间(毫秒)
0058 E18E LDI R24,0x1E
0059 E090 LDI R25,0
005A 839D STD Y+5,R25
005B 838C STD Y+4,R24
(0034) Alarm2_Time = 40; //第二级(高音)报警时间(毫秒)
005C E288 LDI R24,0x28
005D 839F STD Y+7,R25
005E 838E STD Y+6,R24
(0035) DDRC = 0xFF; //整个C口设置为输出
005F EF8F LDI R24,0xFF
0060 BB84 OUT 0x14,R24
(0036) PORTC =0; //C口输出为0
0061 2422 CLR R2
0062 BA25 OUT 0x15,R2
0063 C08D RJMP 0x00F1
(0037) while (1){
(0038) if((Alarm1_triggered==0) && (Alarm2_triggered==0)){
0064 8008 LDD R0,Y+0
0065 8019 LDD R1,Y+1
0066 2000 TST R0
0067 F009 BEQ 0x0069
0068 C053 RJMP 0x00BC
0069 2011 TST R1
006A F009 BEQ 0x006C
006B C050 RJMP 0x00BC
006C 800A LDD R0,Y+2
006D 801B LDD R1,Y+3
006E 2000 TST R0
006F F009 BEQ 0x0071
0070 C04B RJMP 0x00BC
0071 2011 TST R1
0072 F009 BEQ 0x0074
0073 C048 RJMP 0x00BC
(0039) DDRD = 0; // 整个D口设置为输入
0074 2422 CLR R2
0075 BA21 OUT 0x11,R2
(0040) PORTD =0xFF; // D口上拉电阻全部有效
0076 EF8F LDI R24,0xFF
0077 BB82 OUT 0x12,R24
(0041) PORTC = PORTC & (~1); // C口第3脚C1输出低电平
0078 98A8 CBI 0x15,0
(0042) PORTC = PORTC | 2; // C口第2脚C2输出高电平
0079 9AA9 SBI 0x15,1
(0043) a =1;
007A 24CC CLR R12
007B 94C3 INC R12
(0044) for(i = 0; i < 8; i++){
007C 24AA CLR R10
007D C017 RJMP 0x0095
(0045) DDRB = a; // B口第i脚设置为输出
007E BAC7 OUT 0x17,R12
(0046) PORTB = 0xFF; // B口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
007F EF8F LDI R24,0xFF
0080 BB88 OUT 0x18,R24
(0047) DelayUs(50); // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
0081 E302 LDI R16,0x32
0082 E010 LDI R17,0
0083 DFAF RCALL _DelayUs
(0048) b = PINB;
0084 B366 IN R22,0x16
(0049) d = ~PIND;
0085 B340 IN R20,0x10
0086 9540 COM R20
(0050) if((d!=a) || (b!=0xFF)){ //如果没有报警发生,并且产生了警情,就输出报警信号
0087 154C CP R20,R12
0088 F411 BNE 0x008B
0089 3F6F CPI R22,0xFF
008A F041 BEQ 0x0093
(0051) Alarm1_triggered =1; //标记产生了警情
008B E081 LDI R24,1
008C E090 LDI R25,0
008D 8399 STD Y+1,R25
008E 8388 STD Y+0,R24
(0052) Time_Alarm =0; //报警计时器清0
008F 24EE CLR R14
0090 24FF CLR R15
(0053) PORTC = PORTC | BIT(3); //触发第一级报警
0091 9AAB SBI 0x15,3
(0054) goto AlarmStatus;
0092 C029 RJMP 0x00BC
(0055) }
(0056) a = a<<1;
0093 0CCC LSL R12
0094 94A3 INC R10
0095 2D8A MOV R24,R10
0096 3088 CPI R24,0x8
0097 F330 BCS 0x007E
(0057) }
(0058)
(0059) DDRB = 0; // 整个B口设置为输入
0098 2422 CLR R2
0099 BA27 OUT 0x17,R2
(0060) PORTB =0xFF; // B口上拉电阻全部有效
009A EF8F LDI R24,0xFF
009B BB88 OUT 0x18,R24
(0061) PORTC = PORTC & (~2); // C口第2脚C1输出低电平
009C 98A9 CBI 0x15,1
(0062) PORTC = PORTC | 1; // C口第3脚C2输出高电平
009D 9AA8 SBI 0x15,0
(0063) a = 1;
009E 24CC CLR R12
009F 94C3 INC R12
(0064) for(i = 0; i < 8; i++){
00A0 24AA CLR R10
00A1 C017 RJMP 0x00B9
(0065) DDRD = a; // D口第i脚设置为输出
00A2 BAC1 OUT 0x11,R12
(0066) PORTD = 0xFF; // D口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
00A3 EF8F LDI R24,0xFF
00A4 BB82 OUT 0x12,R24
(0067) DelayUs(50); // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
00A5 E302 LDI R16,0x32
00A6 E010 LDI R17,0
00A7 DF8B RCALL _DelayUs
(0068) b = ~PINB;
00A8 B366 IN R22,0x16
00A9 9560 COM R22
(0069) d = PIND;
00AA B340 IN R20,0x10
(0070) if((b!=a) || (d!=0xFF)){ //如果没有报警发生,并且产生了警情,就输出报警信号
00AB 156C CP R22,R12
00AC F411 BNE 0x00AF
00AD 3F4F CPI R20,0xFF
00AE F041 BEQ 0x00B7
(0071) Alarm1_triggered =1; //标记产生了警情
00AF E081 LDI R24,1
00B0 E090 LDI R25,0
00B1 8399 STD Y+1,R25
00B2 8388 STD Y+0,R24
(0072) Time_Alarm =0; //报警计时器清0
00B3 24EE CLR R14
00B4 24FF CLR R15
(0073) PORTC = PORTC | BIT(3); //触发第一级报警
00B5 9AAB SBI 0x15,3
(0074) goto AlarmStatus;
00B6 C005 RJMP 0x00BC
(0075) }
(0076) a = a<<1;
00B7 0CCC LSL R12
00B8 94A3 INC R10
00B9 2D8A MOV R24,R10
00BA 3088 CPI R24,0x8
00BB F330 BCS 0x00A2
(0077) }
(0078) }
(0079) AlarmStatus:
(0080) if((Alarm1_triggered ==1) || (Alarm2_triggered ==1)){
00BC 8188 LDD R24,Y+0
00BD 8199 LDD R25,Y+1
00BE 3081 CPI R24,1
00BF E0E0 LDI R30,0
00C0 079E CPC R25,R30
00C1 F031 BEQ 0x00C8
00C2 818A LDD R24,Y+2
00C3 819B LDD R25,Y+3
00C4 3081 CPI R24,1
00C5 E0E0 LDI R30,0
00C6 079E CPC R25,R30
00C7 F549 BNE 0x00F1
(0081) Time_Alarm = Time_Alarm+1; //报警时间计时
00C8 01C7 MOVW R24,R14
00C9 9601 ADIW R24,1
00CA 017C MOVW R14,R24
(0082) DelayMs(100); //延时100毫秒
00CB E604 LDI R16,0x64
00CC E010 LDI R17,0
00CD DF70 RCALL _DelayMs
(0083) if((Time_Alarm>Alarm1_Time) && (Alarm2_triggered ==0)){ //触发第二级报警
00CE 800C LDD R0,Y+4
00CF 801D LDD R1,Y+5
00D0 140E CP R0,R14
00D1 041F CPC R1,R15
00D2 F484 BGE 0x00E3
00D3 800A LDD R0,Y+2
00D4 801B LDD R1,Y+3
00D5 2000 TST R0
00D6 F461 BNE 0x00E3
00D7 2011 TST R1
00D8 F451 BNE 0x00E3
(0084) Alarm1_triggered =0;
00D9 2400 CLR R0
00DA 2411 CLR R1
00DB 8219 STD Y+1,R1
00DC 8208 STD Y+0,R0
(0085) Alarm2_triggered =1;
00DD E081 LDI R24,1
00DE E090 LDI R25,0
00DF 839B STD Y+3,R25
00E0 838A STD Y+2,R24
(0086) PORTC = PORTC & (~BIT(3)); //第一级报警时间到了,报警关闭(电话铃声)
00E1 98AB CBI 0x15,3
(0087) PORTC = PORTC | BIT(4); //接通第二级报警
00E2 9AAC SBI 0x15,4
(0088) }
(0089) if(Time_Alarm>(Alarm1_Time+Alarm2_Time)){
00E3 802C LDD R2,Y+4
00E4 803D LDD R3,Y+5
00E5 800E LDD R0,Y+6
00E6 801F LDD R1,Y+7
00E7 0C20 ADD R2,R0
00E8 1C31 ADC R3,R1
00E9 142E CP R2,R14
00EA 043F CPC R3,R15
00EB F42C BGE 0x00F1
(0090) Alarm2_triggered =0; //清除报警标记,停止报警
00EC 2400 CLR R0
00ED 2411 CLR R1
00EE 821B STD Y+3,R1
00EF 820A STD Y+2,R0
(0091) PORTC = PORTC & (~BIT(4)); //第二级报警(高音量)时间到了,报警关闭(高声喇叭报警)
00F0 98AC CBI 0x15,4
00F1 CF72 RJMP 0x0064
(0092) //if(Time_Alarm>600)PORTC = PORTC | BIT(5); //接通第五脚进行报警(拨电话号码报警)
(0093) }
(0094) }
(0095) }
(0096) }
FILE: <library>
00F2 9628 ADIW R28,0x8
00F3 9508 RET
pop_gset2:
00F4 E0E2 LDI R30,2
00F5 C004 RJMP pop
push_gset1:
00F6 935A ST R21,-Y
00F7 934A ST R20,-Y
00F8 9508 RET
pop_gset1:
00F9 E0E1 LDI R30,1
pop:
00FA 9149 LD R20,Y+
00FB 9159 LD R21,Y+
00FC FDE0 SBRC R30,0
00FD 9508 RET
00FE 9169 LD R22,Y+
00FF 9179 LD R23,Y+
0100 FDE1 SBRC R30,1
0101 9508 RET
0102 90A9 LD R10,Y+
0103 90B9 LD R11,Y+
0104 FDE2 SBRC R30,2
0105 9508 RET
0106 90C9 LD R12,Y+
0107 90D9 LD R13,Y+
0108 FDE3 SBRC R30,3
0109 9508 RET
010A 90E9 LD R14,Y+
010B 90F9 LD R15,Y+
010C 9508 RET
push_gset2:
010D 937A ST R23,-Y
010E 936A ST R22,-Y
010F CFE6 RJMP push_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -