📄 timer1.lst
字号:
__start:
__text_start:
001B E5CF LDI R28,0x5F
001C E0D2 LDI R29,2
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E6E3 LDI R30,0x63
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 36E3 CPI R30,0x63
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E3E2 LDI R30,0x32
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E5 CPI R30,0x35
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D057 RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: C:\ATMega8515\定时实验\init.c
(0001) //ICC-AVR application builder : 2006-4-27 19:45:18
(0002) // Target : M8515
(0003) // Crystal: 11.059Mhz
(0004)
(0005) #include <iom8515v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTA = 0x00;
_port_init:
003B 2422 CLR R2
003C BA2B OUT 0x1B,R2
(0011) DDRA = 0xFF;
003D EF8F LDI R24,0xFF
003E BB8A OUT 0x1A,R24
(0012) PORTB = 0x00;
003F BA28 OUT 0x18,R2
(0013) DDRB = 0x00;
0040 BA27 OUT 0x17,R2
(0014) PORTC = 0x00;
0041 BA25 OUT 0x15,R2
(0015) DDRC = 0xC0;
0042 EC80 LDI R24,0xC0
0043 BB84 OUT 0x14,R24
(0016) PORTD = 0x00;
0044 BA22 OUT 0x12,R2
(0017) DDRD = 0x00;
0045 BA21 OUT 0x11,R2
(0018) PORTE = 0x00;
0046 B827 OUT 0x07,R2
(0019) DDRE = 0x00;
0047 B826 OUT 0x06,R2
0048 9508 RET
(0020) }
(0021)
(0022) //TIMER1 initialize - prescale:1
(0023) // WGM: 0) Normal, TOP=0xFFFF
(0024) // desired value: 1mSec
(0025) // actual value: 1.000mSec (0.0%)
(0026) void timer1_init(void)
(0027) {
(0028) TCCR1B = 0x00; //stop
_timer1_init:
0049 2422 CLR R2
004A BC2E OUT 0x2E,R2
(0029) TCNT1H = 0xD4; //setup
004B ED84 LDI R24,0xD4
004C BD8D OUT 0x2D,R24
(0030) TCNT1L = 0xCE;
004D EC8E LDI R24,0xCE
004E BD8C OUT 0x2C,R24
(0031) OCR1AH = 0x2B;
004F E28B LDI R24,0x2B
0050 BD8B OUT 0x2B,R24
(0032) OCR1AL = 0x32;
0051 E382 LDI R24,0x32
0052 BD8A OUT 0x2A,R24
(0033) OCR1BH = 0x2B;
0053 E28B LDI R24,0x2B
0054 BD89 OUT 0x29,R24
(0034) OCR1BL = 0x32;
0055 E382 LDI R24,0x32
0056 BD88 OUT 0x28,R24
(0035) TCCR1A = 0x00;
0057 BC2F OUT 0x2F,R2
(0036) TCCR1B = 0x01; //start Timer
0058 E081 LDI R24,1
0059 BD8E OUT 0x2E,R24
005A 9508 RET
_timer1_ovf_isr:
005B 922A ST R2,-Y
005C 923A ST R3,-Y
005D 938A ST R24,-Y
005E 939A ST R25,-Y
005F 93EA ST R30,-Y
0060 B62F IN R2,0x3F
0061 922A ST R2,-Y
(0037) }
(0038)
(0039) unsigned int count=0;
(0040) extern unsigned char flag;
(0041) #pragma interrupt_handler timer1_ovf_isr:7
(0042) void timer1_ovf_isr(void)
(0043) {
(0044) TCNT1H = 0xD4; //reload counter high value
0062 ED84 LDI R24,0xD4
0063 BD8D OUT 0x2D,R24
(0045) TCNT1L = 0xCE; //reload counter low value
0064 EC8E LDI R24,0xCE
0065 BD8C OUT 0x2C,R24
(0046) //计算1000次,一共1S
(0047) if(count++==1000){count=0;flag=1;}
0066 90200060 LDS R2,count
0068 90300061 LDS R3,count+1
006A 01C1 MOVW R24,R2
006B 9601 ADIW R24,1
006C 93900061 STS count+1,R25
006E 93800060 STS count,R24
0070 01C1 MOVW R24,R2
0071 3E88 CPI R24,0xE8
0072 E0E3 LDI R30,3
0073 079E CPC R25,R30
0074 F449 BNE 0x007E
0075 2422 CLR R2
0076 2433 CLR R3
0077 92300061 STS count+1,R3
0079 92200060 STS count,R2
007B E081 LDI R24,1
007C 93800062 STS flag,R24
007E 9029 LD R2,Y+
007F BE2F OUT 0x3F,R2
0080 91E9 LD R30,Y+
0081 9199 LD R25,Y+
0082 9189 LD R24,Y+
0083 9039 LD R3,Y+
0084 9029 LD R2,Y+
0085 9518 RETI
(0048) }
(0049)
(0050) //call this routine to initialize all peripherals
(0051) void init_devices(void)
(0052) {
(0053) //stop errant interrupts until set up
(0054) CLI(); //disable all interrupts
_init_devices:
0086 94F8 BCLR 7
(0055) port_init();
0087 DFB3 RCALL _port_init
(0056) timer1_init();
0088 DFC0 RCALL _timer1_init
(0057)
(0058) MCUCR = 0x00;
0089 2422 CLR R2
008A BE25 OUT 0x35,R2
(0059) EMCUCR = 0x00;
008B BE26 OUT 0x36,R2
(0060) GICR = 0x00;
008C BE2B OUT 0x3B,R2
(0061) TIMSK = 0x80;
008D E880 LDI R24,0x80
008E BF89 OUT 0x39,R24
(0062) SEI(); //re-enable interrupts
008F 9478 BSET 7
0090 9508 RET
FILE: C:\ATMega8515\定时实验\main.c
(0001) #include <iom8515v.h>
(0002) #include"ForATmega8515.h"
(0003)
(0004)
(0005) void delay(uint ticks);
(0006) void display(uchar left,uchar right);
(0007) uchar flag=0;
(0008)
(0009) void main()
(0010) {
(0011) uchar count=0;
_main:
count --> R20
0091 2744 CLR R20
(0012) init_devices();
0092 DFF3 RCALL _init_devices
0093 C016 RJMP 0x00AA
(0013)
(0014) while(1)
(0015) {
(0016) display(count/10,count%10);
0094 E01A LDI R17,0xA
0095 2F04 MOV R16,R20
0096 D042 RCALL mod8u
0097 2F20 MOV R18,R16
0098 E01A LDI R17,0xA
0099 2F04 MOV R16,R20
009A D040 RCALL div8u
009B D01E RCALL _display
(0017) if(flag)
009C 90200062 LDS R2,flag
009E 2022 TST R2
009F F051 BEQ 0x00AA
(0018) {
(0019) if(count++==99)count=0;
00A0 2E24 MOV R2,R20
00A1 2433 CLR R3
00A2 5F4F SUBI R20,0xFF
00A3 2D82 MOV R24,R2
00A4 3683 CPI R24,0x63
00A5 F409 BNE 0x00A7
00A6 2744 CLR R20
(0020) flag=0;
00A7 2422 CLR R2
00A8 92200062 STS flag,R2
00AA CFE9 RJMP 0x0094
00AB 9508 RET
_delay:
i --> R20
ticks --> R16
00AC D04E RCALL push_gset1
(0021) }
(0022) }
(0023) }
(0024)
(0025) void delay(uint ticks)
(0026) {
(0027) uchar i;
(0028) for(;ticks!=0;ticks--)for(i=200;i!=0;i--);
00AD C007 RJMP 0x00B5
00AE EC48 LDI R20,0xC8
00AF C001 RJMP 0x00B1
00B0 954A DEC R20
00B1 2344 TST R20
00B2 F7E9 BNE 0x00B0
00B3 5001 SUBI R16,1
00B4 4010 SBCI R17,0
00B5 3000 CPI R16,0
00B6 0701 CPC R16,R17
00B7 F7B1 BNE 0x00AE
00B8 D045 RCALL pop_gset1
00B9 9508 RET
_display:
right --> R20
left --> R22
00BA D03E RCALL push_gset2
00BB 2F42 MOV R20,R18
00BC 2F60 MOV R22,R16
(0029) }
(0030)
(0031) void display(uchar left,uchar right)
(0032) {
(0033) PORTA=Tab[left];//查表显示数码管
00BD E282 LDI R24,0x22
00BE E090 LDI R25,0
00BF 2FE6 MOV R30,R22
00C0 27FF CLR R31
00C1 0FE8 ADD R30,R24
00C2 1FF9 ADC R31,R25
00C3 91E4 LPM R30,0(Z)
00C4 BBEB OUT 0x1B,R30
(0034) PORTC&=~SEG0; //选通左边的数码管
00C5 98AF CBI 0x15,7
(0035) delay(1); //延时
00C6 E001 LDI R16,1
00C7 E010 LDI R17,0
00C8 DFE3 RCALL _delay
(0036) PORTC|=SEG0; //关左边的数码管
00C9 9AAF SBI 0x15,7
(0037) PORTA=Tab[right];//查表显示数码管
00CA E282 LDI R24,0x22
00CB E090 LDI R25,0
00CC 2FE4 MOV R30,R20
00CD 27FF CLR R31
00CE 0FE8 ADD R30,R24
00CF 1FF9 ADC R31,R25
00D0 91E4 LPM R30,0(Z)
00D1 BBEB OUT 0x1B,R30
(0038) PORTC&=~SEG1; //选通右边的数码管
00D2 98AE CBI 0x15,6
(0039) delay(1);
00D3 E001 LDI R16,1
00D4 E010 LDI R17,0
00D5 DFD6 RCALL _delay
(0040) PORTC|=SEG1; //关右边的数码管
FILE: <library>
00D6 9AAE SBI 0x15,6
00D7 D019 RCALL pop_gset2
00D8 9508 RET
mod8u:
00D9 9468 BSET 6
00DA C001 RJMP xdiv8u
div8u:
00DB 94E8 BCLR 6
xdiv8u:
00DC 932A ST R18,-Y
00DD 92FA ST R15,-Y
00DE 92EA ST R14,-Y
00DF 24FF CLR R15
00E0 24EE CLR R14
00E1 E120 LDI R18,0x10
00E2 0F00 LSL R16
00E3 1CFF ROL R15
00E4 1CEE ROL R14
00E5 16E1 CP R14,R17
00E6 F010 BCS 0x00E9
00E7 1AE1 SUB R14,R17
00E8 9503 INC R16
00E9 952A DEC R18
00EA F7B9 BNE 0x00E2
00EB F40E BRTC 0x00ED
00EC 2D0E MOV R16,R14
00ED 90E9 LD R14,Y+
00EE 90F9 LD R15,Y+
00EF 9129 LD R18,Y+
00F0 9508 RET
pop_gset2:
00F1 E0E2 LDI R30,2
00F2 C00C RJMP pop
push_gset5:
00F3 92FA ST R15,-Y
00F4 92EA ST R14,-Y
push_gset4:
00F5 92DA ST R13,-Y
00F6 92CA ST R12,-Y
push_gset3:
00F7 92BA ST R11,-Y
00F8 92AA ST R10,-Y
push_gset2:
00F9 937A ST R23,-Y
00FA 936A ST R22,-Y
push_gset1:
00FB 935A ST R21,-Y
00FC 934A ST R20,-Y
00FD 9508 RET
pop_gset1:
00FE E0E1 LDI R30,1
pop:
00FF 9149 LD R20,Y+
0100 9159 LD R21,Y+
0101 FDE0 SBRC R30,0
0102 9508 RET
0103 9169 LD R22,Y+
0104 9179 LD R23,Y+
0105 FDE1 SBRC R30,1
0106 9508 RET
0107 90A9 LD R10,Y+
0108 90B9 LD R11,Y+
0109 FDE2 SBRC R30,2
010A 9508 RET
010B 90C9 LD R12,Y+
010C 90D9 LD R13,Y+
010D FDE3 SBRC R30,3
010E 9508 RET
010F 90E9 LD R14,Y+
0110 90F9 LD R15,Y+
0111 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -