📄 ir_data.s
字号:
.module IR_DATA.C
.area text(rom, con, rel)
.dbfile D:\WORK\ELECTR~1\proteus\M167LE~1\c\IR_DATA.C
.dbfunc e CheckIR _CheckIR fV
.even
_CheckIR::
.dbline -1
.dbline 6
; #include <iom16v.h>
; #include <macros.h>
; #include "IR_DATA.H"
; //红外解码
; void CheckIR()
; {
.dbline 8
; //uchar iNowBit,iPos;
; if ((PIND&(1<<IR))>0) //ICP INPUT CHECK
clr R2
in R24,0x10
andi R24,64
cp R2,R24
brsh L2
.dbline 9
; iNowBit=0;
sts _iNowBit,R2
xjmp L3
L2:
.dbline 11
; else
; iNowBit=1;//先反相
ldi R24,1
sts _iNowBit,R24
L3:
.dbline 14
;
; //把信号持续的处理作为公共处理
; if ((iPreBit==1)&&(iNowBit==1))//hight++
lds R24,_iPreBit
cpi R24,1
brne L4
lds R24,_iNowBit
cpi R24,1
brne L4
.dbline 15
; { iHight++;
.dbline 15
.dbline 16
; return;
lds R24,_iHight
subi R24,255 ; addi 1
sts _iHight,R24
xjmp L1
L4:
.dbline 18
; }
; if ((iPreBit==0)&&(iNowBit==0))//low++
lds R2,_iPreBit
tst R2
brne L6
lds R2,_iNowBit
tst R2
brne L6
.dbline 19
; { iLow++;
.dbline 19
.dbline 20
; return;
lds R24,_iLow
subi R24,255 ; addi 1
sts _iLow,R24
xjmp L1
L6:
.dbline 23
; }
;
; switch (iIrMode)
lds R16,_iIrMode
clr R17
cpi R16,0
cpc R16,R17
breq L11
X0:
cpi R16,1
ldi R30,0
cpc R17,R30
breq L18
cpi R16,2
ldi R30,0
cpc R17,R30
brne X4
xjmp L26
X4:
xjmp L8
X1:
.dbline 24
; {
L11:
.dbline 26
; case 0://等待9ms的高电平
; if ((iPreBit==0)&&(iNowBit==1))//0->1:start
lds R2,_iPreBit
tst R2
brne L12
lds R24,_iNowBit
cpi R24,1
brne L12
.dbline 27
; { iPreBit=1;
.dbline 27
.dbline 28
; iHight=1;
.dbline 29
; return;
ldi R24,1
sts _iPreBit,R24
sts _iHight,R24
xjmp L1
L12:
.dbline 32
; }
;
; if ((iPreBit==1)&&(iNowBit==0))//1->0
lds R24,_iPreBit
cpi R24,1
breq X5
xjmp L9
X5:
lds R2,_iNowBit
tst R2
breq X6
xjmp L9
X6:
.dbline 33
; { iPreBit=0;
.dbline 33
.dbline 34
; if (iHight>12)//1.30ms
clr R2
sts _iPreBit,R2
ldi R24,12
lds R2,_iHight
cp R24,R2
brsh L16
.dbline 35
; { iIrMode=1;
.dbline 35
.dbline 36
; iLow=1;
.dbline 37
; iHight=0;
ldi R24,1
sts _iIrMode,R24
sts _iLow,R24
clr R2
sts _iHight,R2
.dbline 39
; //bCmdOk=1;iCmd=10;//Test..
; }
xjmp L1
L16:
.dbline 41
; else
; {iHight=0;//reset
.dbline 41
clr R2
sts _iHight,R2
.dbline 42
; }
.dbline 43
; return;
xjmp L1
X2:
.dbline 45
; }
; break;
L18:
.dbline 48
;
; case 1://等待1.6ms的低电平
; if ((iPreBit==0)&&(iNowBit==1))//0->1
lds R2,_iPreBit
tst R2
breq X7
xjmp L9
X7:
lds R24,_iNowBit
cpi R24,1
breq X8
xjmp L9
X8:
.dbline 49
; { iPreBit=1;
.dbline 49
.dbline 50
; if (iLow>15)//1.6ms
ldi R24,1
sts _iPreBit,R24
ldi R24,15
lds R2,_iLow
cp R24,R2
brsh L21
.dbline 51
; { iIrMode=2;
.dbline 51
.dbline 52
; iBitCount=0;
.dbline 53
; iIrData[0]=0;iIrData[1]=0;iIrData[2]=0;iIrData[3]=0;
.dbline 53
ldi R24,2
sts _iIrMode,R24
clr R2
sts _iBitCount,R2
sts _iIrData,R2
sts _iIrData+1,R2
.dbline 53
sts _iIrData+2,R2
.dbline 53
sts _iIrData+3,R2
.dbline 54
; iHight=1;
ldi R24,1
sts _iHight,R24
.dbline 56
; //bCmdOk=1;iCmd=10;//Test..
; }
xjmp L1
L21:
.dbline 58
; else
; { iIrMode=0;
.dbline 58
clr R2
sts _iIrMode,R2
.dbline 60
; //确实只发送一次,后面的是按键保持信号,无按键码信息
; }
.dbline 61
; return;
xjmp L1
X3:
.dbline 64
; }
;
; break;
L26:
.dbline 68
;
; case 2://接收用户码和按键码,共32Bit
;
; if ((iPreBit==1)&&(iNowBit==0))//1->0
lds R24,_iPreBit
cpi R24,1
brne L27
lds R2,_iNowBit
tst R2
brne L27
.dbline 69
; { iPreBit=0;
.dbline 69
.dbline 70
; iLow=1;
clr R2
sts _iPreBit,R2
ldi R24,1
sts _iLow,R24
.dbline 71
; }
L27:
.dbline 72
; if ((iPreBit==0)&&(iNowBit==1))//0->1
lds R2,_iPreBit
tst R2
breq X9
xjmp L9
X9:
lds R24,_iNowBit
cpi R24,1
breq X10
xjmp L9
X10:
.dbline 73
; { iPreBit=1;
.dbline 73
.dbline 75
ldi R24,1
sts _iPreBit,R24
lds R2,_iHight
mov R3,R2
add R3,R2
lds R2,_iLow
cp R3,R2
brsh L31
.dbline 75
clr R2
sts _iNowBit,R2
xjmp L32
L31:
.dbline 75
; //已经接收1Bit,根据占空比判断01
; if (iLow>(iHight+iHight)) iNowBit=0;else iNowBit=1;
ldi R24,1
sts _iNowBit,R24
L32:
.dbline 78
;
; //Bit0在前,右移位
; iPos=iBitCount/4;
.dbline 79
; iIrData[iPos]=iIrData[iPos]>>1;
lds R2,_iBitCount
lsr R2
lsr R2
sts _iPos,R2
ldi R24,<_iIrData
ldi R25,>_iIrData
clr R3
add R2,R24
adc R3,R25
movw R30,R2
ldd R4,z+0
lsr R4
std z+0,R4
.dbline 80
; if (iNowBit==1) iIrData[iPos]|=0x80;
lds R24,_iNowBit
cpi R24,1
brne L33
.dbline 80
ldi R24,<_iIrData
ldi R25,>_iIrData
lds R2,_iPos
clr R3
add R2,R24
adc R3,R25
movw R30,R2
ldd R24,z+0
ori R24,128
std z+0,R24
L33:
.dbline 82
;
; iBitCount++;
.dbline 83
; if (iBitCount>=24)
lds R24,_iBitCount
subi R24,255 ; addi 1
sts _iBitCount,R24
cpi R24,24
brlo L35
.dbline 84
; { bIrCmdOk=1;
.dbline 84
.dbline 85
; iIrMode=0;
ldi R24,1
sts _bIrCmdOk,R24
clr R2
sts _iIrMode,R2
.dbline 87
; //bCmdOk=1;iCmd=10;//Test..
; }
L35:
.dbline 89
;
; iHight=1;//must!
ldi R24,1
sts _iHight,R24
.dbline 90
; }
.dbline 91
; break;
xjmp L9
L8:
.dbline 93
clr R2
sts _iIrMode,R2
.dbline 94
L9:
.dbline -2
.dbline 96
; default:
; iIrMode=0;
; break;
; }
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e display_times _display_times fV
.even
_display_times::
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile D:\WORK\ELECTR~1\proteus\M167LE~1\c\IR_DATA.C
_iIrData::
.blkb 6
.dbfile D:\WORK\ELECTR~1\proteus\M167LE~1\c/IR_DATA.H
.dbsym e iIrData _iIrData A[6:6]c
_bIrCmdOk::
.blkb 1
.dbsym e bIrCmdOk _bIrCmdOk c
_iBitCount::
.blkb 1
.dbsym e iBitCount _iBitCount c
_iIrMode::
.blkb 1
.dbsym e iIrMode _iIrMode c
_iLow::
.blkb 1
.dbsym e iLow _iLow c
_iHight::
.blkb 1
.dbsym e iHight _iHight c
_iNowBit::
.blkb 1
.dbsym e iNowBit _iNowBit c
_iPreBit::
.blkb 1
.dbsym e iPreBit _iPreBit c
_iPos::
.blkb 1
.dbsym e iPos _iPos c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -