?? ji_qi_ren.lst
字號:
__text_start:
__start:
0032 E5CF LDI R28,0x5F
0033 E0D4 LDI R29,4
0034 BFCD OUT 0x3D,R28
0035 BFDE OUT 0x3E,R29
0036 51C0 SUBI R28,0x10
0037 40D0 SBCI R29,0
0038 EA0A LDI R16,0xAA
0039 8308 STD Y+0,R16
003A 2400 CLR R0
003B E6EF LDI R30,0x6F
003C E0F0 LDI R31,0
003D E010 LDI R17,0
003E 37EB CPI R30,0x7B
003F 07F1 CPC R31,R17
0040 F011 BEQ 0x0043
0041 9201 ST R0,Z+
0042 CFFB RJMP 0x003E
0043 8300 STD Z+0,R16
0044 E5E4 LDI R30,0x54
0045 E0F0 LDI R31,0
0046 E6A0 LDI R26,0x60
0047 E0B0 LDI R27,0
0048 E010 LDI R17,0
0049 36E3 CPI R30,0x63
004A 07F1 CPC R31,R17
004B F021 BEQ 0x0050
004C 95C8 LPM
004D 9631 ADIW R30,1
004E 920D ST R0,X+
004F CFF9 RJMP 0x0049
0050 940E039F CALL _main
_exit:
0052 CFFF RJMP _exit
FILE: C:\DOCUME~1\eda\桌面\寶貝機器人.c
(0001) //電機在第一次使用之前,都得先調零,即調用stop()子程序旋轉調整螺絲直到其轉速為零
(0002) //PD6\7分別控制左、右電機為白線。紅黑先分別接電源和地
(0003) //電機轉速通過脈沖信號控制,
(0004) //1.5ms停轉、1.3ms正轉、1.7ms為反轉(都為高電平)中間插入20ms的低電平
(0005) //PC3,4控制顯示,PC3傳送數據,PC4為時鐘信號線
(0006) // PC0 1分別為探測光源的左 右端口,
(0007) //創建時間:2005年7月28日19:44~8。10
(0008) #include "iom16v.h"
(0009) #include "macros.h"
(0010) unsigned char turn_state0=0,turn_state1=0,sec,second,mini,minute=0,minisecond,number[12]={0x88,0xbb,0xc1,0x91,0xb2,0x94,0x84,0xb9,0x80,0x90,0x00,0xff};
(0011) unsigned int left,right,zhong,interval;
(0012) void delay_us(unsigned int time)
(0013) {//微秒級延時程序
(0014) do
(0015) {
(0016) time--;
_delay_us:
time --> R16
0053 5001 SUBI R16,1
0054 4010 SBCI R17,0
(0017) }
(0018) while (time>1);
0055 E081 LDI R24,1
0056 E090 LDI R25,0
0057 1780 CP R24,R16
0058 0791 CPC R25,R17
0059 F3C8 BCS 0x0053
005A 9508 RET
_delay_ms:
time --> R20
005B 940E0436 CALL push_gset1
005D 01A8 MOVW R20,R16
(0019) }
(0020)
(0021) void delay_ms(unsigned int time)
(0022) {//毫秒級延時程序
005E C005 RJMP 0x0064
(0023) while(time!=0)
(0024) {
(0025) delay_us(1000);
005F EE08 LDI R16,0xE8
0060 E013 LDI R17,3
0061 DFF1 RCALL _delay_us
(0026) time--;
0062 5041 SUBI R20,1
0063 4050 SBCI R21,0
0064 3040 CPI R20,0
0065 0745 CPC R20,R21
0066 F7C1 BNE 0x005F
0067 940E0439 CALL pop_gset1
0069 9508 RET
_delay_20ms:
time --> R20
006A 940E0436 CALL push_gset1
(0027) }
(0028) }
(0029)
(0030)
(0031) /////////////////小車運動////////////////////////////////////////
(0032) void delay_20ms()//延時20ms,用于插入低電平
(0033) {//毫秒級延時程序
(0034) unsigned char time=20;
006C E144 LDI R20,0x14
006D C004 RJMP 0x0072
(0035) while(time!=0)
(0036) {
(0037) delay_us(126);
006E E70E LDI R16,0x7E
006F E010 LDI R17,0
0070 DFE2 RCALL _delay_us
(0038) time--;
0071 954A DEC R20
0072 2344 TST R20
0073 F7D1 BNE 0x006E
0074 940E0439 CALL pop_gset1
0076 9508 RET
_delay_stop:
time --> R20
0077 940E0436 CALL push_gset1
(0039) }
(0040) }
(0041) void delay_stop()//延時1.5m,用于停轉
(0042) {//毫秒級延時程序
(0043) unsigned char time=1;
0079 E041 LDI R20,1
007A C004 RJMP 0x007F
(0044) while(time!=0)
(0045) {
(0046) delay_us(183);
007B EB07 LDI R16,0xB7
007C E010 LDI R17,0
007D DFD5 RCALL _delay_us
(0047) time--;
007E 954A DEC R20
007F 2344 TST R20
0080 F7D1 BNE 0x007B
0081 940E0439 CALL pop_gset1
0083 9508 RET
_delay_conver:
time --> R20
0084 940E0436 CALL push_gset1
(0048) }
(0049) }
(0050) void delay_conver()//延時0.4ms,用于正反轉變換
(0051) {//毫秒級延時程序
(0052) unsigned char time=1;
0086 E041 LDI R20,1
0087 C004 RJMP 0x008C
(0053) while(time!=0)
(0054) {
(0055) delay_us(43);
0088 E20B LDI R16,0x2B
0089 E010 LDI R17,0
008A DFC8 RCALL _delay_us
(0056) time--;
008B 954A DEC R20
008C 2344 TST R20
008D F7D1 BNE 0x0088
008E 940E0439 CALL pop_gset1
0090 9508 RET
_delay_turn:
time --> R20
0091 940E0436 CALL push_gset1
(0057) }
(0058) }
(0059) void delay_turn()//延時0.2ms,用于轉向
(0060) {//毫秒級延時程序
(0061) unsigned char time=1;
0093 E041 LDI R20,1
0094 C004 RJMP 0x0099
(0062) while(time!=0)
(0063) {
(0064) delay_us(20);
0095 E104 LDI R16,0x14
0096 E010 LDI R17,0
0097 DFBB RCALL _delay_us
(0065) time--;
0098 954A DEC R20
0099 2344 TST R20
009A F7D1 BNE 0x0095
009B 940E0439 CALL pop_gset1
009D 9508 RET
_delay_run:
time --> R20
009E 940E0436 CALL push_gset1
(0066) }
(0067) }
(0068) void delay_run()//延時1.3m,用于正轉
(0069) {//毫秒級延時程序
(0070) unsigned char time=1;
00A0 E041 LDI R20,1
00A1 C004 RJMP 0x00A6
(0071) while(time!=0)
(0072) {
(0073) delay_us(156);
00A2 E90C LDI R16,0x9C
00A3 E010 LDI R17,0
00A4 DFAE RCALL _delay_us
(0074) time--;
00A5 954A DEC R20
00A6 2344 TST R20
00A7 F7D1 BNE 0x00A2
00A8 940E0439 CALL pop_gset1
00AA 9508 RET
_delay_back:
time --> R20
00AB 940E0436 CALL push_gset1
(0075) }
(0076) }
(0077) void delay_back()//延時1.7m,用于反轉
(0078) {//毫秒級延時程序
(0079) unsigned char time=1;
00AD E041 LDI R20,1
00AE C004 RJMP 0x00B3
(0080) while(time!=0)
(0081) {
(0082) delay_us(206);
00AF EC0E LDI R16,0xCE
00B0 E010 LDI R17,0
00B1 DFA1 RCALL _delay_us
(0083) time--;
00B2 954A DEC R20
00B3 2344 TST R20
00B4 F7D1 BNE 0x00AF
00B5 940E0439 CALL pop_gset1
00B7 9508 RET
(0084) }
(0085) }
(0086) void stop(void)
(0087) {
(0088) PORTD&=0x3f;
_stop:
00B8 B382 IN R24,0x12
00B9 738F ANDI R24,0x3F
00BA BB82 OUT 0x12,R24
(0089) delay_20ms();
00BB DFAE RCALL _delay_20ms
(0090) PORTD|=0xc0;
00BC B382 IN R24,0x12
00BD 6C80 ORI R24,0xC0
00BE BB82 OUT 0x12,R24
(0091) delay_stop();
00BF DFB7 RCALL _delay_stop
00C0 9508 RET
(0092) }
(0093) void run(void)
(0094) {
(0095) PORTD&=0x3f;
_run:
00C1 B382 IN R24,0x12
00C2 738F ANDI R24,0x3F
00C3 BB82 OUT 0x12,R24
(0096) delay_20ms();
00C4 DFA5 RCALL _delay_20ms
(0097)
(0098) PORTD|=0x80;
00C5 9A97 SBI 0x12,7
(0099) delay_run();
00C6 DFD7 RCALL _delay_run
(0100) PORTD&=0x3f;
00C7 B382 IN R24,0x12
00C8 738F ANDI R24,0x3F
00C9 BB82 OUT 0x12,R24
(0101)
(0102)
(0103) PORTD|=0x40;
00CA 9A96 SBI 0x12,6
(0104) delay_back();
00CB DFDF RCALL _delay_back
(0105) PORTD&=0x3f;
00CC B382 IN R24,0x12
00CD 738F ANDI R24,0x3F
00CE BB82 OUT 0x12,R24
(0106)
(0107)
(0108)
(0109) delay_conver();
00CF DFB4 RCALL _delay_conver
00D0 9508 RET
(0110)
(0111) }
(0112) void run_back(void)
(0113) {
(0114) PORTD&=0x3f;
_run_back:
00D1 B382 IN R24,0x12
00D2 738F ANDI R24,0x3F
00D3 BB82 OUT 0x12,R24
(0115) delay_20ms();
00D4 DF95 RCALL _delay_20ms
(0116)
(0117)
(0118) PORTD|=0x80;
00D5 9A97 SBI 0x12,7
(0119) delay_back();
00D6 DFD4 RCALL _delay_back
(0120) PORTD&=0x3f;
00D7 B382 IN R24,0x12
00D8 738F ANDI R24,0x3F
00D9 BB82 OUT 0x12,R24
(0121)
(0122)
(0123) PORTD|=0x40;
00DA 9A96 SBI 0x12,6
(0124) delay_run();
00DB DFC2 RCALL _delay_run
(0125) PORTD&=0x3f;
00DC B382 IN R24,0x12
00DD 738F ANDI R24,0x3F
00DE BB82 OUT 0x12,R24
(0126)
(0127) delay_conver();
00DF DFA4 RCALL _delay_conver
00E0 9508 RET
(0128) }
(0129) void turn_left(void)
(0130) {
(0131) PORTD&=0x3f;
_turn_left:
00E1 B382 IN R24,0x12
00E2 738F ANDI R24,0x3F
00E3 BB82 OUT 0x12,R24
(0132) delay_20ms();
00E4 DF85 RCALL _delay_20ms
(0133) PORTD|=0x80;
00E5 9A97 SBI 0x12,7
(0134) delay_run();
00E6 DFB7 RCALL _delay_run
(0135) PORTD&=0x3f;
00E7 B382 IN R24,0x12
00E8 738F ANDI R24,0x3F
00E9 BB82 OUT 0x12,R24
00EA 9508 RET
(0136) //delay_turn();
(0137) }
(0138) void turn_right(void)
(0139) {
(0140) PORTD&=0x3f;
_turn_right:
00EB B382 IN R24,0x12
00EC 738F ANDI R24,0x3F
00ED BB82 OUT 0x12,R24
(0141) delay_20ms();
00EE DF7B RCALL _delay_20ms
(0142) PORTD|=0x40;
00EF 9A96 SBI 0x12,6
(0143) delay_run();
00F0 DFAD RCALL _delay_run
(0144) PORTD&=0x3f;
00F1 B382 IN R24,0x12
00F2 738F ANDI R24,0x3F
00F3 BB82 OUT 0x12,R24
00F4 9508 RET
_display_time:
j --> R20
display --> R22
point --> R12
second --> R10
minute --> R14
n1 --> R20
00F5 940E042E CALL push_gset5
00F7 2EE2 MOV R14,R18
00F8 2F40 MOV R20,R16
00F9 84AA LDD R10,Y+10
00FA 84CC LDD R12,Y+12
(0145) //delay_turn();
(0146) }
(0147) /////////////////小車運動////////////////////////////////////////
(0148)
(0149)
(0150) /////////////液晶屏顯示函數/////////////////////////////////////
(0151)
(0152)
(0153) void display_time(unsigned char n1,unsigned char minute,unsigned char second,unsigned char point)
(0154) //參數n1為控制是否顯示冒號,11為不顯示,10為顯示.
(0155) //minute\second為兩個最大為99的整數
(0156) //point為控制是否顯示小數點,0為不顯示,1為顯示.
(0157) {
(0158) unsigned char j,display;
(0159) display=number[n1];
00FB E683 LDI R24,0x63
00FC E090 LDI R25,0
00FD 2FE4 MOV R30,R20
00FE 27FF CLR R31
00FF 0FE8 ADD R30,R24
0100 1FF9 ADC R31,R25
0101 8160 LDD R22,Z+0
(0160) for(j=0;j<8;j++)
0102 2744 CLR R20
0103 C01A RJMP 0x011E
(0161) {
(0162) PORTC|=0x10;
0104 9AAC SBI 0x15,4
(0163) PORTC&=0xf7;delay_us(5);
0105 B385 IN R24,0x15
0106 7F87 ANDI R24,0xF7
0107 BB85 OUT 0x15,R24
0108 E005 LDI R16,5
0109 E010 LDI R17,0
010A DF48 RCALL _delay_us
(0164) PORTC|=((display&0x01)<<3);delay_us(5);
010B 2F86 MOV R24,R22
010C 7081 ANDI R24,1
010D 0F88 LSL R24
010E 0F88 LSL R24
010F 0F88 LSL R24
0110 B225 IN R2,0x15
0111 2A28 OR R2,R24
0112 BA25 OUT 0x15,R2
0113 E005 LDI R16,5
0114 E010 LDI R17,0
0115 DF3D RCALL _delay_us
(0165) PORTC&=0xef;delay_us(5);
0116 B385 IN R24,0x15
0117 7E8F ANDI R24,0xEF
0118 BB85 OUT 0x15,R24
0119 E005 LDI R16,5
011A E010 LDI R17,0
011B DF37 RCALL _delay_us
(0166) display>>=1;
011C 9566 LSR R22
011D 9543 INC R20
011E 3048 CPI R20,0x8
011F F320 BCS 0x0104
(0167) }
(0168) display=number[minute/10];
0120 E02A LDI R18,0xA
0121 E030 LDI R19,0
0122 2D0E MOV R16,R14
0123 2711 CLR R17
0124 940E03F2 CALL div16s
0126 01F8 MOVW R30,R16
0127 E683 LDI R24,0x63
0128 E090 LDI R25,0
0129 0FE8 ADD R30,R24
012A 1FF9 ADC R31,R25
012B 8160 LDD R22,Z+0
(0169) for(j=0;j<8;j++)
012C 2744 CLR R20
012D C01D RJMP 0x014B
(0170) {
(0171) PORTC|=0x10;delay_us(5);
012E 9AAC SBI 0x15,4
012F E005 LDI R16,5
0130 E010 LDI R17,0
0131 DF21 RCALL _delay_us
(0172) PORTC&=0xf7;delay_us(5);
0132 B385 IN R24,0x15
0133 7F87 ANDI R24,0xF7
0134 BB85 OUT 0x15,R24
0135 E005 LDI R16,5
0136 E010 LDI R17,0
0137 DF1B RCALL _delay_us
(0173) PORTC|=((display&0x01)<<3);delay_us(5);
0138 2F86 MOV R24,R22
0139 7081 ANDI R24,1
013A 0F88 LSL R24
013B 0F88 LSL R24
013C 0F88 LSL R24
013D B225 IN R2,0x15
013E 2A28 OR R2,R24
013F BA25 OUT 0x15,R2
0140 E005 LDI R16,5
0141 E010 LDI R17,0
0142 DF10 RCALL _delay_us
(0174) PORTC&=0xef;delay_us(5);
0143 B385 IN R24,0x15
0144 7E8F ANDI R24,0xEF
0145 BB85 OUT 0x15,R24
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -