📄 laserbeam.s
字号:
.module LaserBeam.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~2\hb\MYDOCU~1\电子窗户防盗网\单片机程序1.1\LaserBeam.c
.dbfunc e DelayUs _DelayUs fV
; a -> R20,R21
; t -> R16,R17
.even
_DelayUs::
rcall push_gset1
.dbline -1
.dbline 12
; /*
; 电子窗户防盗网
; main.c
; 硬件:CA-M8
; 时钟:1MHz
; */
;
; #include <io8515v.h>
; #include <macros.h>
;
; void DelayUs(unsigned int t)
; {
.dbline 14
ldi R20,1
ldi R21,0
rjmp L5
L2:
.dbline 14
.dbline 14
.dbline 14
L3:
.dbline 14
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 14
; int a;
; for (a = 1; a<t; a++){;}
cp R20,R16
cpc R21,R17
brlo L2
.dbline -2
.dbline 15
; }
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r a 20 I
.dbsym r t 16 i
.dbend
.dbfunc e DelayMs _DelayMs fV
; a -> R20,R21
; b -> R22,R23
; t -> R16,R17
.even
_DelayMs::
rcall push_gset2
.dbline -1
.dbline 18
;
; void DelayMs(unsigned int t)
; {
.dbline 20
ldi R20,1
ldi R21,0
rjmp L10
L7:
.dbline 20
; int a, b;
; for (a = 1; a<t; a++){
.dbline 21
ldi R22,1
ldi R23,0
L11:
.dbline 21
.dbline 21
.dbline 21
L12:
.dbline 21
subi R22,255 ; offset = 1
sbci R23,255
.dbline 21
cpi R22,150
ldi R30,0
cpc R23,R30
brlt L11
.dbline 22
L8:
.dbline 20
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 20
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
.dbline 23
; for (b = 1; b<150; b++){;}
; }
; }
L6:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r a 20 I
.dbsym r b 22 I
.dbsym r t 16 i
.dbend
.dbfunc e main _main fV
; Alarm2_Time -> y+6
; Alarm1_Time -> y+4
; Alarm2_triggered -> y+2
; Time_Alarm -> R14,R15
; Alarm1_triggered -> y+0
; d -> R20
; b -> R22
; i -> R10
; a -> R12
.even
_main::
sbiw R28,8
.dbline -1
.dbline 26
;
; void main()
; {
.dbline 31
; unsigned char i,a,b,d;
; int Alarm1_triggered,Alarm2_triggered;
; int Time_Alarm,Alarm1_Time,Alarm2_Time;
;
; Alarm1_triggered =0; //警报1触发标记,没有触发为0,触发为1
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 32
; Alarm2_triggered =0; //警报2触发标记,没有触发为0,触发为1
std y+3,R1
std y+2,R0
.dbline 33
; Alarm1_Time = 30; //第一级(低音)报警时间(毫秒)
ldi R24,30
ldi R25,0
std y+5,R25
std y+4,R24
.dbline 34
; Alarm2_Time = 40; //第二级(高音)报警时间(毫秒)
ldi R24,40
std y+7,R25
std y+6,R24
.dbline 35
; DDRC = 0xFF; //整个C口设置为输出
ldi R24,255
out 0x14,R24
.dbline 36
; PORTC =0; //C口输出为0
clr R2
out 0x15,R2
rjmp L17
L16:
.dbline 37
; while (1){
.dbline 38
; if((Alarm1_triggered==0) && (Alarm2_triggered==0)){
ldd R0,y+0
ldd R1,y+1
tst R0
breq X4
rjmp L19
X4:
tst R1
breq X5
rjmp L19
X5:
X0:
ldd R0,y+2
ldd R1,y+3
tst R0
breq X6
rjmp L19
X6:
tst R1
breq X7
rjmp L19
X7:
X1:
.dbline 38
.dbline 39
; DDRD = 0; // 整个D口设置为输入
clr R2
out 0x11,R2
.dbline 40
; PORTD =0xFF; // D口上拉电阻全部有效
ldi R24,255
out 0x12,R24
.dbline 41
; PORTC = PORTC & (~1); // C口第3脚C1输出低电平
cbi 0x15,0
.dbline 42
; PORTC = PORTC | 2; // C口第2脚C2输出高电平
sbi 0x15,1
.dbline 43
; a =1;
clr R12
inc R12
.dbline 44
clr R10
rjmp L24
L21:
.dbline 44
; for(i = 0; i < 8; i++){
.dbline 45
; DDRB = a; // B口第i脚设置为输出
out 0x17,R12
.dbline 46
; PORTB = 0xFF; // B口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
ldi R24,255
out 0x18,R24
.dbline 47
; DelayUs(50); // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
ldi R16,50
ldi R17,0
rcall _DelayUs
.dbline 48
; b = PINB;
in R22,0x16
.dbline 49
; d = ~PIND;
in R20,0x10
com R20
.dbline 50
cp R20,R12
brne L27
cpi R22,255
breq L25
L27:
.dbline 50
; if((d!=a) || (b!=0xFF)){ //如果没有报警发生,并且产生了警情,就输出报警信号
.dbline 51
; Alarm1_triggered =1; //标记产生了警情
ldi R24,1
ldi R25,0
std y+1,R25
std y+0,R24
.dbline 52
; Time_Alarm =0; //报警计时器清0
clr R14
clr R15
.dbline 53
; PORTC = PORTC | BIT(3); //触发第一级报警
sbi 0x15,3
.dbline 54
; goto AlarmStatus;
rjmp L28
L25:
.dbline 56
lsl R12
.dbline 57
L22:
.dbline 44
inc R10
L24:
.dbline 44
mov R24,R10
cpi R24,8
brlo L21
.dbline 59
; }
; a = a<<1;
; }
;
; DDRB = 0; // 整个B口设置为输入
clr R2
out 0x17,R2
.dbline 60
; PORTB =0xFF; // B口上拉电阻全部有效
ldi R24,255
out 0x18,R24
.dbline 61
; PORTC = PORTC & (~2); // C口第2脚C1输出低电平
cbi 0x15,1
.dbline 62
; PORTC = PORTC | 1; // C口第3脚C2输出高电平
sbi 0x15,0
.dbline 63
; a = 1;
clr R12
inc R12
.dbline 64
clr R10
rjmp L32
L29:
.dbline 64
; for(i = 0; i < 8; i++){
.dbline 65
; DDRD = a; // D口第i脚设置为输出
out 0x11,R12
.dbline 66
; PORTD = 0xFF; // D口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
ldi R24,255
out 0x12,R24
.dbline 67
; DelayUs(50); // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
ldi R16,50
ldi R17,0
rcall _DelayUs
.dbline 68
; b = ~PINB;
in R22,0x16
com R22
.dbline 69
; d = PIND;
in R20,0x10
.dbline 70
cp R22,R12
brne L35
cpi R20,255
breq L33
L35:
.dbline 70
; if((b!=a) || (d!=0xFF)){ //如果没有报警发生,并且产生了警情,就输出报警信号
.dbline 71
; Alarm1_triggered =1; //标记产生了警情
ldi R24,1
ldi R25,0
std y+1,R25
std y+0,R24
.dbline 72
; Time_Alarm =0; //报警计时器清0
clr R14
clr R15
.dbline 73
; PORTC = PORTC | BIT(3); //触发第一级报警
sbi 0x15,3
.dbline 74
; goto AlarmStatus;
rjmp L28
L33:
.dbline 76
lsl R12
.dbline 77
L30:
.dbline 64
inc R10
L32:
.dbline 64
mov R24,R10
cpi R24,8
brlo L29
.dbline 78
; }
; a = a<<1;
; }
; }
L19:
L28:
.dbline 80
ldd R24,y+0
ldd R25,y+1
cpi R24,1
ldi R30,0
cpc R25,R30
breq L38
ldd R24,y+2
ldd R25,y+3
cpi R24,1
ldi R30,0
cpc R25,R30
brne L36
L38:
.dbline 80
; AlarmStatus:
; if((Alarm1_triggered ==1) || (Alarm2_triggered ==1)){
.dbline 81
; Time_Alarm = Time_Alarm+1; //报警时间计时
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 82
; DelayMs(100); //延时100毫秒
ldi R16,100
ldi R17,0
rcall _DelayMs
.dbline 83
; if((Time_Alarm>Alarm1_Time) && (Alarm2_triggered ==0)){ //触发第二级报警
ldd R0,y+4
ldd R1,y+5
cp R0,R14
cpc R1,R15
brge L39
ldd R0,y+2
ldd R1,y+3
tst R0
brne L39
tst R1
brne L39
X2:
.dbline 83
.dbline 84
; Alarm1_triggered =0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 85
; Alarm2_triggered =1;
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
.dbline 86
; PORTC = PORTC & (~BIT(3)); //第一级报警时间到了,报警关闭(电话铃声)
cbi 0x15,3
.dbline 87
; PORTC = PORTC | BIT(4); //接通第二级报警
sbi 0x15,4
.dbline 88
; }
L39:
.dbline 89
; if(Time_Alarm>(Alarm1_Time+Alarm2_Time)){
ldd R2,y+4
ldd R3,y+5
ldd R0,y+6
ldd R1,y+7
add R2,R0
adc R3,R1
cp R2,R14
cpc R3,R15
brge L41
.dbline 89
.dbline 90
; Alarm2_triggered =0; //清除报警标记,停止报警
clr R0
clr R1
std y+3,R1
std y+2,R0
.dbline 91
; PORTC = PORTC & (~BIT(4)); //第二级报警(高音量)时间到了,报警关闭(高声喇叭报警)
cbi 0x15,4
.dbline 93
; //if(Time_Alarm>600)PORTC = PORTC | BIT(5); //接通第五脚进行报警(拨电话号码报警)
; }
L41:
.dbline 94
; }
L36:
.dbline 95
L17:
.dbline 37
rjmp L16
X3:
.dbline -2
.dbline 96
; }
; }
L15:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym l Alarm2_Time 6 I
.dbsym l Alarm1_Time 4 I
.dbsym l Alarm2_triggered 2 I
.dbsym r Time_Alarm 14 I
.dbsym l Alarm1_triggered 0 I
.dbsym r d 20 c
.dbsym r b 22 c
.dbsym r i 10 c
.dbsym r a 12 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -