📄 ir.s
字号:
.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 + -