?? 12用tc9148遙控51單片機.asm
字號:
;用TC9148遙控MCS-51單片機源程序-2001年30期12版
;以下置中斷向量
ORG 000BH
LJMP INT0
ORG 0013H
LJMP INX1
;以下為初始化程序
MAIN:MOV 89H,#02H ;置TO方式2定時方式
MOV 8CH,#2EH ;置定時器初值
MOV 8AH,#2EH
SETB IT1 ;置INTO邊沿觸發
SETB ET0
SETB EX0
SETB EA ;開中斷
END: SJMP END ;嵌入其他程序,此句不要
;以下為INT1中斷服務程序
INX1:SETB TRO
SETB 77H
MOV 10H,#01H
MOV 11H,#01H
MOV 12H,#18H
CLR EX1
RETI
;以下為T0中斷服務程序
INT0:PVSH PSW ;保護寄存器
PVSH A
PVSH OPH
PVSH OPL
PVSH R0
CPL 77H
JB 77H,INTE ;每兩次向下執行一次
MOV A,11H ;判斷當前狀態
CJNE A,#01H,INT1 ;狀態1
MOV C,P3.3 ;讀第一次24位數據
ACALL DIN1
MOV A,12H
DEC A
MOV 12H,A
JNZ INTE
MOV 12H,#28H
MOV 11H,#02H
SJMP INTE
INT1:CJNE A,#02H,INT2 ;狀態2
MOV C,P3.3 ;以下5段可省略
JC INT11 ;跳過中間40位
MOV A,#01H
ACALL ERROR
SJMP INTE
INT11:MOV A,12H
DEC A
MOV 12H,A
JNZ INTE
MOV 12H,#18H
MOV 11H,#03H
SJMP INTE
INT2:CJNE A,#03H,INTE ;狀態3
MOV C,P3.3 ;第2次讀數據
ACALL DIN2
MOV A,12H
DEC A
MOV 12H,A
JNZ INTE
MOV 11H,#04H
CLR TRO
MOV 8AH,8CH
ACALL DCMP ;比較兩次讀得的數據
JNC INT3
ACALL ERROR
SJMP INTE
ACALL DMPG ;對數據解碼
JNC INT4
ACALL ERROR
SJMP INTE
INT4:ACALL FUNC ;調用相應的功能子程序
SETB EX1
SJMP INTE
INTE:POP R0 ;出棧
POP DPL
POP DPH
POP A
POP PSW
RETI ;中斷返回
DIN1:MOV A,32H ;將第一次讀得的數據逐位移入
RLC A ;30H,31H,32H單元
MOV 32H,A
MOV A,31H
RLC A
MOV 31H,A
MOV A,30H
RLC A
MOV 30H,A
RET
DIN2:MOV A,35H ;將第2次讀得的數據逐位移入33H,34H
RLC A ;35H單元
MOV 35H,A
MOV A,34H
RLC A
MOV 34H,A
MOV A,33H
RLC A
MOV 33H,A
RET
ERROR:CLR TRO ;接收錯誤則重新開始
MOV 8AH 8CH ;新的接收
SETB EX1
RET
DCMP:MOV A,33H ;兩次讀得數據進行比較
CJNE A,30H,DC1 ;的子程序
MOV A,34H
CJNE A,31H,DC1
MOV A,35H
CJNE A,32H,DC1
MOV A,30H
ANL A,#0FEH
CJNE A,#10H,DC1
MOV R0,#08H
DC2:ACALL DSW ;判斷數據是否符合(2)(3)規則
XCH A,30H ;若是則解出純編碼信號
RRC A
XCH A,30H
ACALL DSW
RRC A
DJNZ R0,DC2
JNZ DC1
MOV A,33H
RRC A
MOV A,30H
CPL A
JNC DC3 ;偶校驗
JB P,DC1
SJMP DC4
DC3:JNBP DC1
DC4:CLR C
MOV 30H,A
RET
DC1:SETB C
MOV A,#02H
RET
DSW:CLRC ;將31H,32H內容右移一位
XCH A,31H
RRC A
XCH A,31H
XCH A,32H
RRC A
XCH A,32H
RET
DMPG:MOV OPTR,#DMB ;對純編碼進行解碼子程序
MOV R0,#00H ;得出相應的鍵號
DM1:MOV A,R0
MOVC A,@A+DPTR
JZ DM2
CJNE A,30H,DM3
INC R0
MOV A,R0
MOVC A,@A+DPTR
CLR C
RET
DM2:MOV A,#03H
SETB C
RET
DM3:INC R0
INC R0
SJMP DM1
FUNC:DEC A ;根據相應鍵號,調用相應的子程序
CLR C ;執行該命令
MOV R0,A
RLC A
ADD A,R0
MOV DPTR,#ZYB
JMP @A+DPTR
ZYB:LJMP FUNC1 ;轉移指令表,FUNC1~FUNC18由用戶自己編寫,以完
LJMP FUNC2 ;成所需的功能,程序以RET指令結束
.
.
.
LJMP FUNC18
DMB:DB 20H,01H,10H,02H,08H,03H,04H,04H ;編碼表(對應鍵號)
DB 02H,05H,01H,06H,41H,07H,42H,08H
DB 44H,09H,48H,0AH,50H,0BH,60H,0CH
DB 81H,0DH,82H,0EH,84H,0FH,88H,10H
DB 90H,11H,A0H,12H,00H,00H
;注:FUNC1~FUNC18為用戶自定義的功能子程序,執行對應K1~K18的功能,應自行編寫,
;若不須用的可用RET指令代替,程序返回使用RET指令。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -