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

📄 irremote.s

📁 ICCAVR环境下
💻 S
字号:
	.module irremote.c
	.area text(rom, con, rel)
	.dbfile D:\M16开发板实验教程\icc-avr\irremote/delay.h
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 10
; /* 
;     Title:    icc-avr irremote
;     Author:   dushibiao
;     Date:     2007 10 19
;     Purpose:   control your pc use a ir remoter
;     Frequency: internal 8M
;     needed
;     Software: icc-avr to compile
;     needed
;     Hardware: AVR mega16 BOARD
	.dbline 11
;     Connect:  dushibiao@126.com
	nop
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 15
; */
; #include <iom16v.h>
; #include <macros.h>
; #include "shumaguan.h"
	.dbline 16
; 
	clr R20
	clr R21
	.dbline 17
; #define  IR      2             //PB2,irfrade receive line
	xjmp L6
L3:
	.dbline 18
	xcall _delay_1us
L4:
	.dbline 17
	subi R20,255  ; offset = 1
	sbci R21,255
L6:
	.dbline 17
	cp R20,R22
	cpc R21,R23
	brlo L3
	.dbline -2
L2:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 22
; #define PIN_RXD			0 	//PD0   RXD
; #define PIN_TXD			1 	//PD1   TXD
; #define BAUDRATE        9600	//baudrate
; #define F_CPU			8000000 //the frequency of the global clock
; 
	.dbline 24
	clr R16
	clr R17
	xjmp L11
L8:
	.dbline 24
L9:
	.dbline 24
	subi R16,255  ; offset = 1
	sbci R17,255
L11:
	.dbline 24
; 
; volatile unsigned char flag,code;
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L8
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nms::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 28
; 
; 
; void delay0_9ms(void)
; {
	.dbline 29
;     delay_nus(510);
	clr R20
	clr R21
	.dbline 30
; }
	xjmp L16
L13:
	.dbline 31
	xcall _delay_1ms
L14:
	.dbline 30
	subi R20,255  ; offset = 1
	sbci R21,255
L16:
	.dbline 30
	cp R20,R22
	cpc R21,R23
	brlo L13
	.dbline -2
L12:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.area lit(rom, con, rel)
_discode::
	.byte 192,249
	.byte 164,176
	.byte 153,146
	.byte 130,248
	.byte 128,144
	.byte 136,131
	.byte 198,161
	.byte 134,142
	.byte 191
	.dbfile D:\M16开发板实验教程\icc-avr\irremote/shumaguan.h
	.dbsym e discode _discode A[17:17]kc
	.area text(rom, con, rel)
	.dbfile D:\M16开发板实验教程\icc-avr\irremote/shumaguan.h
	.dbfunc e display _display fV
;            num -> R20
	.even
_display::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 21
	.dbline 22
	cbi 0x18,0
	.dbline 24
	ldi R24,<_discode
	ldi R25,>_discode
	mov R30,R20
	clr R31
	asr R31
	ror R30
	asr R31
	ror R30
	asr R31
	ror R30
	asr R31
	ror R30
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 25
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline 26
	sbi 0x18,0
	.dbline 28
	cbi 0x18,1
	.dbline 29
	ldi R18,16
	ldi R19,0
	mov R16,R20
	clr R17
	xcall mod16s
	movw R30,R16
	ldi R24,<_discode
	ldi R25,>_discode
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x1b,R30
	.dbline 30
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline 31
; 
	sbi 0x18,1
	.dbline -2
L17:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r num 20 c
	.dbend
	.dbfunc e displayerror _displayerror fV
	.even
_displayerror::
	.dbline -1
	.dbline 38
; //4.5ms
; void delay4_5ms(void)
; {
;    delay_nms(4);
;    delay_nus(320);
; }
; /*---------------------------------------------------------------------------
	.dbline 39
; function      send an unsigned char to the uart
	cbi 0x18,0
	.dbline 41
; ----------------------------------------------------------------------------*/
; void put_c(unsigned char c) //发送采用查询方式
	ldi R30,<_discode+16
	ldi R31,>_discode+16
	lpm R30,Z
	out 0x1b,R30
	.dbline 42
; {
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline 43
; 	while( !(UCSRA & (1<<UDRE)) );        //wait until the uart is empty
	sbi 0x18,0
	.dbline 45
; 	UDR=c;                                  //write data to uart
; }
	cbi 0x18,1
	.dbline 46
; /*---------------------------------------------------------------------------
	ldi R30,<_discode+16
	ldi R31,>_discode+16
	lpm R30,Z
	out 0x1b,R30
	.dbline 47
; fuction     initialize the uart  unit
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline 48
; ----------------------------------------------------------------------------*/
	sbi 0x18,1
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
	.dbfunc e delay0_9ms _delay0_9ms fV
	.even
_delay0_9ms::
	.dbline -1
	.dbline 28
	.dbline 29
	ldi R16,510
	ldi R17,1
	xcall _delay_nus
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay4_5ms _delay4_5ms fV
	.even
_delay4_5ms::
	.dbline -1
	.dbline 34
	.dbline 35
	ldi R16,4
	ldi R17,0
	xcall _delay_nms
	.dbline 36
	ldi R16,320
	ldi R17,1
	xcall _delay_nus
	.dbline -2
L22:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e put_c _put_c fV
;              c -> R16
	.even
_put_c::
	.dbline -1
	.dbline 42
L24:
	.dbline 43
L25:
	.dbline 43
	sbis 0xb,5
	rjmp L24
	.dbline 44
	out 0xc,R16
	.dbline -2
L23:
	.dbline 0 ; func end
	ret
	.dbsym r c 16 c
	.dbend
	.dbfunc e init_USART _init_USART fV
	.even
_init_USART::
	.dbline -1
	.dbline 50
; void init_USART(void)//USART 初始化
; {
	.dbline 53
; 
;     //USART 9600 8, n,1  PC上位机软件(超级终端等)也要设成同样的设置才能通讯
;     UCSRC = (1<<URSEL) | 0x06;
	ldi R24,134
	out 0x20,R24
	.dbline 69
;     //异步,8位数据,无奇偶校验,一个停止位,无倍速
;     /*
;     UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
;     写访问
;     当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
;     若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
;     
;     读访问
;     对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
;     
;     
;     没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
;     */
;     
;     //U2X=0时的公式计算
;     UBRRL= (F_CPU/BAUDRATE/16-1)%256;
	ldi R24,51
	out 0x9,R24
	.dbline 70
;     UBRRH= (F_CPU/BAUDRATE/16-1)/256;
	clr R2
	out 0x20,R2
	.dbline 77
;     //U2X=1时的公式计算
;     //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
;     //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
;     //也可根据数据手册的[波特率设置的例子]查得
;     //UBRRL = 0x2F; //set baud rate lo
;     //UBRRH = 0x00; //set baud rate hi
;     UCSRA = 0x00;                     //无倍速
	out 0xb,R2
	.dbline 78
;     UCSRB = (1<<RXEN)|(1<<TXEN);
	ldi R24,24
	out 0xa,R24
	.dbline -2
L27:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 83
;     //使能接收,使能发送
; }
; 
; void main(void)
; {
	.dbline 84
;    PORTA=0XFF;         
	ldi R24,255
	out 0x1b,R24
	.dbline 85
; 	DDRA=0XFF;                  //OUT
	out 0x1a,R24
	.dbline 86
; 	PORTB=0XFF;
	out 0x18,R24
	.dbline 87
; 	DDRB=0X03;                 //PB0,PB1  OUT
	ldi R24,3
	out 0x17,R24
	.dbline 88
; 	PORTC=0XFF;     
	ldi R24,255
	out 0x15,R24
	.dbline 89
;     DDRD  =(1<<PIN_TXD);								//TXD为输出   
	ldi R24,2
	out 0x11,R24
	.dbline 90
; 	init_USART();      
	xcall _init_USART
	.dbline 91
; 	MCUCSR &=~(1<<ISC2);         //falling edge interrupt
	in R24,0x34
	andi R24,191
	out 0x34,R24
	.dbline 92
; 	GIFR=(1<<INTF2);             //写1清除标志位,在使能中断前最好先把对应的标志位清除,以免误触发
	ldi R24,32
	out 0x3a,R24
	.dbline 93
;     GICR=(1<<INT2);	         //使能INT2外部中断
	out 0x3b,R24
	.dbline 94
;     SEI();						//使能全局中断
	sei
	.dbline 95
; 	flag=0;
	clr R2
	sts _flag,R2
	xjmp L30
L29:
	.dbline 97
; 	while(1)
; 	{
	.dbline 98
; 		if(flag==1)
	lds R24,_flag
	cpi R24,1
	brne L32
	.dbline 99
; 		{
	.dbline 100
; 		  display(code);
	lds R16,_code
	xcall _display
	.dbline 101
; 		}
	xjmp L33
L32:
	.dbline 103
; 		else
; 		{
	.dbline 104
; 		 displayerror();
	xcall _displayerror
	.dbline 105
; 	    }
L33:
	.dbline 107
L30:
	.dbline 96
	xjmp L29
X0:
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 72
	jmp _int2pro
	.area text(rom, con, rel)
	.dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
	.dbfunc e int2pro _int2pro fV
;              k -> R20
;             aa -> y+0
;              i -> R10
;             dm -> R22
;              j -> R12
	.even
_int2pro::
	xcall push_lset
	xcall push_gset4
	sbiw R28,2
	.dbline -1
	.dbline 115
; 		
; 	}
; }
; 
; /**********************************************************************
; function: ext2 interrupt service function 
; **********************************************************************/
; #pragma interrupt_handler int2pro: iv_INT2
; void int2pro(void) //INT2中断服务程序
; {
	.dbline 116
;   unsigned char i,j,k,dm=0,aa[2];
	clr R22
	.dbline 117
;    for(k=0;k<10;k++)            //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序
	clr R20
	xjmp L38
L35:
	.dbline 118
;   {                              //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
	.dbline 120
;     
;     delay0_9ms();                   //延时0.9毫秒
	xcall _delay0_9ms
	.dbline 121
;     if ((PINB&(1<<IR))==(1<<IR))
	in R24,0x16
	andi R24,4
	cpi R24,4
	brne L39
	.dbline 122
;            {k=10;break;}    //延时0.9毫秒后判断PB2脚是否出现高电平如果有就退出解码程序
	.dbline 122
	ldi R20,10
	.dbline 122
	xjmp L37
L39:
	.dbline 123
;     else if(k==9)                //重复10次?
	cpi R20,9
	breq X3
	xjmp L41
X3:
	.dbline 124
;     {                     //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
L43:
	.dbline 125
L44:
	.dbline 125
;             while((PINB&(1<<IR))==0);       //等待高电平避开9毫秒低电平引导脉冲
	sbis 0x16,2
	rjmp L43
	.dbline 126
;             delay4_5ms();           //延时4.5毫秒避开4.5毫秒的结果码
	xcall _delay4_5ms
	.dbline 132
; 
; 			
; /********************************************
; //26位的用户码,前13位数据码,后13位数据反码
; *********************************************/
;               for(j=1;j<=26;j++)//每组数据为26位
	clr R12
	inc R12
	xjmp L49
X1:
	.dbline 133
;                 {                 
L50:
	.dbline 134
L51:
	.dbline 134
;                  while((PINB&(1<<IR))==0);  //
	sbis 0x16,2
	rjmp L50
	.dbline 135
;                  delay0_9ms();
	xcall _delay0_9ms
	.dbline 136
;                   if((PINB&(1<<IR))==(1<<IR))
	in R24,0x16
	andi R24,4
	cpi R24,4
	brne L53
	.dbline 137
;                    {
	.dbline 138
; 					   delay_nms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_nms
	.dbline 139
; 	               }
L53:
	.dbline 140
L47:
	.dbline 132
	inc R12
L49:
	.dbline 132
	ldi R24,26
	cp R24,R12
	brsh L51
	.dbline 147
;                 }
; 
; 
; /***************************************************
; //16位的用户码,前8位数据码,后8位数据反码
; ****************************************************/
; 
; 			  for(i=0;i<2;i++)     
	clr R10
	xjmp L58
L55:
	.dbline 148
;                {                
	.dbline 149
;                  for(j=1;j<=8;j++)//每组数据为8位
	clr R12
	inc R12
	xjmp L62
X2:
	.dbline 150
;                 {                
L63:
	.dbline 151
L64:
	.dbline 151
;                  while((PINB&(1<<IR))==0);  //
	sbis 0x16,2
	rjmp L63
	.dbline 152
;                  delay0_9ms();
	xcall _delay0_9ms
	.dbline 153
;                   if((PINB&(1<<IR))==(1<<IR))
	in R24,0x16
	andi R24,4
	cpi R24,4
	brne L66
	.dbline 154
;                    {
	.dbline 155
; 				     delay_nms(1);
	ldi R16,1
	ldi R17,0
	xcall _delay_nms
	.dbline 156
;                      dm=dm|0x80;
	ori R22,128
	.dbline 157
;                      if(j<8) dm=dm>>1;           //数据"1",右移一个"1",一共7次
	mov R24,R12
	cpi R24,8
	brsh L67
	.dbline 157
	lsr R22
	.dbline 158
;                    }                
	xjmp L67
L66:
	.dbline 159
;                   else  if(j<8) dm=dm>>1;          //数据"0",一共7次
	mov R24,R12
	cpi R24,8
	brsh L70
	.dbline 159
	lsr R22
L70:
L67:
	.dbline 160
L60:
	.dbline 149
	inc R12
L62:
	.dbline 149
	ldi R24,8
	cp R24,R12
	brsh L64
	.dbline 161
	movw R24,R28
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R22
	.dbline 162
	clr R22
	.dbline 163
L56:
	.dbline 147
	inc R10
L58:
	.dbline 147
	mov R24,R10
	cpi R24,2
	brlo L55
	.dbline 164
;                 }                    
;              aa[i]=dm;
;              dm=0;
;                } 
; 			  if(aa[0]=~aa[1])
	ldd R2,y+1
	com R2
	std y+0,R2
	tst R2
	breq L72
	.dbline 165
; 			  {  
	.dbline 166
;                code=aa[0];
	sts _code,R2
	.dbline 167
; 			   flag=1; 
	ldi R24,1
	sts _flag,R24
	.dbline 168
; 			   put_c(code);    
	lds R16,_code
	xcall _put_c
	.dbline 169
; 			  }       
L72:
	.dbline 171
;             
;           }                    
L41:
	.dbline 172
L36:
	.dbline 117
	inc R20
L38:
	.dbline 117
	cpi R20,10
	brsh X4
	xjmp L35
X4:
L37:
	.dbline -2
L34:
	adiw R28,2
	xcall pop_gset4
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r k 20 c
	.dbsym l aa 0 A[2:2]c
	.dbsym r i 10 c
	.dbsym r dm 22 c
	.dbsym r j 12 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
_code::
	.blkb 1
	.dbsym e code _code c
_flag::
	.blkb 1
	.dbsym e flag _flag c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -