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