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

📄 main.s

📁 AVR 红外接收源代码,对学习红外的人很有帮助
💻 S
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\main.c
	.dbfunc e delay_us _delay_us fV
;              i -> R20,R21
;              n -> R16,R17
	.even
_delay_us::
	rcall push_gset1
	.dbline -1
	.dbline 22
; /******************************************/
; /*             北京MCU学习之家            */
; /*            红外输入演示程序            */
; /*             作者:白如冰                */
; /*             2005年10月1日              */
; /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
; /******************************************/
; //  1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
; //  2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
; 
; #include <iom8v.h>
; #include <macros.h>
; #include "infrared_test.h"
; #define fosc 8000000 //晶振8MHZ
; #define baud 9600	 //波特率
; #define buffer_max    75
; 
; extern void init_infr(void);
; unsigned char uia_data[5];  //5位ASC码存储区
; 
; void delay_us(unsigned int n)
; {
	.dbline 24
	movw R20,R16
	rjmp L5
L2:
	.dbline 24
L3:
	.dbline 24
	subi R20,1
	sbci R21,0
L5:
	.dbline 24
;   unsigned int i;
;   for(i=n;i>0;i--);
	cpi R20,0
	cpc R20,R21
	brne L2
X0:
	.dbline -2
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 28
;   }
;   
; void delay_1ms(void)
; { unsigned int i;
	.dbline 29
;  for(i=1;i<(unsigned int)(1144-2);i++)
	ldi R16,1
	ldi R17,0
	rjmp L10
L7:
	.dbline 30
L8:
	.dbline 29
	subi R16,255  ; offset = 1
	sbci R17,255
L10:
	.dbline 29
	cpi R16,118
	ldi R30,4
	cpc R17,R30
	brlo L7
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_ms::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 33
;     ;
; }
; void delay_ms(unsigned int n)
; {
	.dbline 34
;  unsigned int i=0;
	clr R20
	clr R21
	rjmp L13
L12:
	.dbline 36
	.dbline 36
	rcall _delay_1ms
	.dbline 37
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 38
L13:
	.dbline 35
;    while(i<n)
	cp R20,R22
	cpc R21,R23
	brlo L12
	.dbline -2
L11:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e uint_asc _uint_asc fpc
;           temp -> R22,R23
;            uia -> R20,R21
;           data -> R10,R11
	.even
_uint_asc::
	rcall push_gset3
	movw R10,R16
	.dbline -1
	.dbline 42
;    {delay_1ms();
;     i++;
;    }
; }  													
; 
; unsigned char *uint_asc(unsigned int data)  //字转换为5位ASC码
; {
	.dbline 45
;   unsigned char *uia;
;   unsigned int temp;
;   uia=uia_data;
	ldi R20,<_uia_data
	ldi R21,>_uia_data
	.dbline 47
;   
;   temp=data;
	movw R22,R10
	.dbline 48
;   uia+=4;
	subi R20,252  ; offset = 4
	sbci R21,255
	.dbline 49
;   *uia--=temp%10+0x30;
	movw R2,R20
	subi R20,1
	sbci R21,0
	ldi R18,10
	ldi R19,0
	movw R16,R22
	rcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R2
	std z+0,R24
	.dbline 50
;   temp=data;
	.dbline 51
;   *uia--=(temp/10)%10+0x30;
	movw R2,R20
	subi R20,1
	sbci R21,0
	ldi R18,10
	ldi R19,0
	movw R16,R22
	rcall div16u
	ldi R18,10
	ldi R19,0
	rcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R2
	std z+0,R24
	.dbline 52
;   temp=data;
	.dbline 53
;   *uia--=(temp/100)%10+0x30;
	movw R2,R20
	subi R20,1
	sbci R21,0
	ldi R18,100
	ldi R19,0
	movw R16,R22
	rcall div16u
	ldi R18,10
	ldi R19,0
	rcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R2
	std z+0,R24
	.dbline 54
;   temp=data;
	.dbline 55
;   *uia--=(temp/1000)%10+0x30;
	movw R2,R20
	subi R20,1
	sbci R21,0
	ldi R18,1000
	ldi R19,3
	movw R16,R22
	rcall div16u
	ldi R18,10
	ldi R19,0
	rcall mod16u
	movw R24,R16
	adiw R24,48
	movw R30,R2
	std z+0,R24
	.dbline 56
;   *uia=temp/10000+0x30;
	ldi R18,10000
	ldi R19,39
	movw R16,R22
	rcall div16u
	movw R24,R16
	adiw R24,48
	movw R30,R20
	std z+0,R24
	.dbline 57
;   uia=uia_data;
	ldi R20,<_uia_data
	ldi R21,>_uia_data
	.dbline 58
;   return(uia);
	movw R16,R20
	.dbline -2
L15:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp 22 i
	.dbsym r uia 20 pc
	.dbsym r data 10 i
	.dbend
	.dbfunc e putchar _putchar fV
;              c -> R16
	.even
_putchar::
	.dbline -1
	.dbline 63
; }
; 
; /*  		字符输出函数 		 */
; void putchar(unsigned char c)
; 	{	 
L17:
	.dbline 64
L18:
	.dbline 64
;      while (!(UCSRA&(1<<UDRE)));
	sbis 0xb,5
	rjmp L17
	.dbline 65
; 	 UDR=c;    
	out 0xc,R16
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbsym r c 16 c
	.dbend
	.dbfunc e puts _puts fI
;              s -> R20,R21
	.even
_puts::
	rcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 70
; 	}
; 
; /*			字符串输出函数	   	 */	
; int puts(char *s)
; 	{
	rjmp L22
L21:
	.dbline 72
	.dbline 73
	movw R30,R20
	ldd R16,z+0
	rcall _putchar
	.dbline 74
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 75
L22:
	.dbline 71
; 	while (*s)
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L21
	.dbline 76
; 		{
; 		putchar(*s);
; 		s++;
; 		}	
;     	return 1;
	ldi R16,1
	ldi R17,0
	.dbline -2
L20:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbend
	.dbfunc e puts_hh _puts_hh fV
;              s -> R20,R21
	.even
_puts_hh::
	rcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 80
; 	}
; /*	 	   含回车换行的字符串输出函数 	 */	
; void puts_hh(char *s)
; 	{
	rjmp L26
L25:
	.dbline 82
	.dbline 83
	movw R30,R20
	ldd R16,z+0
	rcall _putchar
	.dbline 84
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 85
L26:
	.dbline 81
; 	while (*s)
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L25
	.dbline 86
; 		{
; 		putchar(*s);
; 		s++;
; 		}	
;     putchar(0x0a);//换行
	ldi R16,10
	rcall _putchar
	.dbline 87
; 	putchar(0x0d);//回车
	ldi R16,13
	rcall _putchar
	.dbline -2
L24:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbend
	.dbfunc e uart_init _uart_init fV
	.even
_uart_init::
	.dbline -1
	.dbline 91
; 	}	
; /*			UART初始化				*/	
; void uart_init(void)
; {
	.dbline 92
;  UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
	ldi R24,24
	out 0xa,R24
	.dbline 93
;  UBRRL=(fosc/16/(baud+1))%256;
	ldi R24,52
	out 0x9,R24
	.dbline 94
;  UBRRH=(fosc/16/(baud+1))/256;
	clr R2
	out 0x20,R2
	.dbline 95
;  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位停止位
	ldi R24,134
	out 0x20,R24
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              i -> <dead>
	.even
_main::
	.dbline -1
	.dbline 99
; }
; 
; void main(void)
; {
	.dbline 102
;   unsigned char i;
;  
;   uart_init();
	rcall _uart_init
	.dbline 103
;   init_infr();
	rcall _init_infr
	rjmp L31
L30:
	.dbline 106
;   
;   while(1)
;    {
	.dbline 107
;      puts("请按键: ");
	ldi R16,<L33
	ldi R17,>L33
	rcall _puts
L34:
	.dbline 109
L35:
	.dbline 109
; 	 
;     while(rece_flag==0);
	lds R2,_rece_flag
	tst R2
	breq L34
	.dbline 111
; 	
; 	  putchar(0x0a);//换行
	ldi R16,10
	rcall _putchar
	.dbline 112
; 	  putchar(0x0d);//回车
	ldi R16,13
	rcall _putchar
	.dbline 113
; 	  puts("您输入的是:");
	ldi R16,<L37
	ldi R17,>L37
	rcall _puts
	.dbline 114
; 	 if((infra_data[0]==infra_data[1])&&
	lds R2,_infra_data+1
	lds R3,_infra_data
	cp R3,R2
	breq X4
	rjmp L38
X4:
	lds R2,_infra_data+3
	com R2
	lds R3,_infra_data+2
	cp R3,R2
	breq X5
	rjmp L38
X5:
	.dbline 116
; 	    (infra_data[2]==(~infra_data[3])))
; 		{
	.dbline 118
; 		//如果是有效数据
; 		 switch(infra_data[2])
	mov R20,R3
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L47
X1:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L48
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L49
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L50
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	breq L51
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L52
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	breq L53
	cpi R20,7
	ldi R30,0
	cpc R21,R30
	breq L54
	cpi R20,8
	ldi R30,0
	cpc R21,R30
	breq L55
	cpi R20,9
	ldi R30,0
	cpc R21,R30
	breq L56
	rjmp L44
X2:
	.dbline 119
; 		  {
L47:
	.dbline 120
; 		    case 0:putchar('1');
	ldi R16,49
	rcall _putchar
	.dbline 121
; 			       break; 
	rjmp L44
L48:
	.dbline 122
; 		    case 1:putchar('2');
	ldi R16,50
	rcall _putchar
	.dbline 123
; 			       break;     
	rjmp L44
L49:
	.dbline 124
; 		    case 2:putchar('3');
	ldi R16,51
	rcall _putchar
	.dbline 125
; 			       break; 
	rjmp L44
L50:
	.dbline 126
; 		    case 3:putchar('4');
	ldi R16,52
	rcall _putchar
	.dbline 127
; 			       break;     
	rjmp L44
L51:
	.dbline 128
; 		    case 4:putchar('5');
	ldi R16,53
	rcall _putchar
	.dbline 129
; 			       break; 
	rjmp L44
L52:
	.dbline 130
; 		    case 5:putchar('6');
	ldi R16,54
	rcall _putchar
	.dbline 131
; 			       break;     
	rjmp L44
L53:
	.dbline 132
; 		    case 6:putchar('7');
	ldi R16,55
	rcall _putchar
	.dbline 133
; 			       break; 
	rjmp L44
L54:
	.dbline 134
; 		    case 7:putchar('8');
	ldi R16,56
	rcall _putchar
	.dbline 135
; 			       break; 
	rjmp L44
L55:
	.dbline 136
; 			case 8:putchar('9');
	ldi R16,57
	rcall _putchar
	.dbline 137
; 			       break; 
	rjmp L44
L56:
	.dbline 138
; 		    case 9:putchar('0');
	ldi R16,48
	rcall _putchar
	.dbline 139
; 			       break;     
	.dbline 140
; 		    default:break;   
L44:
	.dbline 142
; 		  }
; 		  putchar(0x0a);//换行
	ldi R16,10
	rcall _putchar
	.dbline 143
; 	      putchar(0x0d);//回车
	ldi R16,13
	rcall _putchar
	.dbline 144
; 		  infra_data[0]=0;
	clr R2
	sts _infra_data,R2
	.dbline 145
; 		  infra_data[1]=0;
	sts _infra_data+1,R2
	.dbline 146
; 		  infra_data[2]=0;
	sts _infra_data+2,R2
	.dbline 147
; 		  infra_data[3]=0;
	sts _infra_data+3,R2
	.dbline 148
; 		  rece_flag=0;
	sts _rece_flag,R2
	.dbline 149
; 		  GICR  = 0x80;//打开外部中断1
	ldi R24,128
	out 0x3b,R24
	.dbline 150
; 		}
	rjmp L39
L38:
	.dbline 152
; 		else
; 		{
	.dbline 154
; 		//如果不是有效数据
; 		rece_flag=0;
	clr R2
	sts _rece_flag,R2
	.dbline 155
; 		GICR  = 0x80;//打开外部中断1
	ldi R24,128
	out 0x3b,R24
	.dbline 156
;         }  
L39:
	.dbline 161
L31:
	.dbline 105
	rjmp L30
X3:
	.dbline -2
L29:
	.dbline 0 ; func end
	ret
	.dbsym l i 1 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\main.c
_uia_data::
	.blkb 5
	.dbsym e uia_data _uia_data A[5:5]c
	.area data(ram, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\main.c
L37:
	.blkb 13
	.area idata
	.byte 196,250,202,228,200,235,181,196,202,199,163,186,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\main.c
L33:
	.blkb 10
	.area idata
	.byte 199,235,176,180,188,252,163,186,32,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\main.c

⌨️ 快捷键说明

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