📄 demo.lst
字号:
__start:
__text_start:
004B E5CF LDI R28,0x5F
004C E0D4 LDI R29,4
004D BFCD OUT 0x3D,R28
004E BFDE OUT 0x3E,R29
004F 51C0 SUBI R28,0x10
0050 40D0 SBCI R29,0
0051 EA0A LDI R16,0xAA
0052 8308 STD Y+0,R16
0053 2400 CLR R0
0054 E6E0 LDI R30,0x60
0055 E0F0 LDI R31,0
0056 E010 LDI R17,0
0057 36E2 CPI R30,0x62
0058 07F1 CPC R31,R17
0059 F011 BEQ 0x005C
005A 9201 ST R0,Z+
005B CFFB RJMP 0x0057
005C 8300 STD Z+0,R16
005D E9E6 LDI R30,0x96
005E E0F0 LDI R31,0
005F E6A0 LDI R26,0x60
0060 E0B0 LDI R27,0
0061 E010 LDI R17,0
0062 39E6 CPI R30,0x96
0063 07F1 CPC R31,R17
0064 F021 BEQ 0x0069
0065 95C8 LPM
0066 9631 ADIW R30,1
0067 920D ST R0,X+
0068 CFF9 RJMP 0x0062
0069 940E0149 CALL _main
_exit:
006B CFFF RJMP _exit
FILE: C:\DOCUME~1\administrator\桌面\教程\7断数码管\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:
006C 0000 NOP
006D 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
006E E706 LDI R16,0x76
006F E014 LDI R17,4
0070 C002 RJMP 0x0073
0071 5001 SUBI R16,1
0072 4010 SBCI R17,0
0073 3000 CPI R16,0
0074 0701 CPC R16,R17
0075 F7D9 BNE 0x0071
0076 9508 RET
_delay_1s:
i --> R20
0077 940E0962 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
0079 EF4A LDI R20,0xFA
007A E050 LDI R21,0
007B C003 RJMP 0x007F
(0038) delay_1ms();
007C DFF1 RCALL _delay_1ms
007D 5041 SUBI R20,1
007E 4050 SBCI R21,0
007F 3040 CPI R20,0
0080 0745 CPC R20,R21
0081 F7D1 BNE 0x007C
(0039) for(i=250;i>0;i--)
0082 EF4A LDI R20,0xFA
0083 E050 LDI R21,0
0084 C003 RJMP 0x0088
(0040) delay_1ms();
0085 DFE8 RCALL _delay_1ms
0086 5041 SUBI R20,1
0087 4050 SBCI R21,0
0088 3040 CPI R20,0
0089 0745 CPC R20,R21
008A F7D1 BNE 0x0085
(0041) for(i=250;i>0;i--)
008B EF4A LDI R20,0xFA
008C E050 LDI R21,0
008D C003 RJMP 0x0091
(0042) delay_1ms();
008E DFDF RCALL _delay_1ms
008F 5041 SUBI R20,1
0090 4050 SBCI R21,0
0091 3040 CPI R20,0
0092 0745 CPC R20,R21
0093 F7D1 BNE 0x008E
(0043) for(i=250;i>0;i--)
0094 EF4A LDI R20,0xFA
0095 E050 LDI R21,0
0096 C003 RJMP 0x009A
(0044) delay_1ms();
0097 DFD6 RCALL _delay_1ms
0098 5041 SUBI R20,1
0099 4050 SBCI R21,0
009A 3040 CPI R20,0
009B 0745 CPC R20,R21
009C F7D1 BNE 0x0097
009D 940E0965 CALL pop_gset1
009F 9508 RET
_delay_us:
i --> R20
n --> R22
00A0 940E0960 CALL push_gset2
00A2 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--)
00A3 01AB MOVW R20,R22
00A4 C003 RJMP 0x00A8
(0054) delay_1us();
00A5 DFC6 RCALL _delay_1us
00A6 5041 SUBI R20,1
00A7 4050 SBCI R21,0
00A8 3040 CPI R20,0
00A9 0745 CPC R20,R21
00AA F7D1 BNE 0x00A5
00AB 940E0954 CALL pop_gset2
00AD 9508 RET
_delay_ms:
i --> R20
n --> R22
00AE 940E0960 CALL push_gset2
00B0 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--)
00B1 01AB MOVW R20,R22
00B2 C003 RJMP 0x00B6
(0064) delay_1ms();
00B3 DFBA RCALL _delay_1ms
00B4 5041 SUBI R20,1
00B5 4050 SBCI R21,0
00B6 3040 CPI R20,0
00B7 0745 CPC R20,R21
00B8 F7D1 BNE 0x00B3
00B9 940E0954 CALL pop_gset2
00BB 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
00BC 940E0960 CALL push_gset2
00BE 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--)
00BF 01AB MOVW R20,R22
00C0 C026 RJMP 0x00E7
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
00C1 EF6A LDI R22,0xFA
00C2 E070 LDI R23,0
00C3 C003 RJMP 0x00C7
(0076) delay_1ms();
00C4 DFA9 RCALL _delay_1ms
00C5 5061 SUBI R22,1
00C6 4070 SBCI R23,0
00C7 3060 CPI R22,0
00C8 0767 CPC R22,R23
00C9 F7D1 BNE 0x00C4
(0077) for(i=250;i>0;i--)
00CA EF6A LDI R22,0xFA
00CB E070 LDI R23,0
00CC C003 RJMP 0x00D0
(0078) delay_1ms();
00CD DFA0 RCALL _delay_1ms
00CE 5061 SUBI R22,1
00CF 4070 SBCI R23,0
00D0 3060 CPI R22,0
00D1 0767 CPC R22,R23
00D2 F7D1 BNE 0x00CD
(0079) for(i=250;i>0;i--)
00D3 EF6A LDI R22,0xFA
00D4 E070 LDI R23,0
00D5 C003 RJMP 0x00D9
(0080) delay_1ms();
00D6 DF97 RCALL _delay_1ms
00D7 5061 SUBI R22,1
00D8 4070 SBCI R23,0
00D9 3060 CPI R22,0
00DA 0767 CPC R22,R23
00DB F7D1 BNE 0x00D6
(0081) for(i=250;i>0;i--)
00DC EF6A LDI R22,0xFA
00DD E070 LDI R23,0
00DE C003 RJMP 0x00E2
(0082) delay_1ms();
00DF DF8E RCALL _delay_1ms
00E0 5061 SUBI R22,1
00E1 4070 SBCI R23,0
00E2 3060 CPI R22,0
00E3 0767 CPC R22,R23
00E4 F7D1 BNE 0x00DF
00E5 5041 SUBI R20,1
00E6 4050 SBCI R21,0
00E7 3040 CPI R20,0
00E8 0745 CPC R20,R21
00E9 F6B9 BNE 0x00C1
00EA 940E0954 CALL pop_gset2
00EC 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\教程\7断数码管\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) extern const led_data[16]; //声明外部led显示数据,led_data在led.c中
(0009) uint16 countdata;
(0010)
(0011) void port_init(void)
(0012) {
(0013) PORTA = 0x00;
_port_init:
00ED 2422 CLR R2
00EE BA2B OUT 0x1B,R2
(0014) DDRA = 0x00;
00EF BA2A OUT 0x1A,R2
(0015) PORTB = 0x00;
00F0 BA28 OUT 0x18,R2
(0016) DDRB = 0x00;
00F1 BA27 OUT 0x17,R2
(0017) PORTC = 0x00; //m103 output only
00F2 BA25 OUT 0x15,R2
(0018) DDRC = 0x00;
00F3 BA24 OUT 0x14,R2
(0019) PORTD = 0x00;
00F4 BA22 OUT 0x12,R2
(0020) DDRD = 0x00;
00F5 BA21 OUT 0x11,R2
00F6 9508 RET
(0021) }
(0022) /***************************************************************/
(0023) //定时器1用于一秒刷新 countdata 的值,达到从1-9999计秒的功能
(0024) //TIMER1 initialize - prescale:1024
(0025) // WGM: 0) Normal, TOP=0xFFFF
(0026) // desired value: 1Sec
(0027) // actual value: 1.000Sec (0.0%)
(0028) void timer1_init(void)
(0029) {
(0030) TCCR1B = 0x00; //stop
_timer1_init:
00F7 2422 CLR R2
00F8 BC2E OUT 0x2E,R2
(0031) TCNT1H = 0xE3; //setup
00F9 EE83 LDI R24,0xE3
00FA BD8D OUT 0x2D,R24
(0032) TCNT1L = 0xE1;
00FB EE81 LDI R24,0xE1
00FC BD8C OUT 0x2C,R24
(0033) OCR1AH = 0x1C;
00FD E18C LDI R24,0x1C
00FE BD8B OUT 0x2B,R24
(0034) OCR1AL = 0x1F;
00FF E18F LDI R24,0x1F
0100 BD8A OUT 0x2A,R24
(0035) OCR1BH = 0x1C;
0101 E18C LDI R24,0x1C
0102 BD89 OUT 0x29,R24
(0036) OCR1BL = 0x1F;
0103 E18F LDI R24,0x1F
0104 BD88 OUT 0x28,R24
(0037) ICR1H = 0x1C;
0105 E18C LDI R24,0x1C
0106 BD87 OUT 0x27,R24
(0038) ICR1L = 0x1F;
0107 E18F LDI R24,0x1F
0108 BD86 OUT 0x26,R24
(0039) TCCR1A = 0x00;
0109 BC2F OUT 0x2F,R2
(0040) TCCR1B = 0x05; //start Timer
010A E085 LDI R24,5
010B BD8E OUT 0x2E,R24
010C 9508 RET
_timer1_ovf_isr:
010D 922A ST R2,-Y
010E 923A ST R3,-Y
010F 938A ST R24,-Y
0110 939A ST R25,-Y
0111 93EA ST R30,-Y
0112 B62F IN R2,0x3F
0113 922A ST R2,-Y
(0041) }
(0042)
(0043) #pragma interrupt_handler timer1_ovf_isr:9
(0044) void timer1_ovf_isr(void)
(0045) {
(0046) //TIMER1 has overflowed
(0047) TCNT1H = 0xE3; //reload counter high value
0114 EE83 LDI R24,0xE3
0115 BD8D OUT 0x2D,R24
(0048) TCNT1L = 0xE1; //reload counter low value
0116 EE81 LDI R24,0xE1
0117 BD8C OUT 0x2C,R24
(0049) countdata++;
0118 91800060 LDS R24,countdata
011A 91900061 LDS R25,countdata+1
011C 9601 ADIW R24,1
011D 93900061 STS countdata+1,R25
011F 93800060 STS countdata,R24
(0050) if(countdata==9999) countdata=0;
0121 308F CPI R24,0xF
0122 E2E7 LDI R30,0x27
0123 079E CPC R25,R30
0124 F431 BNE 0x012B
0125 2422 CLR R2
0126 2433 CLR R3
0127 92300061 STS countdata+1,R3
0129 92200060 STS countdata,R2
012B 9029 LD R2,Y+
012C BE2F OUT 0x3F,R2
012D 91E9 LD R30,Y+
012E 9199 LD R25,Y+
012F 9189 LD R24,Y+
0130 9039 LD R3,Y+
0131 9029 LD R2,Y+
0132 9518 RETI
(0051) }
(0052)
(0053)
(0054) //call this routine to initialize all peripherals
(0055) void init_devices(void)
(0056) {
(0057) //stop errant interrupts until set up
(0058) CLI(); //disable all interrupts
_init_devices:
0133 94F8 BCLR 7
(0059) port_init();
0134 DFB8 RCALL _port_init
(0060) led_init(); //7段数码管显示
0135 940E0154 CALL _led_init
(0061)
(0062) MCUCR = 0x00;
0137 2422 CLR R2
0138 BE25 OUT 0x35,R2
(0063) GICR = 0x00;
0139 BE2B OUT 0x3B,R2
(0064) TIMSK = 0x00; //timer interrupt sources
013A BE29 OUT 0x39,R2
(0065) SEI(); //re-enable interrupts
013B 9478 BSET 7
013C 9508 RET
(0066) //all peripherals are now initialized
(0067) }
(0068)
(0069) /**************************************************/
(0070) //只有综合应用才用到本函数
(0071) //call this routine to initialize all peripherals
(0072) void init_devices2(void)
(0073) {
(0074) //stop errant interrupts until set up
(0075) CLI(); //disable all interrupts
_init_devices2:
013D 94F8 BCLR 7
(0076) port_init();
013E DFAE RCALL _port_init
(0077) led_init(); //7段数码管显示
013F 940E0154 CALL _led_init
(0078) timer1_init(); //定时器1用于更新countdata的值,从1到9999变化
0141 DFB5 RCALL _timer1_init
(0079)
(0080) MCUCR = 0x00;
0142 2422 CLR R2
0143 BE25 OUT 0x35,R2
(0081) GICR = 0x00;
0144 BE2B OUT 0x3B,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -