📄 软件延时.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E005E CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\实验教程\软件延时\main.c
(0001) //ICC-AVR application builder : 2006-1-31 下午 01:03:41
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "delay.h" //调用头文件
(0008) void port_init(void)
(0009) {
(0010) PORTA = 0x03;
_port_init:
004B E083 LDI R24,3
004C BB8B OUT 0x1B,R24
(0011) DDRA = 0x03;
004D BB8A OUT 0x1A,R24
(0012) PORTB = 0x00;
004E 2422 CLR R2
004F BA28 OUT 0x18,R2
(0013) DDRB = 0x00;
0050 BA27 OUT 0x17,R2
(0014) PORTC = 0x00; //m103 output only
0051 BA25 OUT 0x15,R2
(0015) DDRC = 0x00;
0052 BA24 OUT 0x14,R2
(0016) PORTD = 0x00;
0053 BA22 OUT 0x12,R2
(0017) DDRD = 0x00;
0054 BA21 OUT 0x11,R2
0055 9508 RET
(0018) }
(0019)
(0020) //call this routine to initialize all peripherals
(0021) void init_devices(void)
(0022) {
(0023) //stop errant interrupts until set up
(0024) CLI(); //disable all interrupts
_init_devices:
0056 94F8 BCLR 7
(0025) port_init();
0057 DFF3 RCALL _port_init
(0026) MCUCR = 0x00;
0058 2422 CLR R2
0059 BE25 OUT 0x35,R2
(0027) GICR = 0x00;
005A BE2B OUT 0x3B,R2
(0028) TIMSK = 0x00; //timer interrupt sources
005B BE29 OUT 0x39,R2
(0029) SEI(); //re-enable interrupts
005C 9478 BSET 7
005D 9508 RET
(0030) //all peripherals are now initialized
(0031) }
(0032)
(0033) void main(void)
(0034) {
(0035)
(0036) init_devices(); //初始化
_main:
005E DFF7 RCALL _init_devices
005F C008 RJMP 0x0068
(0037)
(0038) while(1)
(0039) {
(0040) PORTB = 0x02; //1脚为高,0脚为低,0脚灯亮
0060 E082 LDI R24,2
0061 BB88 OUT 0x18,R24
(0041) delay_1s(); //延时1S
0062 940E0075 CALL _delay_1s
(0042) PORTB = 0x01; //0脚为高,1脚为低,1脚灯亮
0064 E081 LDI R24,1
0065 BB88 OUT 0x18,R24
(0043) delay_1s(); //延时1S
0066 940E0075 CALL _delay_1s
0068 CFF7 RJMP 0x0060
0069 9508 RET
FILE: D:\桌面\实验教程\软件延时\delay.c
(0001) /****************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 **
(0005) ** Time 2007-1-31 **
(0006) *****************************/
(0007) #include "delay.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015) asm("nop");
_delay_1us:
006A 0000 NOP
006B 9508 RET
(0016) }
(0017)
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025) unsigned int i;
(0026) for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
i --> R16
006C E706 LDI R16,0x76
006D E014 LDI R17,4
006E C002 RJMP 0x0071
006F 5001 SUBI R16,1
0070 4010 SBCI R17,0
0071 3000 CPI R16,0
0072 0701 CPC R16,R17
0073 F7D9 BNE 0x006F
0074 9508 RET
_delay_1s:
i --> R20
0075 940E00F6 CALL push_gset1
(0027) ;
(0028) }
(0029)
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036) unsigned int i;
(0037) for(i=250;i>0;i--) //250ms*4=1000ms
0077 EF4A LDI R20,0xFA
0078 E050 LDI R21,0
0079 C003 RJMP 0x007D
(0038) delay_1ms();
007A DFF1 RCALL _delay_1ms
007B 5041 SUBI R20,1
007C 4050 SBCI R21,0
007D 3040 CPI R20,0
007E 0745 CPC R20,R21
007F F7D1 BNE 0x007A
(0039) for(i=250;i>0;i--)
0080 EF4A LDI R20,0xFA
0081 E050 LDI R21,0
0082 C003 RJMP 0x0086
(0040) delay_1ms();
0083 DFE8 RCALL _delay_1ms
0084 5041 SUBI R20,1
0085 4050 SBCI R21,0
0086 3040 CPI R20,0
0087 0745 CPC R20,R21
0088 F7D1 BNE 0x0083
(0041) for(i=250;i>0;i--)
0089 EF4A LDI R20,0xFA
008A E050 LDI R21,0
008B C003 RJMP 0x008F
(0042) delay_1ms();
008C DFDF RCALL _delay_1ms
008D 5041 SUBI R20,1
008E 4050 SBCI R21,0
008F 3040 CPI R20,0
0090 0745 CPC R20,R21
0091 F7D1 BNE 0x008C
(0043) for(i=250;i>0;i--)
0092 EF4A LDI R20,0xFA
0093 E050 LDI R21,0
0094 C003 RJMP 0x0098
(0044) delay_1ms();
0095 DFD6 RCALL _delay_1ms
0096 5041 SUBI R20,1
0097 4050 SBCI R21,0
0098 3040 CPI R20,0
0099 0745 CPC R20,R21
009A F7D1 BNE 0x0095
009B 940E00F9 CALL pop_gset1
009D 9508 RET
_delay_us:
i --> R20
n --> R22
009E 940E00F4 CALL push_gset2
00A0 01B8 MOVW R22,R16
(0045) }
(0046)
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052) unsigned int i;
(0053) for(i=n;i>0;i--)
00A1 01AB MOVW R20,R22
00A2 C003 RJMP 0x00A6
(0054) delay_1us();
00A3 DFC6 RCALL _delay_1us
00A4 5041 SUBI R20,1
00A5 4050 SBCI R21,0
00A6 3040 CPI R20,0
00A7 0745 CPC R20,R21
00A8 F7D1 BNE 0x00A3
00A9 940E00EB CALL pop_gset2
00AB 9508 RET
_delay_ms:
i --> R20
n --> R22
00AC 940E00F4 CALL push_gset2
00AE 01B8 MOVW R22,R16
(0055) }
(0056)
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062) unsigned int i;
(0063) for(i=n;i>0;i--)
00AF 01AB MOVW R20,R22
00B0 C003 RJMP 0x00B4
(0064) delay_1ms();
00B1 DFBA RCALL _delay_1ms
00B2 5041 SUBI R20,1
00B3 4050 SBCI R21,0
00B4 3040 CPI R20,0
00B5 0745 CPC R20,R21
00B6 F7D1 BNE 0x00B1
00B7 940E00EB CALL pop_gset2
00B9 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
00BA 940E00F4 CALL push_gset2
00BC 01B8 MOVW R22,R16
(0065) }
(0066)
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072) unsigned int i,j;
(0073) for(j=n;j>0;j--)
00BD 01AB MOVW R20,R22
00BE C026 RJMP 0x00E5
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
00BF EF6A LDI R22,0xFA
00C0 E070 LDI R23,0
00C1 C003 RJMP 0x00C5
(0076) delay_1ms();
00C2 DFA9 RCALL _delay_1ms
00C3 5061 SUBI R22,1
00C4 4070 SBCI R23,0
00C5 3060 CPI R22,0
00C6 0767 CPC R22,R23
00C7 F7D1 BNE 0x00C2
(0077) for(i=250;i>0;i--)
00C8 EF6A LDI R22,0xFA
00C9 E070 LDI R23,0
00CA C003 RJMP 0x00CE
(0078) delay_1ms();
00CB DFA0 RCALL _delay_1ms
00CC 5061 SUBI R22,1
00CD 4070 SBCI R23,0
00CE 3060 CPI R22,0
00CF 0767 CPC R22,R23
00D0 F7D1 BNE 0x00CB
(0079) for(i=250;i>0;i--)
00D1 EF6A LDI R22,0xFA
00D2 E070 LDI R23,0
00D3 C003 RJMP 0x00D7
(0080) delay_1ms();
00D4 DF97 RCALL _delay_1ms
00D5 5061 SUBI R22,1
00D6 4070 SBCI R23,0
00D7 3060 CPI R22,0
00D8 0767 CPC R22,R23
00D9 F7D1 BNE 0x00D4
(0081) for(i=250;i>0;i--)
00DA EF6A LDI R22,0xFA
00DB E070 LDI R23,0
00DC C003 RJMP 0x00E0
(0082) delay_1ms();
FILE: <library>
00DD DF8E RCALL _delay_1ms
00DE 5061 SUBI R22,1
00DF 4070 SBCI R23,0
00E0 3060 CPI R22,0
00E1 0767 CPC R22,R23
00E2 F7D1 BNE 0x00DD
00E3 5041 SUBI R20,1
00E4 4050 SBCI R21,0
00E5 3040 CPI R20,0
00E6 0745 CPC R20,R21
00E7 F6B9 BNE 0x00BF
00E8 940E00EB CALL pop_gset2
00EA 9508 RET
pop_gset2:
00EB E0E2 LDI R30,2
00EC 940C00FA JMP pop
push_gset5:
00EE 92FA ST R15,-Y
00EF 92EA ST R14,-Y
push_gset4:
00F0 92DA ST R13,-Y
00F1 92CA ST R12,-Y
push_gset3:
00F2 92BA ST R11,-Y
00F3 92AA ST R10,-Y
push_gset2:
00F4 937A ST R23,-Y
00F5 936A ST R22,-Y
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -