5104搖控解碼程序
請教一下,不用外部中斷,利用定時中斷掃描來實現(xiàn)5104的解碼?
全部回復(4)
正序查看
倒序查看
@meidi688
沒人幫忙,自己頂一下,已經做出來了!求人不如求已,這句話永遠是真理!
松翰寫的.
;;date:2006/02/28
;;版本:1
;;說明:芯片選用SN8P2602A
;;-------------------------------------------------
CHIP SN8P2602A
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Reset_Pin Reset
.Code_Option Watch_Dog Disable ; Disable Watchdog
.Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Fcpu #2 ; Fcpu = High_Clk/4
.Code_Option Security Enable
//}}SONIX_CODE_OPTION
;;=================================================
.DATA
;;通用寄存器定義:
ACC_BUF DS 1
PFLAG_BUF DS 1
TIME_ADD DS 1
PASHE_BUF DS 1
LOOP_A DS 1
LOOP_B DS 1
PASHE_TIME DS 1 ;;相位延遲時間寄存器
YW_2 DS 1
YW_1 DS 1
CMD_BUF DS 1
MC_BUF DS 1
NUMBER DS 1
MC_BIAO DS 1
BIAO03 DS 1
D_TIMER DS 1
T0_BUF DS 1
BIAO DS 1
YK_ING EQU BIAO.0 ;;處理遙控標志
B_BELL EQU BIAO.1 ;;響蜂鳴器標志
ON_OFF EQU BIAO.7 ;;開關狀態(tài)標志
ON_FLAME EQU BIAO.6 ;;火焰狀態(tài)標志
HEAT_EN EQU BIAO.4 ;;加熱開關狀態(tài)標志
LOW_HIGH EQU BIAO.5 ;;加熱檔位狀態(tài)標志
;;=================================================
_LOAD_H EQU P1.3 ;;負載輸出高檔
_LOAD_L EQU P1.2 ;;負載輸出低檔
_LOAD EQU P5.7 ;;火焰輸出
_MG EQU P1.0 ;;電機輸出
_YK EQU P5.0 ;;遙控信號輸入
_BUZZER EQU P5.4 ;;蜂鳴器驅動
;;=================================================
.CODE
ORG 000H
JMP MAIN
ORG 008H
JMP INT_ING
ORG 010H
;;=================================================
;;****************************************************
;;****************************************************
INT_ING:
B0XCH A,ACC_BUF ;;保護ACC
NOP
B0MOV A,PFLAG
MOV PFLAG_BUF,A ;;保護PFLAG
;;-------------------------
INCMS T0_BUF
NOP
NOP
MOV A,T0_BUF
B0ADD PCL,A
NOP
JMP INT_ONE
JMP INT_TWO
JMP INT_THREE
NOP
NOP
CLR T0_BUF
JMP INT_OUT
;;==================================
INT_ONE:
NOP
B0BCLR _LOAD ;;進入中斷首先關負載
NOP
B0BCLR _LOAD
NOP
;;=====================================
NOP
B0BCLR FP00IRQ ;;p0中斷
NOP
;;-------------------------------------
/*
;;------------------------
INCMS TIME_ADD
NOP
NOP
MOV A,#4D
SUB A,TIME_ADD
B0BTS0 FC
JMP INT_ONE_AA
NOP
CLR TIME_ADD
;;------------------------
MOV A,PASHE_BUF
CMPRS A,PASHE_TIME
JMP INT_ONE_CC
NOP
JMP INT_ONE_AA
NOP
;;------------------------
INT_ONE_CC:
NOP
B0BTS0 FC
JMP ONE_ONE
NOP
INCMS PASHE_BUF
NOP
NOP
JMP INT_ONE_AA
ONE_ONE:
NOP
DECMS PASHE_BUF
NOP
NOP
*/
;; === === === === === === === === === ===
;; --- P0.0中斷的任務是關閉負載并啟動定時
;; === === === === === === === === === ===
INT_ONE_AA:
B0BCLR FT0ENB ;;!!!!!!!
B0BCLR FT0IRQ
B0BCLR FT0IEN
;;-----------------------
;;-----------------------
INT_AAA:
B0BCLR FT0ENB
NOP
B0BCLR FT0IRQ
NOP
;;----------------------
MOV A,PASHE_TIME
B0MOV T0C,A ;;加載T0
NOP
B0BCLR FT0IRQ
NOP
B0BSET FT0IEN ;;
NOP
B0BSET FT0ENB ;;啟動T0
B0BCLR FP00IEN
B0BCLR FP00IRQ
JMP INT_OUT
;; === === === === === === === ===
;; T0中斷的任務是開啟負載并啟動1ms定時
;; === === === === === === === ===
INT_TWO:
NOP
NOP
B0BCLR FT0ENB
NOP
MOV A,#240D
B0MOV T0C,A
NOP
B0BCLR FT0IRQ
B0BSET FT0IEN
B0BSET FT0ENB
B0BCLR FP00IRQ
B0BCLR FP00IEN
;;---------------------------
B0BSET _LOAD
NOP
JMP INT_OUT
INT_THREE:
NOP
B0BCLR FT0ENB
CLR T0_BUF
B0BCLR _LOAD
NOP
NOP
B0BCLR FT0IRQ
B0BCLR FT0IEN
B0BCLR FP00IRQ
B0BSET FP00IEN
NOP
;;************************************************
INT_OUT:
MOV A,PFLAG_BUF
B0MOV PFLAG,A ;;恢復PFLAG
NOP
B0XCH A,ACC_BUF ;;恢復ACC
RETI
;;=================================================上電初始化
MAIN:
NOP
MOV A,#0X00
B0MOV P1,A ;;設置P1口初值
MOV A,#0X0F
B0MOV P1M,A
NOP
;;--------------------------
MOV A,#00000001B
B0MOV P5,A
NOP
MOV A,#11111110B
B0MOV P5M,A
NOP
;;------------------------------
B0BCLR _BUZZER
NOP
B0BSET FP54M
;;-------------------------------
MOV A,#0X18
B0MOV PEDGE,A ;;雙邊沿觸發(fā)中斷
;;-------------------------------
;;------------------------------- T0 定時器設置:
NOP
MOV A,#20H
B0MOV T0M,A ;;64 div
MOV A,#130D
B0MOV T0C,A ;;83ms
B0BCLR FT0IRQ
;;-------------------------------
MOV A,#47D
MOV ACC_BUF,A
CLR Y
CLR Z
CLR_RAM:
INCMS Z
NOP
NOP
CLR @YZ
NOP
DECMS ACC_BUF
JMP CLR_RAM
NOP
MOV A,#250D
MOV PASHE_TIME,A
NOP
;; -------------------------------
CALL BUZZER_OPEN
NOP
MOV A,#250D
MOV LOOP_A,A
NOP
DELAY_A:
MOV A,#100D
MOV LOOP_B,A
NOP
DELAY_B:
NOP
DECMS LOOP_B
JMP DELAY_B
NOP
DECMS LOOP_A
JMP DELAY_A
NOP
CALL BUZZER_OFF
NOP
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
START:
NOP
;; --- --- --- --- --- --- --- 檢測遙控信號
;; --- 起始位: 8ms
;; --- 電平 1: 1.25ms
;; --- 電平 0: 0.54ms
NOP
CLR NUMBER
CLR MC_BUF
CLR MC_BIAO
B0BCLR FTC0ENB
CLR YW_1
CLR YW_2
CLR BIAO03
NOP
B0BTS1 _YK
JMP START ;;未檢測到低電平
NOP
;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;;---------------------------------------------起始位寬度
MOV A,#00100000B ;;選擇對時鐘64分頻
B0MOV TC0M,A
MOV A,#00D
B0MOV TC0C,A
B0BCLR FTC0IRQ
B0BSET FTC0ENB
KDKD:
NOP
B0BTS0 _YK
JMP KDKD
NOP
B0BCLR FTC0ENB
NOP
B0MOV A,TC0C
MOV MC_BUF,A
;;********************************************開始判斷脈沖寬度:
B0BTS0 FTC0IRQ
JMP START_DY ;;脈沖太寬,不符合同步脈沖要求
NOP
MOV A,#60D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脈沖太窄,不符合同步脈沖要求
;;--------------------------------------------已檢測到有效的同步信號:
MC_QS:
B0BCLR FTC0ENB
NOP
CLR MC_BUF
MOV A,#12D
MOV NUMBER,A ;;待檢測的脈沖序列為12個
MOV A,#01010000B ;;選擇對時鐘8分頻
B0MOV TC0M,A
NOP
;;///////////////////////////////////啟動TC0:
HHH:
CLR TC0C
B0BCLR FTC0IRQ
B0BSET FTC0ENB
;;*******************************************只檢測高電平寬度
MC_B1:
NOP
B0BTS1 _YK
JMP MC_B1
NOP
B0BCLR FTC0ENB
NOP
B0BTS0 FTC0IRQ
JMP START
NOP
B0MOV A,TC0C ;;取脈沖寬度值
MOV MC_BUF,A ;;暫存
;;**************************************************
;;***============高電平結束,利用低電平持續(xù)時間判斷
;;***============標準寬脈沖=1.25ms;標準窄脈沖=540us
;;**************************************************
MC_AG1:
MOV A,#37D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脈沖太窄,不符合編碼脈沖要求
NOP
MOV A,#200D
SUB A,MC_BUF
NOP
B0BTS1 FC
JMP START ;;脈沖太寬,不符合編碼脈沖要求
NOP
;;-----------------------------------------------
MOV A,#95D
SUB A,MC_BUF
NOP ;;
B0BTS0 FC
JMP MC_LOW
MOV A,#105D
SUB A,MC_BUF
NOP ;;
B0BTS1 FC
JMP MC_HIGH
NOP
JMP START
;;-----------------------------------------
MC_LOW:
NOP
BCLR BIAO03.7
JMP AGIN
MC_HIGH:
BSET BIAO03.7
NOP
;;-----------------------------------------------寬度識別:
AGIN:
B0BCLR FC
NOP
RLCM BIAO03
RLCM YW_1
RLCM YW_2
NOP
B0BCLR FTC0ENB
DECMS NUMBER
JMP KKK ;;檢測下一個脈沖
NOP
CLR NUMBER
JMP JIEMA
KKK:
NOP
B0BTS0 _YK
JMP KKK
NOP
JMP HHH
;;====================================== 等待高電平再次出現(xiàn):
MC_AG2:
NOP
B0BTS1 _YK
JMP MC_AG2
NOP
CLR TC0C
B0BCLR FTC0IRQ
CLR MC_BUF ;;!!!
B0BSET FTC0ENB
JMP MC_B1
JIEMA:
NOP
MOV A,YW_1
MOV CMD_BUF,A ;;控制碼
NOP
;;--------------------------------------
;; *** *** *** *** *** *** *** *** ***
;; --- --- 解碼完成,執(zhí)行遙控指令 ---
;; *** *** *** *** *** *** *** *** ***
MOV A,#0X81
XOR A,YW_1
B0BTS0 FZ
JMP K_POWER ;;開關鍵
;; ---- ---- ---- ---- ---- ---- ----
BTS1 ON_OFF ;;若開關鍵未開
JMP START ;;禁止其他操作
NOP
;; ---- ---- ---- ---- ---- ---- ----
;;date:2006/02/28
;;版本:1
;;說明:芯片選用SN8P2602A
;;-------------------------------------------------
CHIP SN8P2602A
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Reset_Pin Reset
.Code_Option Watch_Dog Disable ; Disable Watchdog
.Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Fcpu #2 ; Fcpu = High_Clk/4
.Code_Option Security Enable
//}}SONIX_CODE_OPTION
;;=================================================
.DATA
;;通用寄存器定義:
ACC_BUF DS 1
PFLAG_BUF DS 1
TIME_ADD DS 1
PASHE_BUF DS 1
LOOP_A DS 1
LOOP_B DS 1
PASHE_TIME DS 1 ;;相位延遲時間寄存器
YW_2 DS 1
YW_1 DS 1
CMD_BUF DS 1
MC_BUF DS 1
NUMBER DS 1
MC_BIAO DS 1
BIAO03 DS 1
D_TIMER DS 1
T0_BUF DS 1
BIAO DS 1
YK_ING EQU BIAO.0 ;;處理遙控標志
B_BELL EQU BIAO.1 ;;響蜂鳴器標志
ON_OFF EQU BIAO.7 ;;開關狀態(tài)標志
ON_FLAME EQU BIAO.6 ;;火焰狀態(tài)標志
HEAT_EN EQU BIAO.4 ;;加熱開關狀態(tài)標志
LOW_HIGH EQU BIAO.5 ;;加熱檔位狀態(tài)標志
;;=================================================
_LOAD_H EQU P1.3 ;;負載輸出高檔
_LOAD_L EQU P1.2 ;;負載輸出低檔
_LOAD EQU P5.7 ;;火焰輸出
_MG EQU P1.0 ;;電機輸出
_YK EQU P5.0 ;;遙控信號輸入
_BUZZER EQU P5.4 ;;蜂鳴器驅動
;;=================================================
.CODE
ORG 000H
JMP MAIN
ORG 008H
JMP INT_ING
ORG 010H
;;=================================================
;;****************************************************
;;****************************************************
INT_ING:
B0XCH A,ACC_BUF ;;保護ACC
NOP
B0MOV A,PFLAG
MOV PFLAG_BUF,A ;;保護PFLAG
;;-------------------------
INCMS T0_BUF
NOP
NOP
MOV A,T0_BUF
B0ADD PCL,A
NOP
JMP INT_ONE
JMP INT_TWO
JMP INT_THREE
NOP
NOP
CLR T0_BUF
JMP INT_OUT
;;==================================
INT_ONE:
NOP
B0BCLR _LOAD ;;進入中斷首先關負載
NOP
B0BCLR _LOAD
NOP
;;=====================================
NOP
B0BCLR FP00IRQ ;;p0中斷
NOP
;;-------------------------------------
/*
;;------------------------
INCMS TIME_ADD
NOP
NOP
MOV A,#4D
SUB A,TIME_ADD
B0BTS0 FC
JMP INT_ONE_AA
NOP
CLR TIME_ADD
;;------------------------
MOV A,PASHE_BUF
CMPRS A,PASHE_TIME
JMP INT_ONE_CC
NOP
JMP INT_ONE_AA
NOP
;;------------------------
INT_ONE_CC:
NOP
B0BTS0 FC
JMP ONE_ONE
NOP
INCMS PASHE_BUF
NOP
NOP
JMP INT_ONE_AA
ONE_ONE:
NOP
DECMS PASHE_BUF
NOP
NOP
*/
;; === === === === === === === === === ===
;; --- P0.0中斷的任務是關閉負載并啟動定時
;; === === === === === === === === === ===
INT_ONE_AA:
B0BCLR FT0ENB ;;!!!!!!!
B0BCLR FT0IRQ
B0BCLR FT0IEN
;;-----------------------
;;-----------------------
INT_AAA:
B0BCLR FT0ENB
NOP
B0BCLR FT0IRQ
NOP
;;----------------------
MOV A,PASHE_TIME
B0MOV T0C,A ;;加載T0
NOP
B0BCLR FT0IRQ
NOP
B0BSET FT0IEN ;;
NOP
B0BSET FT0ENB ;;啟動T0
B0BCLR FP00IEN
B0BCLR FP00IRQ
JMP INT_OUT
;; === === === === === === === ===
;; T0中斷的任務是開啟負載并啟動1ms定時
;; === === === === === === === ===
INT_TWO:
NOP
NOP
B0BCLR FT0ENB
NOP
MOV A,#240D
B0MOV T0C,A
NOP
B0BCLR FT0IRQ
B0BSET FT0IEN
B0BSET FT0ENB
B0BCLR FP00IRQ
B0BCLR FP00IEN
;;---------------------------
B0BSET _LOAD
NOP
JMP INT_OUT
INT_THREE:
NOP
B0BCLR FT0ENB
CLR T0_BUF
B0BCLR _LOAD
NOP
NOP
B0BCLR FT0IRQ
B0BCLR FT0IEN
B0BCLR FP00IRQ
B0BSET FP00IEN
NOP
;;************************************************
INT_OUT:
MOV A,PFLAG_BUF
B0MOV PFLAG,A ;;恢復PFLAG
NOP
B0XCH A,ACC_BUF ;;恢復ACC
RETI
;;=================================================上電初始化
MAIN:
NOP
MOV A,#0X00
B0MOV P1,A ;;設置P1口初值
MOV A,#0X0F
B0MOV P1M,A
NOP
;;--------------------------
MOV A,#00000001B
B0MOV P5,A
NOP
MOV A,#11111110B
B0MOV P5M,A
NOP
;;------------------------------
B0BCLR _BUZZER
NOP
B0BSET FP54M
;;-------------------------------
MOV A,#0X18
B0MOV PEDGE,A ;;雙邊沿觸發(fā)中斷
;;-------------------------------
;;------------------------------- T0 定時器設置:
NOP
MOV A,#20H
B0MOV T0M,A ;;64 div
MOV A,#130D
B0MOV T0C,A ;;83ms
B0BCLR FT0IRQ
;;-------------------------------
MOV A,#47D
MOV ACC_BUF,A
CLR Y
CLR Z
CLR_RAM:
INCMS Z
NOP
NOP
CLR @YZ
NOP
DECMS ACC_BUF
JMP CLR_RAM
NOP
MOV A,#250D
MOV PASHE_TIME,A
NOP
;; -------------------------------
CALL BUZZER_OPEN
NOP
MOV A,#250D
MOV LOOP_A,A
NOP
DELAY_A:
MOV A,#100D
MOV LOOP_B,A
NOP
DELAY_B:
NOP
DECMS LOOP_B
JMP DELAY_B
NOP
DECMS LOOP_A
JMP DELAY_A
NOP
CALL BUZZER_OFF
NOP
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
START:
NOP
;; --- --- --- --- --- --- --- 檢測遙控信號
;; --- 起始位: 8ms
;; --- 電平 1: 1.25ms
;; --- 電平 0: 0.54ms
NOP
CLR NUMBER
CLR MC_BUF
CLR MC_BIAO
B0BCLR FTC0ENB
CLR YW_1
CLR YW_2
CLR BIAO03
NOP
B0BTS1 _YK
JMP START ;;未檢測到低電平
NOP
;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;;---------------------------------------------起始位寬度
MOV A,#00100000B ;;選擇對時鐘64分頻
B0MOV TC0M,A
MOV A,#00D
B0MOV TC0C,A
B0BCLR FTC0IRQ
B0BSET FTC0ENB
KDKD:
NOP
B0BTS0 _YK
JMP KDKD
NOP
B0BCLR FTC0ENB
NOP
B0MOV A,TC0C
MOV MC_BUF,A
;;********************************************開始判斷脈沖寬度:
B0BTS0 FTC0IRQ
JMP START_DY ;;脈沖太寬,不符合同步脈沖要求
NOP
MOV A,#60D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脈沖太窄,不符合同步脈沖要求
;;--------------------------------------------已檢測到有效的同步信號:
MC_QS:
B0BCLR FTC0ENB
NOP
CLR MC_BUF
MOV A,#12D
MOV NUMBER,A ;;待檢測的脈沖序列為12個
MOV A,#01010000B ;;選擇對時鐘8分頻
B0MOV TC0M,A
NOP
;;///////////////////////////////////啟動TC0:
HHH:
CLR TC0C
B0BCLR FTC0IRQ
B0BSET FTC0ENB
;;*******************************************只檢測高電平寬度
MC_B1:
NOP
B0BTS1 _YK
JMP MC_B1
NOP
B0BCLR FTC0ENB
NOP
B0BTS0 FTC0IRQ
JMP START
NOP
B0MOV A,TC0C ;;取脈沖寬度值
MOV MC_BUF,A ;;暫存
;;**************************************************
;;***============高電平結束,利用低電平持續(xù)時間判斷
;;***============標準寬脈沖=1.25ms;標準窄脈沖=540us
;;**************************************************
MC_AG1:
MOV A,#37D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脈沖太窄,不符合編碼脈沖要求
NOP
MOV A,#200D
SUB A,MC_BUF
NOP
B0BTS1 FC
JMP START ;;脈沖太寬,不符合編碼脈沖要求
NOP
;;-----------------------------------------------
MOV A,#95D
SUB A,MC_BUF
NOP ;;
B0BTS0 FC
JMP MC_LOW
MOV A,#105D
SUB A,MC_BUF
NOP ;;
B0BTS1 FC
JMP MC_HIGH
NOP
JMP START
;;-----------------------------------------
MC_LOW:
NOP
BCLR BIAO03.7
JMP AGIN
MC_HIGH:
BSET BIAO03.7
NOP
;;-----------------------------------------------寬度識別:
AGIN:
B0BCLR FC
NOP
RLCM BIAO03
RLCM YW_1
RLCM YW_2
NOP
B0BCLR FTC0ENB
DECMS NUMBER
JMP KKK ;;檢測下一個脈沖
NOP
CLR NUMBER
JMP JIEMA
KKK:
NOP
B0BTS0 _YK
JMP KKK
NOP
JMP HHH
;;====================================== 等待高電平再次出現(xiàn):
MC_AG2:
NOP
B0BTS1 _YK
JMP MC_AG2
NOP
CLR TC0C
B0BCLR FTC0IRQ
CLR MC_BUF ;;!!!
B0BSET FTC0ENB
JMP MC_B1
JIEMA:
NOP
MOV A,YW_1
MOV CMD_BUF,A ;;控制碼
NOP
;;--------------------------------------
;; *** *** *** *** *** *** *** *** ***
;; --- --- 解碼完成,執(zhí)行遙控指令 ---
;; *** *** *** *** *** *** *** *** ***
MOV A,#0X81
XOR A,YW_1
B0BTS0 FZ
JMP K_POWER ;;開關鍵
;; ---- ---- ---- ---- ---- ---- ----
BTS1 ON_OFF ;;若開關鍵未開
JMP START ;;禁止其他操作
NOP
;; ---- ---- ---- ---- ---- ---- ----
1
回復