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

📄 ir.s

📁 单片机红外通讯控制 C语言编写 源程序。
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ir.c
	.area vector(rom, abs)
	.org 4
	rjmp _int1_serving
	.area data(ram, con, rel)
_Table::
	.blkb 2
	.area idata
	.byte 192,249
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 164,176
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 153,146
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 130,248
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 128,144
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 143,185
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 134,136
	.area data(ram, con, rel)
	.blkb 1
	.area idata
	.byte 198
	.area data(ram, con, rel)
	.dbfile E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
	.dbsym e Table _Table A[15:15]c
	.area text(rom, con, rel)
	.dbfile E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
	.dbfunc e DelaymS _DelaymS fV
;              j -> R20,R21
;              i -> R16,R17
	.even
_DelaymS::
	rcall push_gset1
	.dbline -1
	.dbline 42
; //******************************************************************************
; //                                                                             *
; //    FileName   : 实验板ir.c        ICCAVR V6.31A编译                         *
; //    Function   : 红外接收         C与汇编混合编程实例                        *
; //    Date       : 2007-01-04                                                  *
; //    Version    : 1.0                                                         *
; //                                                                             *
; //    Author     : 开关电源              hongtusy@163.com                      *
; //    Company    : 电子信息技术咨询网    http://www.itsn.cn                    *
; //                                                                             *
; //***************************描述与记事*****************************************
; //实验板的AVR程序,接收红外线遥控器的按键信号,并将译码后的数字送数码管显示。
; //本试验需要配合配套的红外遥控器(使用6121芯片),使用ATmega8535,使用片内1M晶振。
; //接线定义:PA2=SW5-7接蜂鸣器,PD3/INT1=SW5-6红外信号接收端
; //     数码管显示部分,SW1-1~8,SW2-1~3,SW2-6,SW3-8为系统复位端。
; //功能:刚上电,蜂鸣器会响一声,然后收到一个红外信号就响一声,并将键值显示在数码管上。
; //记事:本程序旨在对红外接收的理解与演示,忽略了系统码,程序适合初学者使用。
; /*解码的关键是如何识别"0"和"1",从位的定义我们可以发现"0"和"1"均以0.565mS的低电平开始,
; 不同的是高电平的宽度不同,"0"为0.56mS,"1"为1.68mS,所以必须根据高电平的宽度区别"0"和
; "1",如果从0.565mS低电平过后,开始延时,0.56mS以后,若读到的电平为低,说明该位为"0",
; 反之则为"1",为了可靠起见,延时必须比0.56mS长些,但又不能超过1.12mS,否则如果该位为"0",
; 读到的已是下一位的高电平,因此取(1.12mS+0.56mS)/2=0.84mS最为可靠,一般取0.84mS即可。
; //******************************************************************************/
; #include <iom8535v.h>             //头文件,ATmega8535单片机的寄存器定义
; #include "macros.h"             //可以使用NOP()以及SEI()等指令.
; 
; typedef unsigned char  uchar;    //宏
; typedef unsigned int   uint;
; 
; #pragma interrupt_handler int1_serving:3   //外部中断1/红外信号中断入口向量。
; 
; uchar Table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8F,0xB9,0x86,0x88,0xC6};
; 
; /************************************************
; 函 数 名:    DelaymS()
; 功    能:    毫秒级延时函数
; 输入参数:     延迟时间/系统晶体
; 输出参数:    做相应的延迟处理
; 描    述:    /
; ***********************************************/
; void DelaymS (uint i) 
; {
	.dbline 44
;  	 uint j;
;  	 for(;i!=0;i--)
	rjmp L5
L2:
	.dbline 45
;  	 {
	.dbline 46
	ldi R20,50
	ldi R21,0
	rjmp L9
L6:
	.dbline 46
L7:
	.dbline 46
	subi R20,1
	sbci R21,0
L9:
	.dbline 46
	cpi R20,0
	cpc R20,R21
	brne L6
X0:
	.dbline 47
L3:
	.dbline 44
	subi R16,1
	sbci R17,0
L5:
	.dbline 44
	cpi R16,0
	cpc R16,R17
	brne L2
X1:
	.dbline -2
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 20 i
	.dbsym r i 16 i
	.dbend
	.dbfunc e Delay882uS _Delay882uS fV
	.even
_Delay882uS::
	.dbline -1
	.dbline 57
;   	  	 for (j=50;j!=0;j--);
;  	 }
; }
; /************************************************
; 函 数 名:    Delay882uS()
; 功    能:    882微秒延时函数
; 输入参数:     晶振1M,机器周期为1uS。
; 输出参数:    延迟时间T=a(4b+3)+c
; 描    述:    在C中调汇编函数,使用r24,r25不必作特殊的保护工作。    
; ***********************************************/
; void Delay882uS (void) 
; {
	.dbline 58
;    asm("        ldi    r24,10   ")   //t=1 参数:a
	        ldi    r24,10   
	loop3:  ldi    r25,21   
	loop4:  dec    r25      
	        nop             
	        brne   loop4    
	        dec    r24      
	        brne   loop3    
	nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Delay1000uS _Delay1000uS fV
	.even
_Delay1000uS::
	.dbline -1
	.dbline 75
;    asm("loop3:  ldi    r25,21   ")   //t=1 参数:b
;    asm("loop4:  dec    r25      ")   //t=1
;    asm("        nop             ")   //t=1,校准用,需改动公式。
;    asm("        brne   loop4    ")   //t=2/1
;    asm("        dec    r24      ")   //t=1
;    asm("        brne   loop3    ")   //t=2/1
;    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop"); //t=1,校准用,参数:c
; }
; /************************************************
; 函 数 名:    Delay1000uS()
; 功    能:    1000微秒延时函数
; 输入参数:     晶振1M,机器周期为1uS。
; 输出参数:    延迟时间T=a(4b+3)+c
; 描    述:    在C中调汇编函数,使用r24,r25不必作特殊的保护工作。    
; ***********************************************/
; void Delay1000uS (void) 
; {
	.dbline 76
;    asm("        ldi    r24,4    ")   //t=1 参数:a
	        ldi    r24,4    
	loop5:  ldi    r25,61   
	loop6:  dec    r25      
	        nop             
	        brne   loop6    
	        dec    r24      
	        brne   loop5    
	nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	 nop
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e key_decode _key_decode fV
	.area func_lit(rom, con, rel)
L45:
	.word `L16
	.word `L18
	.word `L20
	.word `L14
	.word `L22
	.word `L24
	.word `L26
	.word `L14
	.word `L28
	.word `L30
	.word `L32
	.word `L14
	.word `L34
	.word `L36
	.word `L37
	.word `L14
	.word `L39
	.word `L41
	.word `L43
	.area text(rom, con, rel)
	.dbfile E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
;           data -> R20
	.even
_key_decode::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 93
;    asm("loop5:  ldi    r25,61   ")   //t=1 参数:b
;    asm("loop6:  dec    r25      ")   //t=1
;    asm("        nop             ")   //t=1,校准用,需改动公式。
;    asm("        brne   loop6    ")   //t=2/1
;    asm("        dec    r24      ")   //t=1
;    asm("        brne   loop5    ")   //t=2/1
;    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop"); //t=1,校准用,参数:c
; }
; /************************************************
; 函 数 名:    key_decode (uchar data)
; 功    能:    键值扫描码是无规律的,我们只能通过switch来获得键值。
; 输入参数:     扫描码
; 输出参数:    翻译后的键值,并显示
; 描    述:    本处也可以通过数组实现。
; ***********************************************/
; void key_decode (uchar data)   //译码键值
; {
	.dbline 94
;    switch (data)        //判断扫描码data
	clr R21
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge X3
	rjmp L14
X3:
	ldi R24,18
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brge X4
	rjmp L14
X4:
	ldi R16,2
	ldi R17,0
	movw R18,R20
	rcall empy16s
	movw R30,R16
	ldi R24,<L45
	ldi R25,>L45
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	ijmp
X2:
	.dbline 95
;    {
L16:
	.dbline 96
;    	case 0: PORTC=Table[1];break;         //1
	lds R2,_Table+1
	out 0x15,R2
	.dbline 96
	rjmp L14
L18:
	.dbline 97
; 	case 1: PORTC=Table[2];break;         //2
	lds R2,_Table+2
	out 0x15,R2
	.dbline 97
	rjmp L14
L20:
	.dbline 98
; 	case 2: PORTC=Table[3];break;         //3
	lds R2,_Table+3
	out 0x15,R2
	.dbline 98
	rjmp L14
L22:
	.dbline 99
; 	case 4: PORTC=Table[4];break;         //4	
	lds R2,_Table+4
	out 0x15,R2
	.dbline 99
	rjmp L14
L24:
	.dbline 100
; 	case 5: PORTC=Table[5];break;         //5
	lds R2,_Table+5
	out 0x15,R2
	.dbline 100
	rjmp L14
L26:
	.dbline 101
; 	case 6: PORTC=Table[6];break;         //6
	lds R2,_Table+6
	out 0x15,R2
	.dbline 101
	rjmp L14
L28:
	.dbline 102
; 	case 8: PORTC=Table[7];break;         //7
	lds R2,_Table+7
	out 0x15,R2
	.dbline 102
	rjmp L14
L30:
	.dbline 103
; 	case 9: PORTC=Table[8];break;         //8
	lds R2,_Table+8
	out 0x15,R2
	.dbline 103
	rjmp L14
L32:
	.dbline 104
; 	case 10: PORTC=Table[9];break;        //9
	lds R2,_Table+9
	out 0x15,R2
	.dbline 104
	rjmp L14
L34:
	.dbline 105
; 	case 12: PORTC=Table[10];break;       //*
	lds R2,_Table+10
	out 0x15,R2
	.dbline 105
	rjmp L14
L36:
	.dbline 106
; 	case 13: PORTC=Table[0];break;        //0
	lds R2,_Table
	out 0x15,R2
	.dbline 106
	rjmp L14
L37:
	.dbline 107
; 	case 14: PORTC=Table[11];break;       //#
	lds R2,_Table+11
	out 0x15,R2
	.dbline 107
	rjmp L14
L39:
	.dbline 108
; 	case 16: PORTC=Table[12];break;       //E

⌨️ 快捷键说明

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