;電子報2001年18期12版
Cs_X1 EQU 26H ;數(shù)據(jù)緩沖區(qū)字節(jié)數(shù)
Cs0_X1 EQU 25H ;緩沖區(qū)一個字節(jié)有幾位
U0_X1 EQU 40H ;數(shù)據(jù)臨時存放字節(jié),存滿8位后送2AH~2FH
N0_M EQU 1EH ;鍵值存放單元
N0_J EQU 1FH ;遙控器識別碼
X1_N1 EQU 2AH ;連續(xù)六個單元,(可位操作)作
X1_N2 EQU 2BH ;遙控輸入數(shù)據(jù)緩沖區(qū)
X1_N3 EQU 2CH
X1_N4 EQU 2DH
X1_N5 EQU 2EH
X1_N6 EQU 2FH
ORG 00H ;轉(zhuǎn)主程序
LJMP REST0
ORG 13H
LJMP INT_X1 ;轉(zhuǎn)外部中斷1
ORG 100H
REST0: CLR EA ;關(guān)中斷
MOV SP,#60H ;設(shè)置堆棧
MOV R0,#50H ;0~50H清0
CLR A
RE_0: MOV @R0,A
DJNZ R0,RE_0
MOV IP,#00H ;中斷優(yōu)先級
CLR TR1 ;關(guān)T1
MOV TL1,#00H ;T1時間常數(shù)送初值
MOV TH1,#00H
MOV 18H,#2AH ;在INT1中斷服務(wù)程序中使用工#3寄存器,R0=2AH
MOV Cs0_X1,#06H ;輸入數(shù)據(jù)取6個字節(jié)
MOV Cs_X1,#08H ;每個字節(jié)8位
MOV N0_M,#0FFH ;識別碼先送FFH,以免在未送數(shù)時錯當(dāng)有數(shù)
MOV A,#1FH ;選擇T1,高4位送01H,低4位不變
ANL TMOD,A ;送T1參數(shù),但不影響其他參數(shù)
SETB EX1 ;開中斷1,INT1
SETB IT1 ;INT1下降沿觸發(fā)
SETB EA ;開中斷,等待
LOOP: LJMP lOOP
…
…
INT_X1: PUSH ACC
PUSH PSW
ORL PSW,#18H ;取3#區(qū)寄存器
CLR TR1 ;T1停止計數(shù)
MOV R2,TH1 ;取T1計數(shù)次數(shù)
MOV R3,TL1
MOV R4,#01H ;0190H~0200H為數(shù)據(jù)窗口0
MOV R5,#90H ;窗口0的下限
LCALL SUB0 ;計數(shù)值小于190H嗎?
JC X1_OUT1 ;<190H,作廢
MOV R4,#02H ;窗口0的上限
MOV R5,#00H
MOV R2,TH1 ;取T1計數(shù)次數(shù)
MOV R3,TL1
LCALL SUB0 ;計數(shù)值大于200H嗎?
JNC X1_01 ;>200,去看是否在1的窗口
CLR C ;在窗口0中,清C,移位時移入0
LJMP X1_02 ;去移位處理
X1_01: MOV R4,#03H ;窗口1的下限
MOV R5,#90H ;0390H~0400H為窗口1
MOV R2,TH1 ;取T1計數(shù)次數(shù)
MOV R3,TL1
LCALL SUB0 ;計數(shù)值小于390H嗎?
JC X1_OUT1 ;<0390,作廢
MOV R4,#04H ;窗口1的上限
MOV R5,#00H ;#0400
MOV R2,TH1 ;取T1計數(shù)次數(shù)
MOV R3,TL1
LCALL SUB0 ;計數(shù)值大于#400H嗎?
JNC X1_OUT1 ;>400H,作廢
SETB C ;在窗口1中,將C置1
X1_02: MOV A,U0_X1 ;臨時存放單元送A
RLC A ;左移,0或1進入D0
MOV U0_X1,A ;新輸入的一位數(shù)據(jù)移入U0_X1單元(40H)
DJNZ Cs_X1,X1_OUT1 ;不到8位轉(zhuǎn)走
MOV Cs_X1,#08H ;下一個數(shù)據(jù)還是8位
MOV @R0,U0_X1 ;數(shù)據(jù)存入@R0
INC R0 ;下一個數(shù)據(jù)存入下一字節(jié)
DJNZ Cs0_X1,X1_OUT1 ;不夠6個數(shù)中斷返回
LJMP X1_10 ;已存滿6個數(shù),轉(zhuǎn)去處理
X1_OUT1:MOV TH1,#00H ;送T1時間常數(shù)
MOV TL1,#00H
SETB TR1 ;啟動T1
POP PSW
POP ACC
SETB EA ;開中斷,中斷返回
RETI ;以下為數(shù)據(jù)處理程序
X1_10: MOV Cs0_X1,#10H ;最多移位10H次
MOV A,X1_N1 ;第一個字節(jié)送A
X1S_01: CJNE A,#0E2H,X1S_00 ;E2H為識別碼,(A)不等于#E2H轉(zhuǎn)去移位
MOV A,X1_N3 ;(A)=#E2H,第三個字節(jié)也等于#E2H嗎
X1S_03: CJNE A,#0E2H,X1S_00 ;不等,轉(zhuǎn)去移位
MOV A,X1_N4 ;等,再看第二個字節(jié)和第四個字節(jié)相等嗎?
CJNE A,X1_N2,X1S_00 ;不等,轉(zhuǎn)去移位
SJMP X1S_07 ;識別碼,數(shù)據(jù)全部正確
X1S_00: CLR C ;以下為六個字節(jié)依次移位
MOV A,X1_N6
RLC A
MOV X1_N6,A
MOV A,X1_N5
RLC A
MOV X1_N5,A
MOV A,X1_N4
RLC A
MOV X1_N4,A
MOV A,X1_N3
RLC A
MOV X1_N3,A
MOV A,X1_N2
RLC A
MOV X1_N2,A
MOV A,X1_N1
RLC A
MOV X1_N1,A ;移完
DJNZ Cs0_X1,X1S_01 ;沒移夠10H次再去判斷
X1S_04: MOV A,X1_N3 ;已移夠10H次,再判斷一次
CJNE A,X1_N1,X1S_05 ;(2AH)不等于(2CH)或不等于#E2H,數(shù)據(jù)作廢
CJNE A,#0E2H,X1S_05
MOV A,X1_N2 ;(2AH)=(2CH)=#E2H,再看(2BH)=(2DH)嗎
CJNE A,X1_N4,X1S_05 ;不等,轉(zhuǎn)走
X1S_07: MOV NO_J,X1_N1 ;識別碼送N0_J
MOV NO_M,X1_N2 ;數(shù)據(jù)送N0_M
LCALL DEL10mS
X1S_06: MOV Cs_X1,#08H ;準備接收下一個數(shù)據(jù),一個字節(jié)8位
MOV R0,#2AH ;下一個數(shù)據(jù)首地址
MOV Cs0_X1,#06H ;6個字節(jié)
LJMP X1_OUT1 ;轉(zhuǎn)走
X1S_05: MOV NO_M,#0FFH ;數(shù)據(jù)單元送#FFH
MOV NO_J,#00H ;識別存儲單元送#00
SJMP X1S_06 ;去準備接收下一個數(shù)據(jù)
SUB0: CLR CY ;減法子程序
MOV A,R3 ;被減數(shù)低位送A
SUBB A,R5 ;低位減
JNC X1_S1 ;沒進位,去處理高位減法
DEC R2 ;有進位,被減數(shù)高位減1
X1_S1: CLR CY ;清C
MOV A,R2 ;被減數(shù)高位
SUBB A,R4 ;減被減數(shù)高位
RET ;返回
DEL10mS:MOV R2,#0FFH ;延時子程序
DEL_01: MOV R3,#0FFH
DEL_02: NOP
NOP
DJNZ R3,DEL_02
DJNZ R2,DEL_01
RET
END