⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.s

📁 万能遥控器解码
💻 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 + -