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

📄 ir.lst

📁 单片机红外通讯控制 C语言编写 源程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0133) ***********************************************/
(0134) void Init_mcu(void)
(0135) {
(0136) 	DDRC = 0xff;         //PC口为推挽1输出
_Init_mcu:
    00E9 EF8F      LDI	R24,0xFF
    00EA BB84      OUT	0x14,R24
(0137) 	DDRD = 0b11110111;   //PD3(INT1)接蜂鸣器为输入,其余为输出。
    00EB EF87      LDI	R24,0xF7
    00EC BB81      OUT	0x11,R24
(0138) 	PORTD = 0b10001111;  //红外输入端需要使用内部上拉电阻,只使用第一位数码管。
    00ED E88F      LDI	R24,0x8F
    00EE BB82      OUT	0x12,R24
(0139) 	DDRA = 0xff;         //PA口为输出,PA4接蜂鸣器
    00EF EF8F      LDI	R24,0xFF
    00F0 BB8A      OUT	0x1A,R24
(0140) 	PORTA = 0xff;        //默认蜂鸣器不响
    00F1 BB8B      OUT	0x1B,R24
    00F2 9508      RET
(0141) }
(0142) /************************************************
(0143) 函 数 名:    Init_int1()
(0144) 功    能:    外部中断1初始化函数
(0145) 输入参数:     /
(0146) 输出参数:    /
(0147) 描    述:    设置外部中断1为下降沿触发
(0148) ***********************************************/
(0149) void init_int1 (void)          //外部中断1初始化
(0150) {
(0151)       MCUCR |= (1<<ISC11);     //设置为下降沿中断触发 
_init_int1:
    00F3 B785      IN	R24,0x35
    00F4 6088      ORI	R24,0x8
    00F5 BF85      OUT	0x35,R24
(0152) 	  MCUCR &= ~(1<<ISC10);    //设置为下降沿中断触发 
    00F6 B785      IN	R24,0x35
    00F7 7F8B      ANDI	R24,0xFB
    00F8 BF85      OUT	0x35,R24
(0153) 	  GICR |= (1<<INT1);       //通用中断控制寄存器,中断使能
    00F9 B78B      IN	R24,0x3B
    00FA 6880      ORI	R24,0x80
    00FB BF8B      OUT	0x3B,R24
    00FC 9508      RET
_int1_serving:
  buf                  --> Y+0
  j                    --> R22
  k                    --> R10
  mid                  --> R12
  i                    --> R20
    00FD D080      RCALL	push_lset
    00FE D062      RCALL	push_gset4
    00FF 9724      SBIW	R28,4
(0154) }
(0155) /************************************************
(0156) 函 数 名:    Init_serving()
(0157) 功    能:    红外IR接收中断服务程序
(0158) 输入参数:     /
(0159) 输出参数:    /
(0160) 描    述:    整个红外译码部分的处理
(0161) ***********************************************/
(0162) void int1_serving (void)   //外部中断1,红外IR接收中断服务程序
(0163) {
(0164)    uchar i,j,k,mid ;
(0165)    uchar buf[4];
(0166)    CLI();              //暂时屏蔽外部中断
    0100 94F8      BCLR	7
(0167)    
(0168)    for (i=0;i<9;i++)
    0101 2744      CLR	R20
    0102 C006      RJMP	0x0109
(0169)    {
(0170) 	   Delay882uS();      //调用882uS延迟程序。
    0103 DF5D      RCALL	_Delay882uS
(0171) 	   if((PIND&0x08)!=0) //判断INT1端口的状态。操作的是PD3,PD3为高吗?
    0104 9B83      SBIS	0x10,3
    0105 C002      RJMP	0x0108
(0172) 	   {
(0173) 	   	SEI();           //开中断
    0106 9478      BSET	7
(0174) 	   	return;          //如果为高,说明是干扰或出错,跳出这个循环。
    0107 C038      RJMP	0x0140
    0108 9543      INC	R20
    0109 3049      CPI	R20,0x9
    010A F3C0      BCS	0x0103
(0175) 	   }
(0176)    }
(0177)    while ((PIND & 0x08) == 0); //等待9ms的低电平结束,
    010B 9B83      SBIS	0x10,3
    010C CFFE      RJMP	0x010B
(0178)    
(0179)    while ((PIND & 0x08) != 0); //等待4.5ms的高电平结束,
    010D 9983      SBIC	0x10,3
    010E CFFE      RJMP	0x010D
(0180) 
(0181)    for (j=0;j<4;j++)
    010F 2766      CLR	R22
    0110 C021      RJMP	0x0132
(0182)    {
(0183)        k=0;
    0111 24AA      CLR	R10
(0184) 	   for (i=0;i<8;i++)
    0112 2744      CLR	R20
    0113 C015      RJMP	0x0129
(0185)        {
(0186)           while((PIND&0x08)==0); //等待每一个数据位的0.565ms低电平后的高电平
    0114 9B83      SBIS	0x10,3
    0115 CFFE      RJMP	0x0114
(0187) 	   
(0188) 	      Delay882uS();          //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
    0116 DF4A      RCALL	_Delay882uS
(0189) 	   
(0190) 	      mid = PIND & 0x08;    //读取端口的值。
    0117 B380      IN	R24,0x10
    0118 7088      ANDI	R24,0x8
    0119 2EC8      MOV	R12,R24
(0191) 	      if (mid != 0)
    011A 2388      TST	R24
    011B F031      BEQ	0x0122
(0192) 	      {
(0193) 	          Delay1000uS();     //为高电平,再延迟1ms,
    011C DF58      RCALL	_Delay1000uS
(0194) 			  k |= 1<<i;       //读取1
    011D E001      LDI	R16,1
    011E 2F14      MOV	R17,R20
    011F D08C      RCALL	lsl8
    0120 2AA0      OR	R10,R16
(0195) 	      }
    0121 C006      RJMP	0x0128
(0196) 	      else
(0197) 	      {
(0198) 			  k &= ~(1<<i);       //读取0
    0122 E001      LDI	R16,1
    0123 2F14      MOV	R17,R20
    0124 D087      RCALL	lsl8
    0125 2E20      MOV	R2,R16
    0126 9420      COM	R2
    0127 20A2      AND	R10,R2
    0128 9543      INC	R20
    0129 3048      CPI	R20,0x8
    012A F348      BCS	0x0114
(0199) 	      }
(0200)         }
(0201) 		buf[j] = k ;          //保存读到的数据
    012B 01CE      MOVW	R24,R28
    012C 2FE6      MOV	R30,R22
    012D 27FF      CLR	R31
    012E 0FE8      ADD	R30,R24
    012F 1FF9      ADC	R31,R25
    0130 82A0      STD	Z+0,R10
    0131 9563      INC	R22
    0132 3064      CPI	R22,4
    0133 F2E8      BCS	0x0111
(0202)    }
(0203)    
(0204)    if ((buf[2]|buf[3]) != 0xff)  //判断数据的第三字节和第四字节的取反后相等吗?
    0134 802B      LDD	R2,Y+3
    0135 818A      LDD	R24,Y+2
    0136 2982      OR	R24,R2
    0137 3F8F      CPI	R24,0xFF
    0138 F011      BEQ	0x013B
(0205)    {
(0206) 	   	SEI(); //开中断
    0139 9478      BSET	7
(0207) 	   	return;     //如果不相等说明是干扰或出错,跳出整个循环。
    013A C005      RJMP	0x0140
(0208)    }  
(0209)    key_decode (buf[2]);   //判断键值并显示,系统码即buf[1]和buf[2]忽略。
    013B 810A      LDD	R16,Y+2
    013C DF4B      RCALL	_key_decode
(0210)    //PORTC = buf[2];    //直接显示键值
(0211)    spk(1000); //蜂鸣器响一声。
    013D EE08      LDI	R16,0xE8
    013E DFA1      RCALL	_spk
(0212)    SEI(); //开中断
    013F 9478      BSET	7
    0140 9624      ADIW	R28,4
    0141 D01B      RCALL	pop_gset4
    0142 D052      RCALL	pop_lset
    0143 9518      RETI
(0213) }
(0214) //------------------------main----------------------------
(0215) void main (void)    
(0216) {
(0217)     Init_mcu();       //单片机端口初始化,口方向设置与外部中断的使用无关,不影响。
_main:
    0144 DFA4      RCALL	_Init_mcu
(0218) 	spk(1000);             //蜂鸣器响一声。
    0145 EE08      LDI	R16,0xE8
    0146 DF99      RCALL	_spk
(0219) 	init_int1();       //外部中断1初始化
    0147 DFAB      RCALL	_init_int1
(0220) 	SEI();             //开中断
    0148 9478      BSET	7
(0221) 	PORTC=0b10111111;  ///上电后初始显示"-"
    0149 EB8F      LDI	R24,0xBF
    014A BB85      OUT	0x15,R24
(0222) 	while (1)
FILE: <library>
    014B CFFF      RJMP	0x014B
    014C 9508      RET
empy16s:
    014D 920A      ST	R0,-Y
    014E 921A      ST	R1,-Y
    014F 938A      ST	R24,-Y
    0150 939A      ST	R25,-Y
    0151 9F02      MUL	R16,R18
    0152 01C0      MOVW	R24,R0
    0153 9F12      MUL	R17,R18
    0154 0D90      ADD	R25,R0
    0155 9F03      MUL	R16,R19
    0156 0D90      ADD	R25,R0
    0157 018C      MOVW	R16,R24
    0158 9199      LD	R25,Y+
    0159 9189      LD	R24,Y+
    015A 9019      LD	R1,Y+
    015B 9009      LD	R0,Y+
    015C 9508      RET
pop_gset4:
    015D E0E8      LDI	R30,0x8
    015E C00C      RJMP	pop
push_gset5:
    015F 92FA      ST	R15,-Y
    0160 92EA      ST	R14,-Y
push_gset4:
    0161 92DA      ST	R13,-Y
    0162 92CA      ST	R12,-Y
push_gset3:
    0163 92BA      ST	R11,-Y
    0164 92AA      ST	R10,-Y
push_gset2:
    0165 937A      ST	R23,-Y
    0166 936A      ST	R22,-Y
push_gset1:
    0167 935A      ST	R21,-Y
    0168 934A      ST	R20,-Y
    0169 9508      RET
pop_gset1:
    016A E0E1      LDI	R30,1
pop:
    016B 9149      LD	R20,Y+
    016C 9159      LD	R21,Y+
    016D FDE0      SBRC	R30,0
    016E 9508      RET
    016F 9169      LD	R22,Y+
    0170 9179      LD	R23,Y+
    0171 FDE1      SBRC	R30,1
    0172 9508      RET
    0173 90A9      LD	R10,Y+
    0174 90B9      LD	R11,Y+
    0175 FDE2      SBRC	R30,2
    0176 9508      RET
    0177 90C9      LD	R12,Y+
    0178 90D9      LD	R13,Y+
    0179 FDE3      SBRC	R30,3
    017A 9508      RET
    017B 90E9      LD	R14,Y+
    017C 90F9      LD	R15,Y+
    017D 9508      RET
push_lset:
    017E 93FA      ST	R31,-Y
    017F 93EA      ST	R30,-Y
    0180 93BA      ST	R27,-Y
    0181 93AA      ST	R26,-Y
    0182 939A      ST	R25,-Y
    0183 938A      ST	R24,-Y
    0184 933A      ST	R19,-Y
    0185 932A      ST	R18,-Y
    0186 931A      ST	R17,-Y
    0187 930A      ST	R16,-Y
    0188 929A      ST	R9,-Y
    0189 928A      ST	R8,-Y
    018A 927A      ST	R7,-Y
    018B 926A      ST	R6,-Y
    018C 925A      ST	R5,-Y
    018D 924A      ST	R4,-Y
    018E 923A      ST	R3,-Y
    018F 922A      ST	R2,-Y
    0190 921A      ST	R1,-Y
    0191 920A      ST	R0,-Y
    0192 B60F      IN	R0,0x3F
    0193 920A      ST	R0,-Y
    0194 9508      RET
pop_lset:
    0195 9009      LD	R0,Y+
    0196 BE0F      OUT	0x3F,R0
    0197 9009      LD	R0,Y+
    0198 9019      LD	R1,Y+
    0199 9029      LD	R2,Y+
    019A 9039      LD	R3,Y+
    019B 9049      LD	R4,Y+
    019C 9059      LD	R5,Y+
    019D 9069      LD	R6,Y+
    019E 9079      LD	R7,Y+
    019F 9089      LD	R8,Y+
    01A0 9099      LD	R9,Y+
    01A1 9109      LD	R16,Y+
    01A2 9119      LD	R17,Y+
    01A3 9129      LD	R18,Y+
    01A4 9139      LD	R19,Y+
    01A5 9189      LD	R24,Y+
    01A6 9199      LD	R25,Y+
    01A7 91A9      LD	R26,Y+
    01A8 91B9      LD	R27,Y+
    01A9 91E9      LD	R30,Y+
    01AA 91F9      LD	R31,Y+
    01AB 9508      RET
lsl8:
    01AC 2311      TST	R17
    01AD F019      BEQ	0x01B1
    01AE 0F00      LSL	R16
    01AF 951A      DEC	R17
    01B0 CFFB      RJMP	lsl8
    01B1 9508      RET

⌨️ 快捷键说明

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