📄 ir.lst
字号:
__start:
__text_start:
0030 E5CF LDI R28,0x5F
0031 E0D2 LDI R29,2
0032 BFCD OUT 0x3D,R28
0033 BFDE OUT 0x3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD Y+0,R16
0038 2400 CLR R0
0039 E6EF LDI R30,0x6F
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 36EF CPI R30,0x6F
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD Z+0,R16
0042 E5E0 LDI R30,0x50
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 35EF CPI R30,0x5F
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E D0F5 RCALL _main
_exit:
004F CFFF RJMP _exit
_DelaymS:
j --> R20
i --> R16
0050 D116 RCALL push_gset1
FILE: E:\iccavr代码\实验9_红外遥控接收的应用\ir.c
(0001) //******************************************************************************
(0002) // *
(0003) // FileName : 实验板ir.c ICCAVR V6.31A编译 *
(0004) // Function : 红外接收 C与汇编混合编程实例 *
(0005) // Date : 2007-01-04 *
(0006) // Version : 1.0 *
(0007) // *
(0008) // Author : 开关电源 hongtusy@163.com *
(0009) // Company : 电子信息技术咨询网 http://www.itsn.cn *
(0010) // *
(0011) //***************************描述与记事*****************************************
(0012) //实验板的AVR程序,接收红外线遥控器的按键信号,并将译码后的数字送数码管显示。
(0013) //本试验需要配合配套的红外遥控器(使用6121芯片),使用ATmega8535,使用片内1M晶振。
(0014) //接线定义:PA2=SW5-7接蜂鸣器,PD3/INT1=SW5-6红外信号接收端
(0015) // 数码管显示部分,SW1-1~8,SW2-1~3,SW2-6,SW3-8为系统复位端。
(0016) //功能:刚上电,蜂鸣器会响一声,然后收到一个红外信号就响一声,并将键值显示在数码管上。
(0017) //记事:本程序旨在对红外接收的理解与演示,忽略了系统码,程序适合初学者使用。
(0018) /*解码的关键是如何识别"0"和"1",从位的定义我们可以发现"0"和"1"均以0.565mS的低电平开始,
(0019) 不同的是高电平的宽度不同,"0"为0.56mS,"1"为1.68mS,所以必须根据高电平的宽度区别"0"和
(0020) "1",如果从0.565mS低电平过后,开始延时,0.56mS以后,若读到的电平为低,说明该位为"0",
(0021) 反之则为"1",为了可靠起见,延时必须比0.56mS长些,但又不能超过1.12mS,否则如果该位为"0",
(0022) 读到的已是下一位的高电平,因此取(1.12mS+0.56mS)/2=0.84mS最为可靠,一般取0.84mS即可。
(0023) //******************************************************************************/
(0024) #include <iom8535v.h> //头文件,ATmega8535单片机的寄存器定义
(0025) #include "macros.h" //可以使用NOP()以及SEI()等指令.
(0026)
(0027) typedef unsigned char uchar; //宏
(0028) typedef unsigned int uint;
(0029)
(0030) #pragma interrupt_handler int1_serving:3 //外部中断1/红外信号中断入口向量。
(0031)
(0032) uchar Table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8F,0xB9,0x86,0x88,0xC6};
(0033)
(0034) /************************************************
(0035) 函 数 名: DelaymS()
(0036) 功 能: 毫秒级延时函数
(0037) 输入参数: 延迟时间/系统晶体
(0038) 输出参数: 做相应的延迟处理
(0039) 描 述: /
(0040) ***********************************************/
(0041) void DelaymS (uint i)
(0042) {
(0043) uint j;
(0044) for(;i!=0;i--)
0051 C00A RJMP 0x005C
(0045) {
(0046) for (j=50;j!=0;j--);
0052 E342 LDI R20,0x32
0053 E050 LDI R21,0
0054 C002 RJMP 0x0057
0055 5041 SUBI R20,1
0056 4050 SBCI R21,0
0057 3040 CPI R20,0
0058 0745 CPC R20,R21
0059 F7D9 BNE 0x0055
005A 5001 SUBI R16,1
005B 4010 SBCI R17,0
005C 3000 CPI R16,0
005D 0701 CPC R16,R17
005E F799 BNE 0x0052
005F D10A RCALL pop_gset1
0060 9508 RET
(0047) }
(0048) }
(0049) /************************************************
(0050) 函 数 名: Delay882uS()
(0051) 功 能: 882微秒延时函数
(0052) 输入参数: 晶振1M,机器周期为1uS。
(0053) 输出参数: 延迟时间T=a(4b+3)+c
(0054) 描 述: 在C中调汇编函数,使用r24,r25不必作特殊的保护工作。
(0055) ***********************************************/
(0056) void Delay882uS (void)
(0057) {
(0058) asm(" ldi r24,10 ") //t=1 参数:a
_Delay882uS:
0061 E08A LDI R24,0xA
0062 E195 LDI R25,0x15
0063 959A DEC R25
0064 0000 NOP
0065 F7E9 BNE 0x0063
0066 958A DEC R24
0067 F7D1 BNE 0x0062
0068 0000 NOP
0069 0000 NOP
006A 0000 NOP
006B 0000 NOP
006C 0000 NOP
006D 0000 NOP
006E 0000 NOP
006F 0000 NOP
0070 0000 NOP
0071 0000 NOP
0072 0000 NOP
0073 0000 NOP
0074 9508 RET
(0059) asm("loop3: ldi r25,21 ") //t=1 参数:b
(0060) asm("loop4: dec r25 ") //t=1
(0061) asm(" nop ") //t=1,校准用,需改动公式。
(0062) asm(" brne loop4 ") //t=2/1
(0063) asm(" dec r24 ") //t=1
(0064) asm(" brne loop3 ") //t=2/1
(0065) 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
(0066) }
(0067) /************************************************
(0068) 函 数 名: Delay1000uS()
(0069) 功 能: 1000微秒延时函数
(0070) 输入参数: 晶振1M,机器周期为1uS。
(0071) 输出参数: 延迟时间T=a(4b+3)+c
(0072) 描 述: 在C中调汇编函数,使用r24,r25不必作特殊的保护工作。
(0073) ***********************************************/
(0074) void Delay1000uS (void)
(0075) {
(0076) asm(" ldi r24,4 ") //t=1 参数:a
_Delay1000uS:
0075 E084 LDI R24,4
0076 E39D LDI R25,0x3D
0077 959A DEC R25
0078 0000 NOP
0079 F7E9 BNE 0x0077
007A 958A DEC R24
007B F7D1 BNE 0x0076
007C 0000 NOP
007D 0000 NOP
007E 0000 NOP
007F 0000 NOP
0080 0000 NOP
0081 0000 NOP
0082 0000 NOP
0083 0000 NOP
0084 0000 NOP
0085 0000 NOP
0086 0000 NOP
0087 9508 RET
_key_decode:
data --> R20
0088 D0DE RCALL push_gset1
0089 2F40 MOV R20,R16
(0077) asm("loop5: ldi r25,61 ") //t=1 参数:b
(0078) asm("loop6: dec r25 ") //t=1
(0079) asm(" nop ") //t=1,校准用,需改动公式。
(0080) asm(" brne loop6 ") //t=2/1
(0081) asm(" dec r24 ") //t=1
(0082) asm(" brne loop5 ") //t=2/1
(0083) 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
(0084) }
(0085) /************************************************
(0086) 函 数 名: key_decode (uchar data)
(0087) 功 能: 键值扫描码是无规律的,我们只能通过switch来获得键值。
(0088) 输入参数: 扫描码
(0089) 输出参数: 翻译后的键值,并显示
(0090) 描 述: 本处也可以通过数组实现。
(0091) ***********************************************/
(0092) void key_decode (uchar data) //译码键值
(0093) {
(0094) switch (data) //判断扫描码data
008A 2755 CLR R21
008B 3040 CPI R20,0
008C E0E0 LDI R30,0
008D 075E CPC R21,R30
008E F40C BGE 0x0090
008F C04E RJMP 0x00DE
0090 E182 LDI R24,0x12
0091 E090 LDI R25,0
0092 1784 CP R24,R20
0093 0795 CPC R25,R21
0094 F40C BGE 0x0096
0095 C048 RJMP 0x00DE
0096 E002 LDI R16,2
0097 E010 LDI R17,0
0098 019A MOVW R18,R20
0099 D0B3 RCALL empy16s
009A 01F8 MOVW R30,R16
009B E28A LDI R24,0x2A
009C E090 LDI R25,0
009D 0FE8 ADD R30,R24
009E 1FF9 ADC R31,R25
009F 9005 LPM R0,Z+
00A0 9014 LPM R1,0(Z)
00A1 01F0 MOVW R30,R0
00A2 9409 IJMP
(0095) {
(0096) case 0: PORTC=Table[1];break; //1
00A3 90200061 LDS R2,Table+1
00A5 BA25 OUT 0x15,R2
00A6 C037 RJMP 0x00DE
(0097) case 1: PORTC=Table[2];break; //2
00A7 90200062 LDS R2,Table+2
00A9 BA25 OUT 0x15,R2
00AA C033 RJMP 0x00DE
(0098) case 2: PORTC=Table[3];break; //3
00AB 90200063 LDS R2,Table+3
00AD BA25 OUT 0x15,R2
00AE C02F RJMP 0x00DE
(0099) case 4: PORTC=Table[4];break; //4
00AF 90200064 LDS R2,0x64
00B1 BA25 OUT 0x15,R2
00B2 C02B RJMP 0x00DE
(0100) case 5: PORTC=Table[5];break; //5
00B3 90200065 LDS R2,0x65
00B5 BA25 OUT 0x15,R2
00B6 C027 RJMP 0x00DE
(0101) case 6: PORTC=Table[6];break; //6
00B7 90200066 LDS R2,0x66
00B9 BA25 OUT 0x15,R2
00BA C023 RJMP 0x00DE
(0102) case 8: PORTC=Table[7];break; //7
00BB 90200067 LDS R2,0x67
00BD BA25 OUT 0x15,R2
00BE C01F RJMP 0x00DE
(0103) case 9: PORTC=Table[8];break; //8
00BF 90200068 LDS R2,0x68
00C1 BA25 OUT 0x15,R2
00C2 C01B RJMP 0x00DE
(0104) case 10: PORTC=Table[9];break; //9
00C3 90200069 LDS R2,0x69
00C5 BA25 OUT 0x15,R2
00C6 C017 RJMP 0x00DE
(0105) case 12: PORTC=Table[10];break; //*
00C7 9020006A LDS R2,0x6A
00C9 BA25 OUT 0x15,R2
00CA C013 RJMP 0x00DE
(0106) case 13: PORTC=Table[0];break; //0
00CB 90200060 LDS R2,Table
00CD BA25 OUT 0x15,R2
00CE C00F RJMP 0x00DE
(0107) case 14: PORTC=Table[11];break; //#
00CF 9020006B LDS R2,0x6B
00D1 BA25 OUT 0x15,R2
00D2 C00B RJMP 0x00DE
(0108) case 16: PORTC=Table[12];break; //E
00D3 9020006C LDS R2,0x6C
00D5 BA25 OUT 0x15,R2
00D6 C007 RJMP 0x00DE
(0109) case 17: PORTC=Table[13];break; //A
00D7 9020006D LDS R2,0x6D
00D9 BA25 OUT 0x15,R2
00DA C003 RJMP 0x00DE
(0110) case 18: PORTC=Table[14];break; //C
00DB 9020006E LDS R2,0x6E
00DD BA25 OUT 0x15,R2
(0111) default: break;
00DE D08B RCALL pop_gset1
00DF 9508 RET
_spk:
i --> R20
00E0 D086 RCALL push_gset1
00E1 2F40 MOV R20,R16
(0112) }
(0113) }
(0114) /************************************************
(0115) 函 数 名: spk()
(0116) 功 能: 蜂鸣器鸣叫一声函数
(0117) 输入参数:
(0118) 输出参数:
(0119) 描 述: /
(0120) ***********************************************/
(0121) void spk (uchar i)
(0122) {
(0123) PORTA &= ~(1<<PA2); //蜂鸣器响
00E2 98DA CBI 0x1B,2
(0124) DelaymS (i); //延迟
00E3 2F04 MOV R16,R20
00E4 2711 CLR R17
00E5 DF6A RCALL _DelaymS
(0125) PORTA |= (1<<PA2); //蜂鸣器关闭
00E6 9ADA SBI 0x1B,2
00E7 D082 RCALL pop_gset1
00E8 9508 RET
(0126) }
(0127) /************************************************
(0128) 函 数 名: Init_mcu()
(0129) 功 能: 单片机初始化函数
(0130) 输入参数: /
(0131) 输出参数: /
(0132) 描 述: 相关口方向的设置等
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -