📄 ir.lis
字号:
0154 8068 ori R24,128
0156 8BBF out 0x3b,R24
0158 .dbline -2
0158 L48:
0158 .dbline 0 ; func end
0158 0895 ret
015A .dbend
015A .dbfunc e int1_serving _int1_serving fV
015A ; buf -> y+0
015A ; j -> R22
015A ; k -> R10
015A ; mid -> R12
015A ; i -> R20
.even
015A _int1_serving::
015A 00D0 rcall push_lset
015C 00D0 rcall push_gset4
015E 2497 sbiw R28,4
0160 .dbline -1
0160 .dbline 163
0160 ; }
0160 ; /************************************************
0160 ; 函 数 名: Init_serving()
0160 ; 功 能: 红外IR接收中断服务程序
0160 ; 输入参数: /
0160 ; 输出参数: /
0160 ; 描 述: 整个红外译码部分的处理
0160 ; ***********************************************/
0160 ; void int1_serving (void) //外部中断1,红外IR接收中断服务程序
0160 ; {
0160 .dbline 166
0160 ; uchar i,j,k,mid ;
0160 ; uchar buf[4];
0160 ; CLI(); //暂时屏蔽外部中断
0160 F894 cli
0162 .dbline 168
0162 ;
0162 ; for (i=0;i<9;i++)
0162 4427 clr R20
0164 06C0 rjmp L53
0166 L50:
0166 .dbline 169
0166 ; {
0166 .dbline 170
0166 ; Delay882uS(); //调用882uS延迟程序。
0166 5DDF rcall _Delay882uS
0168 .dbline 171
0168 ; if((PIND&0x08)!=0) //判断INT1端口的状态。操作的是PD3,PD3为高吗?
0168 839B sbis 0x10,3
016A 02C0 rjmp L54
016C .dbline 172
016C ; {
016C .dbline 173
016C ; SEI(); //开中断
016C 7894 sei
016E .dbline 174
016E ; return; //如果为高,说明是干扰或出错,跳出这个循环。
016E 38C0 rjmp L49
0170 L54:
0170 .dbline 176
0170 L51:
0170 .dbline 168
0170 4395 inc R20
0172 L53:
0172 .dbline 168
0172 4930 cpi R20,9
0174 C0F3 brlo L50
0176 L56:
0176 .dbline 177
0176 L57:
0176 .dbline 177
0176 ; }
0176 ; }
0176 ; while ((PIND & 0x08) == 0); //等待9ms的低电平结束,
0176 839B sbis 0x10,3
0178 FECF rjmp L56
017A L59:
017A .dbline 179
017A L60:
017A .dbline 179
017A ;
017A ; while ((PIND & 0x08) != 0); //等待4.5ms的高电平结束,
017A 8399 sbic 0x10,3
017C FECF rjmp L59
017E .dbline 181
017E ;
017E ; for (j=0;j<4;j++)
017E 6627 clr R22
0180 21C0 rjmp L65
0182 L62:
0182 .dbline 182
0182 ; {
0182 .dbline 183
0182 ; k=0;
0182 AA24 clr R10
0184 .dbline 184
0184 ; for (i=0;i<8;i++)
0184 4427 clr R20
0186 15C0 rjmp L69
0188 X5:
0188 .dbline 185
0188 ; {
0188 L70:
0188 .dbline 186
0188 L71:
0188 .dbline 186
0188 ; while((PIND&0x08)==0); //等待每一个数据位的0.565ms低电平后的高电平
0188 839B sbis 0x10,3
018A FECF rjmp L70
018C .dbline 188
018C ;
018C ; Delay882uS(); //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
018C 4ADF rcall _Delay882uS
018E .dbline 190
018E ;
018E ; mid = PIND & 0x08; //读取端口的值。
018E 80B3 in R24,0x10
0190 8870 andi R24,8
0192 C82E mov R12,R24
0194 .dbline 191
0194 ; if (mid != 0)
0194 8823 tst R24
0196 31F0 breq L73
0198 .dbline 192
0198 ; {
0198 .dbline 193
0198 ; Delay1000uS(); //为高电平,再延迟1ms,
0198 58DF rcall _Delay1000uS
019A .dbline 194
019A ; k |= 1<<i; //读取1
019A 01E0 ldi R16,1
019C 142F mov R17,R20
019E 00D0 rcall lsl8
01A0 A02A or R10,R16
01A2 .dbline 195
01A2 ; }
01A2 06C0 rjmp L74
01A4 L73:
01A4 .dbline 197
01A4 ; else
01A4 ; {
01A4 .dbline 198
01A4 ; k &= ~(1<<i); //读取0
01A4 01E0 ldi R16,1
01A6 142F mov R17,R20
01A8 00D0 rcall lsl8
01AA 202E mov R2,R16
01AC 2094 com R2
01AE A220 and R10,R2
01B0 .dbline 199
01B0 ; }
01B0 L74:
01B0 .dbline 200
01B0 L67:
01B0 .dbline 184
01B0 4395 inc R20
01B2 L69:
01B2 .dbline 184
01B2 4830 cpi R20,8
01B4 48F3 brlo L71
01B6 .dbline 201
01B6 CE01 movw R24,R28
01B8 E62F mov R30,R22
01BA FF27 clr R31
01BC E80F add R30,R24
01BE F91F adc R31,R25
01C0 A082 std z+0,R10
01C2 .dbline 202
01C2 L63:
01C2 .dbline 181
01C2 6395 inc R22
01C4 L65:
01C4 .dbline 181
01C4 6430 cpi R22,4
01C6 E8F2 brlo L62
01C8 .dbline 204
01C8 ; }
01C8 ; buf[j] = k ; //保存读到的数据
01C8 ; }
01C8 ;
01C8 ; if ((buf[2]|buf[3]) != 0xff) //判断数据的第三字节和第四字节的取反后相等吗?
01C8 2B80 ldd R2,y+3
01CA 8A81 ldd R24,y+2
01CC 8229 or R24,R2
01CE 8F3F cpi R24,255
01D0 11F0 breq L75
01D2 .dbline 205
01D2 ; {
01D2 .dbline 206
01D2 ; SEI(); //开中断
01D2 7894 sei
01D4 .dbline 207
01D4 ; return; //如果不相等说明是干扰或出错,跳出整个循环。
01D4 05C0 rjmp L49
01D6 L75:
01D6 .dbline 209
01D6 ; }
01D6 ; key_decode (buf[2]); //判断键值并显示,系统码即buf[1]和buf[2]忽略。
01D6 0A81 ldd R16,y+2
01D8 4BDF rcall _key_decode
01DA .dbline 211
01DA ; //PORTC = buf[2]; //直接显示键值
01DA ; spk(1000); //蜂鸣器响一声。
01DA 08EE ldi R16,232
01DC A1DF rcall _spk
01DE .dbline 212
01DE ; SEI(); //开中断
01DE 7894 sei
01E0 .dbline -2
01E0 L49:
01E0 2496 adiw R28,4
01E2 00D0 rcall pop_gset4
01E4 00D0 rcall pop_lset
01E6 .dbline 0 ; func end
01E6 1895 reti
01E8 .dbsym l buf 0 A[4:4]c
01E8 .dbsym r j 22 c
01E8 .dbsym r k 10 c
01E8 .dbsym r mid 12 c
01E8 .dbsym r i 20 c
01E8 .dbend
01E8 .dbfunc e main _main fV
.even
01E8 _main::
01E8 .dbline -1
01E8 .dbline 216
01E8 ; }
01E8 ; //------------------------main----------------------------
01E8 ; void main (void)
01E8 ; {
01E8 .dbline 217
01E8 ; Init_mcu(); //单片机端口初始化,口方向设置与外部中断的使用无关,不影响。
01E8 A4DF rcall _Init_mcu
01EA .dbline 218
01EA ; spk(1000); //蜂鸣器响一声。
01EA 08EE ldi R16,232
01EC 99DF rcall _spk
01EE .dbline 219
01EE ; init_int1(); //外部中断1初始化
01EE ABDF rcall _init_int1
01F0 .dbline 220
01F0 ; SEI(); //开中断
01F0 7894 sei
01F2 .dbline 221
01F2 ; PORTC=0b10111111; ///上电后初始显示"-"
01F2 8FEB ldi R24,191
01F4 85BB out 0x15,R24
01F6 L81:
01F6 .dbline 223
01F6 L82:
01F6 .dbline 222
01F6 FFCF rjmp L81
01F8 X6:
01F8 .dbline -2
01F8 L80:
01F8 .dbline 0 ; func end
01F8 0895 ret
01FA .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -