📄 demo.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 940E00DE CALL _main
_exit:
004A CFFF RJMP _exit
FILE: C:\DOCUME~1\administrator\桌面\教程\DEMO\delay.c
(0001) /**********************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 www.avrvi.com **
(0005) ** Time 2007-1-31 **
(0006) ***********************************/
(0007) #include "config.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:
004B 0000 NOP
004C 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
004D E706 LDI R16,0x76
004E E014 LDI R17,4
004F C002 RJMP 0x0052
0050 5001 SUBI R16,1
0051 4010 SBCI R17,0
0052 3000 CPI R16,0
0053 0701 CPC R16,R17
0054 F7D9 BNE 0x0050
0055 9508 RET
_delay_1s:
i --> R20
0056 940E00EB 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
0058 EF4A LDI R20,0xFA
0059 E050 LDI R21,0
005A C003 RJMP 0x005E
(0038) delay_1ms();
005B DFF1 RCALL _delay_1ms
005C 5041 SUBI R20,1
005D 4050 SBCI R21,0
005E 3040 CPI R20,0
005F 0745 CPC R20,R21
0060 F7D1 BNE 0x005B
(0039) for(i=250;i>0;i--)
0061 EF4A LDI R20,0xFA
0062 E050 LDI R21,0
0063 C003 RJMP 0x0067
(0040) delay_1ms();
0064 DFE8 RCALL _delay_1ms
0065 5041 SUBI R20,1
0066 4050 SBCI R21,0
0067 3040 CPI R20,0
0068 0745 CPC R20,R21
0069 F7D1 BNE 0x0064
(0041) for(i=250;i>0;i--)
006A EF4A LDI R20,0xFA
006B E050 LDI R21,0
006C C003 RJMP 0x0070
(0042) delay_1ms();
006D DFDF RCALL _delay_1ms
006E 5041 SUBI R20,1
006F 4050 SBCI R21,0
0070 3040 CPI R20,0
0071 0745 CPC R20,R21
0072 F7D1 BNE 0x006D
(0043) for(i=250;i>0;i--)
0073 EF4A LDI R20,0xFA
0074 E050 LDI R21,0
0075 C003 RJMP 0x0079
(0044) delay_1ms();
0076 DFD6 RCALL _delay_1ms
0077 5041 SUBI R20,1
0078 4050 SBCI R21,0
0079 3040 CPI R20,0
007A 0745 CPC R20,R21
007B F7D1 BNE 0x0076
007C 940E00EE CALL pop_gset1
007E 9508 RET
_delay_us:
i --> R20
n --> R22
007F 940E00E9 CALL push_gset2
0081 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--)
0082 01AB MOVW R20,R22
0083 C003 RJMP 0x0087
(0054) delay_1us();
0084 DFC6 RCALL _delay_1us
0085 5041 SUBI R20,1
0086 4050 SBCI R21,0
0087 3040 CPI R20,0
0088 0745 CPC R20,R21
0089 F7D1 BNE 0x0084
008A 940E00E0 CALL pop_gset2
008C 9508 RET
_delay_ms:
i --> R20
n --> R22
008D 940E00E9 CALL push_gset2
008F 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--)
0090 01AB MOVW R20,R22
0091 C003 RJMP 0x0095
(0064) delay_1ms();
0092 DFBA RCALL _delay_1ms
0093 5041 SUBI R20,1
0094 4050 SBCI R21,0
0095 3040 CPI R20,0
0096 0745 CPC R20,R21
0097 F7D1 BNE 0x0092
0098 940E00E0 CALL pop_gset2
009A 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
009B 940E00E9 CALL push_gset2
009D 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--)
009E 01AB MOVW R20,R22
009F C026 RJMP 0x00C6
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
00A0 EF6A LDI R22,0xFA
00A1 E070 LDI R23,0
00A2 C003 RJMP 0x00A6
(0076) delay_1ms();
00A3 DFA9 RCALL _delay_1ms
00A4 5061 SUBI R22,1
00A5 4070 SBCI R23,0
00A6 3060 CPI R22,0
00A7 0767 CPC R22,R23
00A8 F7D1 BNE 0x00A3
(0077) for(i=250;i>0;i--)
00A9 EF6A LDI R22,0xFA
00AA E070 LDI R23,0
00AB C003 RJMP 0x00AF
(0078) delay_1ms();
00AC DFA0 RCALL _delay_1ms
00AD 5061 SUBI R22,1
00AE 4070 SBCI R23,0
00AF 3060 CPI R22,0
00B0 0767 CPC R22,R23
00B1 F7D1 BNE 0x00AC
(0079) for(i=250;i>0;i--)
00B2 EF6A LDI R22,0xFA
00B3 E070 LDI R23,0
00B4 C003 RJMP 0x00B8
(0080) delay_1ms();
00B5 DF97 RCALL _delay_1ms
00B6 5061 SUBI R22,1
00B7 4070 SBCI R23,0
00B8 3060 CPI R22,0
00B9 0767 CPC R22,R23
00BA F7D1 BNE 0x00B5
(0081) for(i=250;i>0;i--)
00BB EF6A LDI R22,0xFA
00BC E070 LDI R23,0
00BD C003 RJMP 0x00C1
(0082) delay_1ms();
00BE DF8E RCALL _delay_1ms
00BF 5061 SUBI R22,1
00C0 4070 SBCI R23,0
00C1 3060 CPI R22,0
00C2 0767 CPC R22,R23
00C3 F7D1 BNE 0x00BE
00C4 5041 SUBI R20,1
00C5 4050 SBCI R21,0
00C6 3040 CPI R20,0
00C7 0745 CPC R20,R21
00C8 F6B9 BNE 0x00A0
00C9 940E00E0 CALL pop_gset2
00CB 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\教程\DEMO\main.c
(0001) // ICC-AVR application builder : 2007-2-14 21:34:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 工程DEMO
(0005)
(0006) #include "config.h"
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTA = 0x00;
_port_init:
00CC 2422 CLR R2
00CD BA2B OUT 0x1B,R2
(0011) DDRA = 0x00;
00CE BA2A OUT 0x1A,R2
(0012) PORTB = 0x00;
00CF BA28 OUT 0x18,R2
(0013) DDRB = 0x00;
00D0 BA27 OUT 0x17,R2
(0014) PORTC = 0x00; //m103 output only
00D1 BA25 OUT 0x15,R2
(0015) DDRC = 0x00;
00D2 BA24 OUT 0x14,R2
(0016) PORTD = 0x00;
00D3 BA22 OUT 0x12,R2
(0017) DDRD = 0x00;
00D4 BA21 OUT 0x11,R2
00D5 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:
00D6 94F8 BCLR 7
(0025) port_init();
00D7 DFF4 RCALL _port_init
(0026)
(0027) MCUCR = 0x00;
00D8 2422 CLR R2
00D9 BE25 OUT 0x35,R2
(0028) GICR = 0x00;
00DA BE2B OUT 0x3B,R2
(0029) TIMSK = 0x00; //timer interrupt sources
00DB BE29 OUT 0x39,R2
(0030) SEI(); //re-enable interrupts
00DC 9478 BSET 7
00DD 9508 RET
(0031) //all peripherals are now initialized
(0032) }
(0033)
(0034) void main(void)
(0035) {
(0036) unsigned int temp1;
(0037) while(1)
FILE: <library>
_main:
temp1 --> Y+1
00DE CFFF RJMP _main
00DF 9508 RET
pop_gset2:
00E0 E0E2 LDI R30,2
00E1 940C00EF JMP pop
push_gset5:
00E3 92FA ST R15,-Y
00E4 92EA ST R14,-Y
push_gset4:
00E5 92DA ST R13,-Y
00E6 92CA ST R12,-Y
push_gset3:
00E7 92BA ST R11,-Y
00E8 92AA ST R10,-Y
push_gset2:
00E9 937A ST R23,-Y
00EA 936A ST R22,-Y
push_gset1:
00EB 935A ST R21,-Y
00EC 934A ST R20,-Y
00ED 9508 RET
pop_gset1:
00EE E0E1 LDI R30,1
pop:
00EF 9149 LD R20,Y+
00F0 9159 LD R21,Y+
00F1 FDE0 SBRC R30,0
00F2 9508 RET
00F3 9169 LD R22,Y+
00F4 9179 LD R23,Y+
00F5 FDE1 SBRC R30,1
00F6 9508 RET
00F7 90A9 LD R10,Y+
00F8 90B9 LD R11,Y+
00F9 FDE2 SBRC R30,2
00FA 9508 RET
00FB 90C9 LD R12,Y+
00FC 90D9 LD R13,Y+
00FD FDE3 SBRC R30,3
00FE 9508 RET
00FF 90E9 LD R14,Y+
0100 90F9 LD R15,Y+
0101 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -