📄 timer.s
字号:
.module timer.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
.dbfunc e delay_nus _delay_nus fV
; i -> R10
; n -> R16,R17
.even
_delay_nus::
st -y,R10
.dbline -1
.dbline 11
; #include <iom8515v.h>
; #include <macros.h>
; #define uchar unsigned char
; #define uint unsigned int
; #define DQ PD2
; #define HW 0x04
; uchar HW_OLD;
; uint IRCode[3],IRCON,f,flag,x;
; uint m,c;
; void delay_nus(unsigned int n)//n微秒延时函数
; {
.dbline 13
; uchar i;
; for (i=0;i<n;i++)
clr R10
rjmp L5
L2:
.dbline 14
; {
.dbline 15
; asm("nop");
nop
.dbline 16
; }
L3:
.dbline 13
inc R10
L5:
.dbline 13
mov R2,R10
clr R3
cp R2,R16
cpc R3,R17
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r i 10 c
.dbsym r n 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R10,R11
.even
_delay_nms::
rcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 19
; }
; void delay_nms(unsigned int n)//n毫秒延时函数
; {
.dbline 21
; unsigned int i;
; for (i=0;i<n;i++) //执行n次1毫秒延时
clr R20
clr R21
rjmp L10
L7:
.dbline 22
; delay_nus(1000);
ldi R16,1000
ldi R17,3
rcall _delay_nus
L8:
.dbline 21
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 21
cp R20,R10
cpc R21,R11
brlo L7
X1:
.dbline -2
L6:
.dbline 0 ; func end
rjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r n 10 i
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 25
; }
; void uart0_init(void)
; {
.dbline 26
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 27
; UCSRA = 0x00;
out 0xb,R2
.dbline 28
; UCSRC = BIT(URSEL) | 0x26;
ldi R24,166
out 0x20,R24
.dbline 29
; UBRRL = 0x33; //set baud rate lo
ldi R24,51
out 0x9,R24
.dbline 30
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 31
; UCSRB = 0x18;
ldi R24,24
out 0xa,R24
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e sendchar _sendchar fV
; num -> R16
.even
_sendchar::
.dbline -1
.dbline 34
; }
; void sendchar(uchar num)
; {
.dbline 35
; UDR=num;
out 0xc,R16
L13:
.dbline 36
; while(!(UCSRA&(1<<TXC)));
L14:
.dbline 36
sbis 0xb,6
rjmp L13
X2:
.dbline 37
; UCSRA |= (1<<TXC);
sbi 0xb,6
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbsym r num 16 c
.dbend
.area vector(rom, abs)
.org 2
rjmp _int0_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
.dbline -1
.dbline 41
; }
; #pragma interrupt_handler int0_isr:iv_INT0
; void int0_isr(void)
; {
.dbline 42
; GICR=0X00; //关外部中断
clr R2
out 0x3b,R2
.dbline 43
; init_devices_timer0(); //定时器初始化并开定时器
rcall _init_devices_timer0
.dbline -2
L16:
.dbline 0 ; func end
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbend
.dbfunc e init_devices_int0 _init_devices_int0 fV
.even
_init_devices_int0::
.dbline -1
.dbline 46
; }
; void init_devices_int0(void)
; {
.dbline 47
; CLI();
cli
.dbline 48
; MCUCR = 0x02;
ldi R24,2
out 0x35,R24
.dbline 49
; EMCUCR = 0x00;
clr R2
out 0x36,R2
.dbline 50
; GICR = 0x40;
ldi R24,64
out 0x3b,R24
.dbline 51
; SEI();
sei
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 56
; }
;
;
; void timer0_init(void)
; {
.dbline 57
; TCCR0 = 0x00; //关定时器
clr R2
out 0x33,R2
.dbline 58
; TCNT0 = 0xb0; //定时80us
ldi R24,176
out 0x32,R24
.dbline 59
; OCR0 = 0x50;
ldi R24,80
out 0x31,R24
.dbline 60
; TCCR0 = 0x02; //定时器开始计时8分频
ldi R24,2
out 0x33,R24
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 14
rjmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
; j -> R20
.even
_timer0_ovf_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
rcall push_xgset300C
.dbline -1
.dbline 67
;
; }
; /********************定时器中断服务函数,在此处理接收到的数据************************
; ************************************************************************************/
; #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
; void timer0_ovf_isr(void)
; {
.dbline 69
; uchar j;
; TIMSK = 0x00; //关定时器中断
clr R2
out 0x39,R2
.dbline 70
; TCCR0 = 0x00; //定时器停止计时
out 0x33,R2
.dbline 71
; TCNT0 = 0xb0; //重新装入定时的初值
ldi R24,176
out 0x32,R24
.dbline 72
; c++; //c记录定时器中断的次数
lds R24,_c
lds R25,_c+1
adiw R24,1
sts _c+1,R25
sts _c,R24
.dbline 73
; if((PIND&HW)!=HW_OLD)
lds R2,_HW_OLD
in R24,0x10
andi R24,4
cp R24,R2
breq L20
X3:
.dbline 74
; {
.dbline 75
; HW_OLD=(PIND&HW);
in R24,0x10
andi R24,4
sts _HW_OLD,R24
.dbline 76
; m=c; //每次翻转将定时器中断的次数的值给m,用于记录电平状态的时间 ,m的值会跟随c的值不断更新
lds R2,_c
lds R3,_c+1
sts _m+1,R3
sts _m,R2
.dbline 77
; f++; //记录翻转的次数
lds R24,_f
lds R25,_f+1
adiw R24,1
sts _f+1,R25
sts _f,R24
.dbline 78
; x=f;
movw R2,R24
sts _x+1,R3
sts _x,R2
.dbline 79
; c=0;
clr R2
clr R3
sts _c+1,R3
sts _c,R2
.dbline 80
; }
L20:
.dbline 81
; if(x>3&&x%2==0) //发生第四次翻转时红外的脉冲数据开始有效
lds R2,_x
lds R3,_x+1
ldi R24,3
ldi R25,0
cp R24,R2
cpc R25,R3
brlo X10
rjmp L22
X10:
X4:
sbrc R2,0
rjmp L22
X5:
.dbline 82
; {x=0;
.dbline 82
clr R2
clr R3
sts _x+1,R3
sts _x,R2
.dbline 83
; flag++; //记录存入数组中某一数据的位数,存入8位时应该清零
lds R24,_flag
lds R25,_flag+1
adiw R24,1
sts _flag+1,R25
sts _flag,R24
.dbline 84
; IRCode[IRCON]<<=1;
ldi R24,<_IRCode
ldi R25,>_IRCode
lds R2,_IRCON
lds R3,_IRCON+1
lsl R2
rol R3
add R2,R24
adc R3,R25
movw R30,R2
ldd R2,z+0
ldd R3,z+1
lsl R2
rol R3
std z+1,R3
std z+0,R2
.dbline 85
; if(m>12) IRCode[IRCON]|=0x01;//为1是左移后最后一位写1。m的值为一个范围,在7和16之间
ldi R24,12
ldi R25,0
lds R2,_m
lds R3,_m+1
cp R24,R2
cpc R25,R3
brsh L24
X6:
.dbline 85
ldi R24,<_IRCode
ldi R25,>_IRCode
lds R10,_IRCON
lds R11,_IRCON+1
lsl R10
rol R11
add R10,R24
adc R11,R25
movw R30,R10
ldd R24,z+0
ldd R25,z+1
ori R24,1
std z+1,R25
std z+0,R24
rjmp L25
L24:
.dbline 86
; else IRCode[IRCON]&=0XFE;
ldi R24,<_IRCode
ldi R25,>_IRCode
lds R10,_IRCON
lds R11,_IRCON+1
lsl R10
rol R11
add R10,R24
adc R11,R25
movw R30,R10
ldd R24,z+0
ldd R25,z+1
andi R24,254
andi R25,0
std z+1,R25
std z+0,R24
L25:
.dbline 88
; //PORTB=m;
; }
L22:
.dbline 89
; if(flag==8)
lds R24,_flag
lds R25,_flag+1
cpi R24,8
ldi R30,0
cpc R25,R30
brne L26
X7:
.dbline 90
; {
.dbline 91
; flag=0;
clr R2
clr R3
sts _flag+1,R3
sts _flag,R2
.dbline 92
; IRCON++; //存满一个数据后数组的指针要加一
lds R24,_IRCON
lds R25,_IRCON+1
adiw R24,1
sts _IRCON+1,R25
sts _IRCON,R24
.dbline 93
; if(IRCON==4) //数组中的数据存满
cpi R24,4
ldi R30,0
cpc R25,R30
brne L28
X8:
.dbline 94
; {
.dbline 96
;
; IRCON=0;
sts _IRCON+1,R3
sts _IRCON,R2
.dbline 97
; uart0_init(); //开始向串口发送数据
rcall _uart0_init
.dbline 98
; for(j=0;j<4;j++)
clr R20
rjmp L33
L30:
.dbline 99
; {
.dbline 100
; sendchar(IRCode[j]);
ldi R24,<_IRCode
ldi R25,>_IRCode
mov R30,R20
clr R31
lsl R30
rol R31
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _sendchar
.dbline 102
; //PORTB=IRCode[0];
; }
L31:
.dbline 98
inc R20
L33:
.dbline 98
cpi R20,4
brlo L30
X9:
.dbline 103
; f=0;
clr R2
clr R3
sts _f+1,R3
sts _f,R2
.dbline 106
; // delay_nms(1000);
; // TIMSK = 0x00; //关定时器中断
; GICR=0X40; //开外部中断
ldi R24,64
out 0x3b,R24
.dbline 107
; }
L28:
.dbline 110
;
;
; }
L26:
.dbline 111
; TCCR0 = 0x02;
ldi R24,2
out 0x33,R24
.dbline 112
; TIMSK = 0x02;
out 0x39,R24
.dbline -2
L19:
.dbline 0 ; func end
rcall pop_xgset300C
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r j 20 c
.dbend
.dbfunc e init_devices_timer0 _init_devices_timer0 fV
.even
_init_devices_timer0::
.dbline -1
.dbline 116
; }
;
; void init_devices_timer0(void)
; {
.dbline 117
; CLI();
cli
.dbline 118
; timer0_init();
rcall _timer0_init
.dbline 119
; TIMSK = 0x02; //开定时器中断
ldi R24,2
out 0x39,R24
.dbline 120
; SEI();
sei
.dbline -2
L34:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 125
; }
;
;
; void main(void)
; {
.dbline 126
; DDRD&=~BIT(0);
cbi 0x11,0
.dbline 127
; DDRD|=BIT(1);
sbi 0x11,1
.dbline 128
; DDRD&=~BIT(2);
cbi 0x11,2
.dbline 129
; DDRB=0XFF;
ldi R24,255
out 0x17,R24
.dbline 130
; init_devices_int0();
rcall _init_devices_int0
L36:
.dbline 131
; while(1);
L37:
.dbline 131
rjmp L36
X11:
.dbline -2
L35:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\TIMER\timer.c
_c::
.blkb 2
.dbsym e c _c i
_m::
.blkb 2
.dbsym e m _m i
_x::
.blkb 2
.dbsym e x _x i
_flag::
.blkb 2
.dbsym e flag _flag i
_f::
.blkb 2
.dbsym e f _f i
_IRCON::
.blkb 2
.dbsym e IRCON _IRCON i
_IRCode::
.blkb 6
.dbsym e IRCode _IRCode A[6:3]i
_HW_OLD::
.blkb 1
.dbsym e HW_OLD _HW_OLD c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -