📄 ir.lis
字号:
.module ir.c
.area vector(rom, abs)
.org 4
0004 ADC0 rjmp _int1_serving
.area data(ram, con, rel)
0000 _Table::
0000 .blkb 2
.area idata
0000 C0F9 .byte 192,249
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 A4B0 .byte 164,176
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 9992 .byte 153,146
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 82F8 .byte 130,248
.area data(ram, con, rel)
0008 .blkb 2
.area idata
0008 8090 .byte 128,144
.area data(ram, con, rel)
000A .blkb 2
.area idata
000A 8FB9 .byte 143,185
.area data(ram, con, rel)
000C .blkb 2
.area idata
000C 8688 .byte 134,136
.area data(ram, con, rel)
000E .blkb 1
.area idata
000E C6 .byte 198
.area data(ram, con, rel)
000F .dbfile E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
000F .dbsym e Table _Table A[15:15]c
.area text(rom, con, rel)
0000 .dbfile E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
0000 .dbfunc e DelaymS _DelaymS fV
0000 ; j -> R20,R21
0000 ; i -> R16,R17
.even
0000 _DelaymS::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 42
0002 ; //******************************************************************************
0002 ; // *
0002 ; // FileName : 实验板ir.c ICCAVR V6.31A编译 *
0002 ; // Function : 红外接收 C与汇编混合编程实例 *
0002 ; // Date : 2007-01-04 *
0002 ; // Version : 1.0 *
0002 ; // *
0002 ; // Author : 开关电源 hongtusy@163.com *
0002 ; // Company : 电子信息技术咨询网 http://www.itsn.cn *
0002 ; // *
0002 ; //***************************描述与记事*****************************************
0002 ; //实验板的AVR程序,接收红外线遥控器的按键信号,并将译码后的数字送数码管显示。
0002 ; //本试验需要配合配套的红外遥控器(使用6121芯片),使用ATmega8535,使用片内1M晶振。
0002 ; //接线定义:PA2=SW5-7接蜂鸣器,PD3/INT1=SW5-6红外信号接收端
0002 ; // 数码管显示部分,SW1-1~8,SW2-1~3,SW2-6,SW3-8为系统复位端。
0002 ; //功能:刚上电,蜂鸣器会响一声,然后收到一个红外信号就响一声,并将键值显示在数码管上。
0002 ; //记事:本程序旨在对红外接收的理解与演示,忽略了系统码,程序适合初学者使用。
0002 ; /*解码的关键是如何识别"0"和"1",从位的定义我们可以发现"0"和"1"均以0.565mS的低电平开始,
0002 ; 不同的是高电平的宽度不同,"0"为0.56mS,"1"为1.68mS,所以必须根据高电平的宽度区别"0"和
0002 ; "1",如果从0.565mS低电平过后,开始延时,0.56mS以后,若读到的电平为低,说明该位为"0",
0002 ; 反之则为"1",为了可靠起见,延时必须比0.56mS长些,但又不能超过1.12mS,否则如果该位为"0",
0002 ; 读到的已是下一位的高电平,因此取(1.12mS+0.56mS)/2=0.84mS最为可靠,一般取0.84mS即可。
0002 ; //******************************************************************************/
0002 ; #include <iom8535v.h> //头文件,ATmega8535单片机的寄存器定义
0002 ; #include "macros.h" //可以使用NOP()以及SEI()等指令.
0002 ;
0002 ; typedef unsigned char uchar; //宏
0002 ; typedef unsigned int uint;
0002 ;
0002 ; #pragma interrupt_handler int1_serving:3 //外部中断1/红外信号中断入口向量。
0002 ;
0002 ; uchar Table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8F,0xB9,0x86,0x88,0xC6};
0002 ;
0002 ; /************************************************
0002 ; 函 数 名: DelaymS()
0002 ; 功 能: 毫秒级延时函数
0002 ; 输入参数: 延迟时间/系统晶体
0002 ; 输出参数: 做相应的延迟处理
0002 ; 描 述: /
0002 ; ***********************************************/
0002 ; void DelaymS (uint i)
0002 ; {
0002 .dbline 44
0002 ; uint j;
0002 ; for(;i!=0;i--)
0002 0AC0 rjmp L5
0004 L2:
0004 .dbline 45
0004 ; {
0004 .dbline 46
0004 42E3 ldi R20,50
0006 50E0 ldi R21,0
0008 02C0 rjmp L9
000A L6:
000A .dbline 46
000A L7:
000A .dbline 46
000A 4150 subi R20,1
000C 5040 sbci R21,0
000E L9:
000E .dbline 46
000E 4030 cpi R20,0
0010 4507 cpc R20,R21
0012 D9F7 brne L6
0014 X0:
0014 .dbline 47
0014 L3:
0014 .dbline 44
0014 0150 subi R16,1
0016 1040 sbci R17,0
0018 L5:
0018 .dbline 44
0018 0030 cpi R16,0
001A 0107 cpc R16,R17
001C 99F7 brne L2
001E X1:
001E .dbline -2
001E L1:
001E 00D0 rcall pop_gset1
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r j 20 i
0022 .dbsym r i 16 i
0022 .dbend
0022 .dbfunc e Delay882uS _Delay882uS fV
.even
0022 _Delay882uS::
0022 .dbline -1
0022 .dbline 57
0022 ; for (j=50;j!=0;j--);
0022 ; }
0022 ; }
0022 ; /************************************************
0022 ; 函 数 名: Delay882uS()
0022 ; 功 能: 882微秒延时函数
0022 ; 输入参数: 晶振1M,机器周期为1uS。
0022 ; 输出参数: 延迟时间T=a(4b+3)+c
0022 ; 描 述: 在C中调汇编函数,使用r24,r25不必作特殊的保护工作。
0022 ; ***********************************************/
0022 ; void Delay882uS (void)
0022 ; {
0022 .dbline 58
0022 ; asm(" ldi r24,10 ") //t=1 参数:a
0022 8AE0 ldi r24,10
0024 95E1 loop3: ldi r25,21
0026 9A95 loop4: dec r25
0028 0000 nop
002A E9F7 brne loop4
002C 8A95 dec r24
002E D1F7 brne loop3
0030 0000 nop
0032 0000 nop
0034 0000 nop
0036 0000 nop
0038 0000 nop
003A 0000 nop
003C 0000 nop
003E 0000 nop
0040 0000 nop
0042 0000 nop
0044 0000 nop
0046 0000 nop
0048 .dbline -2
0048 L10:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e Delay1000uS _Delay1000uS fV
.even
004A _Delay1000uS::
004A .dbline -1
004A .dbline 75
004A ; asm("loop3: ldi r25,21 ") //t=1 参数:b
004A ; asm("loop4: dec r25 ") //t=1
004A ; asm(" nop ") //t=1,校准用,需改动公式。
004A ; asm(" brne loop4 ") //t=2/1
004A ; asm(" dec r24 ") //t=1
004A ; asm(" brne loop3 ") //t=2/1
004A ; 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
004A ; }
004A ; /************************************************
004A ; 函 数 名: Delay1000uS()
004A ; 功 能: 1000微秒延时函数
004A ; 输入参数: 晶振1M,机器周期为1uS。
004A ; 输出参数: 延迟时间T=a(4b+3)+c
004A ; 描 述: 在C中调汇编函数,使用r24,r25不必作特殊的保护工作。
004A ; ***********************************************/
004A ; void Delay1000uS (void)
004A ; {
004A .dbline 76
004A ; asm(" ldi r24,4 ") //t=1 参数:a
004A 84E0 ldi r24,4
004C 9DE3 loop5: ldi r25,61
004E 9A95 loop6: dec r25
0050 0000 nop
0052 E9F7 brne loop6
0054 8A95 dec r24
0056 D1F7 brne loop5
0058 0000 nop
005A 0000 nop
005C 0000 nop
005E 0000 nop
0060 0000 nop
0062 0000 nop
0064 0000 nop
0066 0000 nop
0068 0000 nop
006A 0000 nop
006C 0000 nop
006E .dbline -2
006E L11:
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbend
0070 .dbfunc e key_decode _key_decode fV
.area func_lit(rom, con, rel)
0000 L45:
0000 5300 .word `L16
0002 5700 .word `L18
0004 5B00 .word `L20
0006 8E00 .word `L14
0008 5F00 .word `L22
000A 6300 .word `L24
000C 6700 .word `L26
000E 8E00 .word `L14
0010 6B00 .word `L28
0012 6F00 .word `L30
0014 7300 .word `L32
0016 8E00 .word `L14
0018 7700 .word `L34
001A 7B00 .word `L36
001C 7F00 .word `L37
001E 8E00 .word `L14
0020 8300 .word `L39
0022 8700 .word `L41
0024 8B00 .word `L43
.area text(rom, con, rel)
0070 .dbfile E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
0070 ; data -> R20
.even
0070 _key_decode::
0070 00D0 rcall push_gset1
0072 402F mov R20,R16
0074 .dbline -1
0074 .dbline 93
0074 ; asm("loop5: ldi r25,61 ") //t=1 参数:b
0074 ; asm("loop6: dec r25 ") //t=1
0074 ; asm(" nop ") //t=1,校准用,需改动公式。
0074 ; asm(" brne loop6 ") //t=2/1
0074 ; asm(" dec r24 ") //t=1
0074 ; asm(" brne loop5 ") //t=2/1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -