📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile F:\USING0~1\LINEAN~1\main.c
.dbfunc e ReadPin _ReadPin fc
; i -> R16
.even
_ReadPin::
.dbline -1
.dbline 4
; #include "main.h"
;
; unsigned char ReadPin(void)
; {
.dbline 6
; unsigned char i;
; PORTC = 0XFF; //定义上拉电阻和设置高电平输出
ldi R24,255
out 0x15,R24
.dbline 7
; DDRC = 0X00; //为端口引脚定义方向
clr R2
out 0x14,R2
.dbline 8
; _NOP(); // 为了同步插入nop 指令
nop
.dbline 9
; i = PINC; // 读取端口引脚
in R16,0x13
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e car_turn _car_turn fV
; mes -> R20
.even
_car_turn::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 13
; }
;
; void car_turn(unsigned char mes)
; {
.dbline 14
; switch(mes)
clr R21
cpi R20,32
ldi R30,0
cpc R21,R30
brne X2
xjmp L17
X2:
ldi R24,32
ldi R25,0
cp R24,R20
cpc R25,R21
brge X3
xjmp L21
X3:
L20:
cpi R20,0
cpc R20,R21
brne X4
xjmp L6
X4:
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
brne X5
xjmp L7
X5:
cpi R20,2
ldi R30,0
cpc R21,R30
brne X6
xjmp L8
X6:
cpi R20,3
ldi R30,0
cpc R21,R30
brne X7
xjmp L9
X7:
cpi R20,4
ldi R30,0
cpc R21,R30
brne X8
xjmp L10
X8:
cpi R20,5
ldi R30,0
cpc R21,R30
brne X9
xjmp L11
X9:
cpi R20,6
ldi R30,0
cpc R21,R30
brne X10
xjmp L12
X10:
cpi R20,7
ldi R30,0
cpc R21,R30
brne X11
xjmp L13
X11:
cpi R20,8
ldi R30,0
cpc R21,R30
brne X12
xjmp L18
X12:
cpi R20,0
ldi R30,0
cpc R21,R30
brge X13
xjmp L3
X13:
L22:
cpi R20,24
ldi R30,0
cpc R21,R30
brne X14
xjmp L16
X14:
xjmp L3
L21:
cpi R20,48
ldi R30,0
cpc R21,R30
brne X15
xjmp L14
X15:
ldi R24,48
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L24
L23:
cpi R20,40
ldi R30,0
cpc R21,R30
brne X16
xjmp L15
X16:
xjmp L3
L24:
cpi R20,56
ldi R30,0
cpc R21,R30
brne X17
xjmp L19
X17:
xjmp L3
X1:
.dbline 15
; {
L6:
.dbline 18
; /**************************以下为检测障碍物时的执行函数************************************/
;
; case 0x00: forward(); break;
xcall _forward
.dbline 18
xjmp L4
L7:
.dbline 20
;
; case 0x01: {
.dbline 21
; back_left();
xcall _back_left
.dbline 22
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 23
; for_right();
xcall _for_right
.dbline 24
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 26
;
; }; break;
.dbline 26
.dbline 26
xjmp L4
L8:
.dbline 28
;
; case 0x02: {
.dbline 29
; backward();
xcall _backward
.dbline 30
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 31
; for_left();
xcall _for_left
.dbline 32
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 33
; }; break;
.dbline 33
.dbline 33
xjmp L4
L9:
.dbline 36
;
;
; case 0x03: {
.dbline 37
; back_left();
xcall _back_left
.dbline 38
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 39
; for_right();
xcall _for_right
.dbline 40
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 42
;
; }; break;
.dbline 42
.dbline 42
xjmp L4
L10:
.dbline 44
;
; case 0x04: {
.dbline 45
; back_right();
xcall _back_right
.dbline 46
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 47
; for_left();
xcall _for_left
.dbline 48
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 50
;
; }; break;
.dbline 50
.dbline 50
xjmp L4
L11:
.dbline 52
;
; case 0x05: forward(); break;
xcall _forward
.dbline 52
xjmp L4
L12:
.dbline 54
;
; case 0x06: {
.dbline 55
; back_right();
xcall _back_right
.dbline 56
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 57
; for_left();
xcall _for_left
.dbline 58
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 60
;
; }; break;
.dbline 60
.dbline 60
xjmp L4
L13:
.dbline 62
;
; case 0x07: {
.dbline 63
; backward();
xcall _backward
.dbline 64
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 65
; for_left();
xcall _for_left
.dbline 66
; delay(1000);
ldi R16,1000
ldi R17,3
xcall _delay
.dbline 67
; }; break;
.dbline 67
.dbline 67
xjmp L4
L14:
.dbline 71
;
; /**************************以下为检测黑线时的执行函数************************************/
;
; case 0x30: for_left(); break;
xcall _for_left
.dbline 71
xjmp L4
L15:
.dbline 73
;
; case 0x28: forward(); break;
xcall _forward
.dbline 73
xjmp L4
L16:
.dbline 75
;
; case 0x18: for_right(); break;
xcall _for_right
.dbline 75
xjmp L4
L17:
.dbline 77
;
; case 0x20: for_left(); break;
xcall _for_left
.dbline 77
xjmp L4
L18:
.dbline 79
;
; case 0x08: for_right(); break;
xcall _for_right
.dbline 79
xjmp L4
L19:
.dbline 81
;
; case 0x38: backward(); break;
xcall _backward
.dbline 81
xjmp L4
L3:
.dbline 83
xcall _forward
.dbline 83
L4:
.dbline -2
L2:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r mes 20 c
.dbend
.dbfunc e main _main fV
; mesg -> R20
; mesc -> R22
; pin -> R10
.even
_main::
sbiw R28,2
.dbline -1
.dbline 91
;
; default: forward(); break;
;
;
; }
; }
;
;
; void main()
; {
.dbline 94
; unsigned char mesg,mesc;
; unsigned char pin;
; init_lcd(); //初始化液晶
xcall _init_lcd
.dbline 95
; LCD_write_string(0,0,"auto car"); //显示信息
ldi R24,<L26
ldi R25,>L26
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_string
.dbline 96
; LCD_write_string(0,1,"ATMega 16");
ldi R24,<L27
ldi R25,>L27
std y+1,R25
std y+0,R24
ldi R18,1
clr R16
xcall _LCD_write_string
xjmp L29
L28:
.dbline 99
;
; while(1)
; {
.dbline 100
; pin = 0x00; //初始化引脚信息
clr R10
.dbline 101
; mesg = 0x00;
clr R20
.dbline 102
; mesc = 0x00;
clr R22
.dbline 103
; pin = ReadPin(); //读取引脚信息
xcall _ReadPin
mov R10,R16
.dbline 104
; mesc|= pin&0x07; //屏蔽光电传感器干扰,检测障碍物
mov R24,R10
andi R24,7
or R22,R24
.dbline 105
; mesg|= pin&0x38; //屏蔽超声波干扰,检测黑线
mov R24,R10
andi R24,56
or R20,R24
.dbline 106
; if(mesc)
tst R22
breq L31
.dbline 107
; car_turn(mesc);
mov R16,R22
xcall _car_turn
xjmp L32
L31:
.dbline 109
; else
; car_turn(mesg);
mov R16,R20
xcall _car_turn
L32:
.dbline 110
L29:
.dbline 98
xjmp L28
X18:
.dbline -2
L25:
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r mesg 20 c
.dbsym r mesc 22 c
.dbsym r pin 10 c
.dbend
.area data(ram, con, rel)
.dbfile F:\USING0~1\LINEAN~1\main.c
L27:
.blkb 10
.area idata
.byte 'A,'T,'M,'e,'g,'a,32,49,54,0
.area data(ram, con, rel)
.dbfile F:\USING0~1\LINEAN~1\main.c
L26:
.blkb 9
.area idata
.byte 'a,'u,'t,'o,32,'c,'a,'r,0
.area data(ram, con, rel)
.dbfile F:\USING0~1\LINEAN~1\main.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -