|
;電子報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進(jìn)入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 ;準(zhǔn)備接收下一個數(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 ;去準(zhǔn)備接收下一個數(shù)據(jù) SUB0: CLR CY ;減法子程序 MOV A,R3 ;被減數(shù)低位送A SUBB A,R5 ;低位減 JNC X1_S1 ;沒進(jìn)位,去處理高位減法 DEC R2 ;有進(jìn)位,被減數(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 |