📄 lineturn.lst
字号:
010E 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
010F 940E0226 CALL push_gset2
0111 2F62 MOV R22,R18
0112 2F40 MOV R20,R16
(0124) }
(0125)
(0126) }
(0127)
(0128) void LCD_write_char(uchar X,uchar Y,uchar data) //列x=0~15,行y=0,1
(0129) {
(0130) LCD_set_xy( X, Y ); //写地址
0113 2F26 MOV R18,R22
0114 2F04 MOV R16,R20
0115 DFD3 RCALL _LCD_set_xy
(0131) LCD_write_data( data);
0116 810C LDD R16,Y+4
0117 DFB1 RCALL _LCD_write_data
0118 940E021A CALL pop_gset2
011A 9508 RET
(0132)
(0133) }
(0134)
(0135) void init_lcd(void)
(0136) {
(0137) CLI(); //禁止所有中断
_init_lcd:
011B 94F8 BCLR 7
(0138) LCD_init();
011C DF71 RCALL _LCD_init
(0139) MCUCR = 0x00;
011D 2422 CLR R2
011E BE25 OUT 0x35,R2
(0140) GICR = 0x00;
011F BE2B OUT 0x3B,R2
(0141) TIMSK = 0x00;
0120 BE29 OUT 0x39,R2
(0142) SEI(); //重新开启所有中断
0121 9478 BSET 7
0122 9508 RET
FILE: F:\USING0~1\LINEAN~1\main.c
(0001) #include "main.h"
(0002)
(0003) unsigned char ReadPin(void)
(0004) {
(0005) unsigned char i;
(0006) PORTC = 0XFF; //定义上拉电阻和设置高电平输出
_ReadPin:
i --> R16
0123 EF8F LDI R24,0xFF
0124 BB85 OUT 0x15,R24
(0007) DDRC = 0X00; //为端口引脚定义方向
0125 2422 CLR R2
0126 BA24 OUT 0x14,R2
(0008) _NOP(); // 为了同步插入nop 指令
0127 0000 NOP
(0009) i = PINC; // 读取端口引脚
0128 B303 IN R16,0x13
0129 9508 RET
_car_turn:
mes --> R20
012A 940E0228 CALL push_gset1
012C 2F40 MOV R20,R16
(0010) }
(0011)
(0012) void car_turn(unsigned char mes)
(0013) {
(0014) switch(mes)
012D 2755 CLR R21
012E 3240 CPI R20,0x20
012F E0E0 LDI R30,0
0130 075E CPC R21,R30
0131 F409 BNE 0x0133
0132 C0B0 RJMP 0x01E3
0133 E280 LDI R24,0x20
0134 E090 LDI R25,0
0135 1784 CP R24,R20
0136 0795 CPC R25,R21
0137 F40C BGE 0x0139
0138 C037 RJMP 0x0170
0139 3040 CPI R20,0
013A 0745 CPC R20,R21
013B F409 BNE 0x013D
013C C049 RJMP 0x0186
013D 3041 CPI R20,1
013E E0E0 LDI R30,0
013F 075E CPC R21,R30
0140 F409 BNE 0x0142
0141 C047 RJMP 0x0189
0142 3042 CPI R20,2
0143 E0E0 LDI R30,0
0144 075E CPC R21,R30
0145 F409 BNE 0x0147
0146 C04F RJMP 0x0196
0147 3043 CPI R20,3
0148 E0E0 LDI R30,0
0149 075E CPC R21,R30
014A F409 BNE 0x014C
014B C057 RJMP 0x01A3
014C 3044 CPI R20,4
014D E0E0 LDI R30,0
014E 075E CPC R21,R30
014F F409 BNE 0x0151
0150 C05F RJMP 0x01B0
0151 3045 CPI R20,5
0152 E0E0 LDI R30,0
0153 075E CPC R21,R30
0154 F409 BNE 0x0156
0155 C067 RJMP 0x01BD
0156 3046 CPI R20,6
0157 E0E0 LDI R30,0
0158 075E CPC R21,R30
0159 F409 BNE 0x015B
015A C065 RJMP 0x01C0
015B 3047 CPI R20,7
015C E0E0 LDI R30,0
015D 075E CPC R21,R30
015E F409 BNE 0x0160
015F C06D RJMP 0x01CD
0160 3048 CPI R20,0x8
0161 E0E0 LDI R30,0
0162 075E CPC R21,R30
0163 F409 BNE 0x0165
0164 C081 RJMP 0x01E6
0165 3040 CPI R20,0
0166 E0E0 LDI R30,0
0167 075E CPC R21,R30
0168 F40C BGE 0x016A
0169 C082 RJMP 0x01EC
016A 3148 CPI R20,0x18
016B E0E0 LDI R30,0
016C 075E CPC R21,R30
016D F409 BNE 0x016F
016E C071 RJMP 0x01E0
016F C07C RJMP 0x01EC
0170 3340 CPI R20,0x30
0171 E0E0 LDI R30,0
0172 075E CPC R21,R30
0173 F409 BNE 0x0175
0174 C065 RJMP 0x01DA
0175 E380 LDI R24,0x30
0176 E090 LDI R25,0
0177 1784 CP R24,R20
0178 0795 CPC R25,R21
0179 F034 BLT 0x0180
017A 3248 CPI R20,0x28
017B E0E0 LDI R30,0
017C 075E CPC R21,R30
017D F409 BNE 0x017F
017E C05E RJMP 0x01DD
017F C06C RJMP 0x01EC
0180 3348 CPI R20,0x38
0181 E0E0 LDI R30,0
0182 075E CPC R21,R30
0183 F409 BNE 0x0185
0184 C064 RJMP 0x01E9
0185 C066 RJMP 0x01EC
(0015) {
(0016) /**************************以下为检测障碍物时的执行函数************************************/
(0017)
(0018) case 0x00: forward(); break;
0186 940E0055 CALL _forward
0188 C065 RJMP 0x01EE
(0019)
(0020) case 0x01: {
(0021) back_left();
0189 940E0064 CALL _back_left
(0022) delay(1000);
018B EE08 LDI R16,0xE8
018C E013 LDI R17,3
018D 940E0078 CALL _delay
(0023) for_right();
018F 940E0069 CALL _for_right
(0024) delay(1000);
0191 EE08 LDI R16,0xE8
0192 E013 LDI R17,3
0193 940E0078 CALL _delay
(0025)
(0026) }; break;
0195 C058 RJMP 0x01EE
(0027)
(0028) case 0x02: {
(0029) backward();
0196 940E005A CALL _backward
(0030) delay(1000);
0198 EE08 LDI R16,0xE8
0199 E013 LDI R17,3
019A 940E0078 CALL _delay
(0031) for_left();
019C 940E005F CALL _for_left
(0032) delay(1000);
019E EE08 LDI R16,0xE8
019F E013 LDI R17,3
01A0 940E0078 CALL _delay
(0033) }; break;
01A2 C04B RJMP 0x01EE
(0034)
(0035)
(0036) case 0x03: {
(0037) back_left();
01A3 940E0064 CALL _back_left
(0038) delay(1000);
01A5 EE08 LDI R16,0xE8
01A6 E013 LDI R17,3
01A7 940E0078 CALL _delay
(0039) for_right();
01A9 940E0069 CALL _for_right
(0040) delay(1000);
01AB EE08 LDI R16,0xE8
01AC E013 LDI R17,3
01AD 940E0078 CALL _delay
(0041)
(0042) }; break;
01AF C03E RJMP 0x01EE
(0043)
(0044) case 0x04: {
(0045) back_right();
01B0 940E006E CALL _back_right
(0046) delay(1000);
01B2 EE08 LDI R16,0xE8
01B3 E013 LDI R17,3
01B4 940E0078 CALL _delay
(0047) for_left();
01B6 940E005F CALL _for_left
(0048) delay(1000);
01B8 EE08 LDI R16,0xE8
01B9 E013 LDI R17,3
01BA 940E0078 CALL _delay
(0049)
(0050) }; break;
01BC C031 RJMP 0x01EE
(0051)
(0052) case 0x05: forward(); break;
01BD 940E0055 CALL _forward
01BF C02E RJMP 0x01EE
(0053)
(0054) case 0x06: {
(0055) back_right();
01C0 940E006E CALL _back_right
(0056) delay(1000);
01C2 EE08 LDI R16,0xE8
01C3 E013 LDI R17,3
01C4 940E0078 CALL _delay
(0057) for_left();
01C6 940E005F CALL _for_left
(0058) delay(1000);
01C8 EE08 LDI R16,0xE8
01C9 E013 LDI R17,3
01CA 940E0078 CALL _delay
(0059)
(0060) }; break;
01CC C021 RJMP 0x01EE
(0061)
(0062) case 0x07: {
(0063) backward();
01CD 940E005A CALL _backward
(0064) delay(1000);
01CF EE08 LDI R16,0xE8
01D0 E013 LDI R17,3
01D1 940E0078 CALL _delay
(0065) for_left();
01D3 940E005F CALL _for_left
(0066) delay(1000);
01D5 EE08 LDI R16,0xE8
01D6 E013 LDI R17,3
01D7 940E0078 CALL _delay
(0067) }; break;
01D9 C014 RJMP 0x01EE
(0068)
(0069) /**************************以下为检测黑线时的执行函数************************************/
(0070)
(0071) case 0x30: for_left(); break;
01DA 940E005F CALL _for_left
01DC C011 RJMP 0x01EE
(0072)
(0073) case 0x28: forward(); break;
01DD 940E0055 CALL _forward
01DF C00E RJMP 0x01EE
(0074)
(0075) case 0x18: for_right(); break;
01E0 940E0069 CALL _for_right
01E2 C00B RJMP 0x01EE
(0076)
(0077) case 0x20: for_left(); break;
01E3 940E005F CALL _for_left
01E5 C008 RJMP 0x01EE
(0078)
(0079) case 0x08: for_right(); break;
01E6 940E0069 CALL _for_right
01E8 C005 RJMP 0x01EE
(0080)
(0081) case 0x38: backward(); break;
01E9 940E005A CALL _backward
01EB C002 RJMP 0x01EE
(0082)
(0083) default: forward(); break;
01EC 940E0055 CALL _forward
01EE 940E022B CALL pop_gset1
01F0 9508 RET
_main:
mesg --> R20
mesc --> R22
pin --> R10
01F1 9722 SBIW R28,2
(0084)
(0085)
(0086) }
(0087) }
(0088)
(0089)
(0090) void main()
(0091) {
(0092) unsigned char mesg,mesc;
(0093) unsigned char pin;
(0094) init_lcd(); //初始化液晶
01F2 940E011B CALL _init_lcd
(0095) LCD_write_string(0,0,"auto car"); //显示信息
01F4 E68A LDI R24,0x6A
01F5 E090 LDI R25,0
01F6 8399 STD Y+1,R25
01F7 8388 STD Y+0,R24
01F8 2722 CLR R18
01F9 2700 CLR R16
01FA 940E00F9 CALL _LCD_write_string
(0096) LCD_write_string(0,1,"ATMega 16");
01FC E680 LDI R24,0x60
01FD E090 LDI R25,0
01FE 8399 STD Y+1,R25
01FF 8388 STD Y+0,R24
0200 E021 LDI R18,1
0201 2700 CLR R16
0202 940E00F9 CALL _LCD_write_string
0204 C012 RJMP 0x0217
(0097)
(0098) while(1)
(0099) {
(0100) pin = 0x00; //初始化引脚信息
0205 24AA CLR R10
(0101) mesg = 0x00;
0206 2744 CLR R20
(0102) mesc = 0x00;
0207 2766 CLR R22
(0103) pin = ReadPin(); //读取引脚信息
0208 DF1A RCALL _ReadPin
0209 2EA0 MOV R10,R16
(0104) mesc|= pin&0x07; //屏蔽光电传感器干扰,检测障碍物
020A 2D8A MOV R24,R10
020B 7087 ANDI R24,7
020C 2B68 OR R22,R24
(0105) mesg|= pin&0x38; //屏蔽超声波干扰,检测黑线
020D 2D8A MOV R24,R10
020E 7388 ANDI R24,0x38
020F 2B48 OR R20,R24
(0106) if(mesc)
0210 2366 TST R22
0211 F019 BEQ 0x0215
(0107) car_turn(mesc);
0212 2F06 MOV R16,R22
0213 DF16 RCALL _car_turn
0214 C002 RJMP 0x0217
(0108) else
(0109) car_turn(mesg);
FILE: <library>
0215 2F04 MOV R16,R20
0216 DF13 RCALL _car_turn
0217 CFED RJMP 0x0205
0218 9622 ADIW R28,2
0219 9508 RET
pop_gset2:
021A E0E2 LDI R30,2
021B 940C022C JMP pop
pop_gset3:
021D E0E4 LDI R30,4
021E 940C022C JMP pop
push_gset5:
0220 92FA ST R15,-Y
0221 92EA ST R14,-Y
push_gset4:
0222 92DA ST R13,-Y
0223 92CA ST R12,-Y
push_gset3:
0224 92BA ST R11,-Y
0225 92AA ST R10,-Y
push_gset2:
0226 937A ST R23,-Y
0227 936A ST R22,-Y
push_gset1:
0228 935A ST R21,-Y
0229 934A ST R20,-Y
022A 9508 RET
pop_gset1:
022B E0E1 LDI R30,1
pop:
022C 9149 LD R20,Y+
022D 9159 LD R21,Y+
022E FDE0 SBRC R30,0
022F 9508 RET
0230 9169 LD R22,Y+
0231 9179 LD R23,Y+
0232 FDE1 SBRC R30,1
0233 9508 RET
0234 90A9 LD R10,Y+
0235 90B9 LD R11,Y+
0236 FDE2 SBRC R30,2
0237 9508 RET
0238 90C9 LD R12,Y+
0239 90D9 LD R13,Y+
023A FDE3 SBRC R30,3
023B 9508 RET
023C 90E9 LD R14,Y+
023D 90F9 LD R15,Y+
023E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -