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

📄 ir.lst

📁 单片机红外通讯控制 C语言编写 源程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -