📄 timer.lis
字号:
.module timer.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
0000 .dbfunc e delay_nus _delay_nus fV
0000 ; i -> R10
0000 ; n -> R16,R17
.even
0000 _delay_nus::
0000 AA92 st -y,R10
0002 .dbline -1
0002 .dbline 11
0002 ; #include <iom8515v.h>
0002 ; #include <macros.h>
0002 ; #define uchar unsigned char
0002 ; #define uint unsigned int
0002 ; #define DQ PD2
0002 ; #define HW 0x04
0002 ; uchar HW_OLD;
0002 ; uint IRCode[3],IRCON,f,flag,x;
0002 ; uint m,c;
0002 ; void delay_nus(unsigned int n)//n微秒延时函数
0002 ; {
0002 .dbline 13
0002 ; uchar i;
0002 ; for (i=0;i<n;i++)
0002 AA24 clr R10
0004 02C0 rjmp L5
0006 L2:
0006 .dbline 14
0006 ; {
0006 .dbline 15
0006 ; asm("nop");
0006 0000 nop
0008 .dbline 16
0008 ; }
0008 L3:
0008 .dbline 13
0008 A394 inc R10
000A L5:
000A .dbline 13
000A 2A2C mov R2,R10
000C 3324 clr R3
000E 2016 cp R2,R16
0010 3106 cpc R3,R17
0012 C8F3 brlo L2
0014 X0:
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 A990 ld R10,y+
0016 0895 ret
0018 .dbsym r i 10 c
0018 .dbsym r n 16 i
0018 .dbend
0018 .dbfunc e delay_nms _delay_nms fV
0018 ; i -> R20,R21
0018 ; n -> R10,R11
.even
0018 _delay_nms::
0018 00D0 rcall push_xgset300C
001A 5801 movw R10,R16
001C .dbline -1
001C .dbline 19
001C ; }
001C ; void delay_nms(unsigned int n)//n毫秒延时函数
001C ; {
001C .dbline 21
001C ; unsigned int i;
001C ; for (i=0;i<n;i++) //执行n次1毫秒延时
001C 4427 clr R20
001E 5527 clr R21
0020 05C0 rjmp L10
0022 L7:
0022 .dbline 22
0022 ; delay_nus(1000);
0022 08EE ldi R16,1000
0024 13E0 ldi R17,3
0026 ECDF rcall _delay_nus
0028 L8:
0028 .dbline 21
0028 4F5F subi R20,255 ; offset = 1
002A 5F4F sbci R21,255
002C L10:
002C .dbline 21
002C 4A15 cp R20,R10
002E 5B05 cpc R21,R11
0030 C0F3 brlo L7
0032 X1:
0032 .dbline -2
0032 L6:
0032 .dbline 0 ; func end
0032 00C0 rjmp pop_xgset300C
0034 .dbsym r i 20 i
0034 .dbsym r n 10 i
0034 .dbend
0034 .dbfunc e uart0_init _uart0_init fV
.even
0034 _uart0_init::
0034 .dbline -1
0034 .dbline 25
0034 ; }
0034 ; void uart0_init(void)
0034 ; {
0034 .dbline 26
0034 ; UCSRB = 0x00; //disable while setting baud rate
0034 2224 clr R2
0036 2AB8 out 0xa,R2
0038 .dbline 27
0038 ; UCSRA = 0x00;
0038 2BB8 out 0xb,R2
003A .dbline 28
003A ; UCSRC = BIT(URSEL) | 0x26;
003A 86EA ldi R24,166
003C 80BD out 0x20,R24
003E .dbline 29
003E ; UBRRL = 0x33; //set baud rate lo
003E 83E3 ldi R24,51
0040 89B9 out 0x9,R24
0042 .dbline 30
0042 ; UBRRH = 0x00; //set baud rate hi
0042 20BC out 0x20,R2
0044 .dbline 31
0044 ; UCSRB = 0x18;
0044 88E1 ldi R24,24
0046 8AB9 out 0xa,R24
0048 .dbline -2
0048 L11:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e sendchar _sendchar fV
004A ; num -> R16
.even
004A _sendchar::
004A .dbline -1
004A .dbline 34
004A ; }
004A ; void sendchar(uchar num)
004A ; {
004A .dbline 35
004A ; UDR=num;
004A 0CB9 out 0xc,R16
004C L13:
004C .dbline 36
004C ; while(!(UCSRA&(1<<TXC)));
004C L14:
004C .dbline 36
004C 5E9B sbis 0xb,6
004E FECF rjmp L13
0050 X2:
0050 .dbline 37
0050 ; UCSRA |= (1<<TXC);
0050 5E9A sbi 0xb,6
0052 .dbline -2
0052 L12:
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r num 16 c
0054 .dbend
.area vector(rom, abs)
.org 2
0002 2AC0 rjmp _int0_isr
.area text(rom, con, rel)
0054 .dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
0054 .dbfunc e int0_isr _int0_isr fV
.even
0054 _int0_isr::
0054 0A92 st -y,R0
0056 1A92 st -y,R1
0058 2A92 st -y,R2
005A 3A92 st -y,R3
005C 4A92 st -y,R4
005E 5A92 st -y,R5
0060 6A92 st -y,R6
0062 7A92 st -y,R7
0064 8A92 st -y,R8
0066 9A92 st -y,R9
0068 0A93 st -y,R16
006A 1A93 st -y,R17
006C 2A93 st -y,R18
006E 3A93 st -y,R19
0070 8A93 st -y,R24
0072 9A93 st -y,R25
0074 AA93 st -y,R26
0076 BA93 st -y,R27
0078 EA93 st -y,R30
007A FA93 st -y,R31
007C 0FB6 in R0,0x3f
007E 0A92 st -y,R0
0080 .dbline -1
0080 .dbline 41
0080 ; }
0080 ; #pragma interrupt_handler int0_isr:iv_INT0
0080 ; void int0_isr(void)
0080 ; {
0080 .dbline 42
0080 ; GICR=0X00; //关外部中断
0080 2224 clr R2
0082 2BBE out 0x3b,R2
0084 .dbline 43
0084 ; init_devices_timer0(); //定时器初始化并开定时器
0084 1DD1 rcall _init_devices_timer0
0086 .dbline -2
0086 L16:
0086 .dbline 0 ; func end
0086 0990 ld R0,y+
0088 0FBE out 0x3f,R0
008A F991 ld R31,y+
008C E991 ld R30,y+
008E B991 ld R27,y+
0090 A991 ld R26,y+
0092 9991 ld R25,y+
0094 8991 ld R24,y+
0096 3991 ld R19,y+
0098 2991 ld R18,y+
009A 1991 ld R17,y+
009C 0991 ld R16,y+
009E 9990 ld R9,y+
00A0 8990 ld R8,y+
00A2 7990 ld R7,y+
00A4 6990 ld R6,y+
00A6 5990 ld R5,y+
00A8 4990 ld R4,y+
00AA 3990 ld R3,y+
00AC 2990 ld R2,y+
00AE 1990 ld R1,y+
00B0 0990 ld R0,y+
00B2 1895 reti
00B4 .dbend
00B4 .dbfunc e init_devices_int0 _init_devices_int0 fV
.even
00B4 _init_devices_int0::
00B4 .dbline -1
00B4 .dbline 46
00B4 ; }
00B4 ; void init_devices_int0(void)
00B4 ; {
00B4 .dbline 47
00B4 ; CLI();
00B4 F894 cli
00B6 .dbline 48
00B6 ; MCUCR = 0x02;
00B6 82E0 ldi R24,2
00B8 85BF out 0x35,R24
00BA .dbline 49
00BA ; EMCUCR = 0x00;
00BA 2224 clr R2
00BC 26BE out 0x36,R2
00BE .dbline 50
00BE ; GICR = 0x40;
00BE 80E4 ldi R24,64
00C0 8BBF out 0x3b,R24
00C2 .dbline 51
00C2 ; SEI();
00C2 7894 sei
00C4 .dbline -2
00C4 L17:
00C4 .dbline 0 ; func end
00C4 0895 ret
00C6 .dbend
00C6 .dbfunc e timer0_init _timer0_init fV
.even
00C6 _timer0_init::
00C6 .dbline -1
00C6 .dbline 56
00C6 ; }
00C6 ;
00C6 ;
00C6 ; void timer0_init(void)
00C6 ; {
00C6 .dbline 57
00C6 ; TCCR0 = 0x00; //关定时器
00C6 2224 clr R2
00C8 23BE out 0x33,R2
00CA .dbline 58
00CA ; TCNT0 = 0xb0; //定时80us
00CA 80EB ldi R24,176
00CC 82BF out 0x32,R24
00CE .dbline 59
00CE ; OCR0 = 0x50;
00CE 80E5 ldi R24,80
00D0 81BF out 0x31,R24
00D2 .dbline 60
00D2 ; TCCR0 = 0x02; //定时器开始计时8分频
00D2 82E0 ldi R24,2
00D4 83BF out 0x33,R24
00D6 .dbline -2
00D6 L18:
00D6 .dbline 0 ; func end
00D6 0895 ret
00D8 .dbend
.area vector(rom, abs)
.org 14
000E 6CC0 rjmp _timer0_ovf_isr
.area text(rom, con, rel)
00D8 .dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
00D8 .dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
00D8 ; j -> R20
.even
00D8 _timer0_ovf_isr::
00D8 0A92 st -y,R0
00DA 1A92 st -y,R1
00DC 2A92 st -y,R2
00DE 3A92 st -y,R3
00E0 4A92 st -y,R4
00E2 5A92 st -y,R5
00E4 6A92 st -y,R6
00E6 7A92 st -y,R7
00E8 8A92 st -y,R8
00EA 9A92 st -y,R9
00EC 0A93 st -y,R16
00EE 1A93 st -y,R17
00F0 2A93 st -y,R18
00F2 3A93 st -y,R19
00F4 8A93 st -y,R24
00F6 9A93 st -y,R25
00F8 AA93 st -y,R26
00FA BA93 st -y,R27
00FC EA93 st -y,R30
00FE FA93 st -y,R31
0100 0FB6 in R0,0x3f
0102 0A92 st -y,R0
0104 00D0 rcall push_xgset300C
0106 .dbline -1
0106 .dbline 67
0106 ;
0106 ; }
0106 ; /********************定时器中断服务函数,在此处理接收到的数据************************
0106 ; ************************************************************************************/
0106 ; #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
0106 ; void timer0_ovf_isr(void)
0106 ; {
0106 .dbline 69
0106 ; uchar j;
0106 ; TIMSK = 0x00; //关定时器中断
0106 2224 clr R2
0108 29BE out 0x39,R2
010A .dbline 70
010A ; TCCR0 = 0x00; //定时器停止计时
010A 23BE out 0x33,R2
010C .dbline 71
010C ; TCNT0 = 0xb0; //重新装入定时的初值
010C 80EB ldi R24,176
010E 82BF out 0x32,R24
0110 .dbline 72
0110 ; c++; //c记录定时器中断的次数
0110 80910000 lds R24,_c
0114 90910100 lds R25,_c+1
0118 0196 adiw R24,1
011A 90930100 sts _c+1,R25
011E 80930000 sts _c,R24
0122 .dbline 73
0122 ; if((PIND&HW)!=HW_OLD)
0122 20901200 lds R2,_HW_OLD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -