|
本帖最后由 yangxihai128 于 2019-10-17 16:05 編輯
;===========================================================
;硬盤盒紅外遙控源程序(HT48R05A-1方案)
;===========================================================
;用戶識別碼為:00H 0FFH
;POWER鍵8位數據碼: 14H 用于播放硬盤盒
;COPY鍵8位數據碼: 41H 用于接通USB口
;以下所有電平的描述都是針對接收端而言的(發射端則是反相的)
;晶振為4MHz
;===========================================================
;掩膜選項
;WDT:Enable
;CLRWDT:One clear instruction
;WDT clock source:T1(System clock/4)
;Wake-up PA0-7:Non wake-up
;Pull-high PA-PC:Non pull-high
;Output type:PB0-PB1:CMOS
;LVR:Enable
;OSC:Crystal
;==========================================================
INCLUDE HT48R05A-1.INC
DATA.SECTION 'DATA'
;========================定義變量=================================================
ADD1 DB 60H ;ADD1為前8位用戶識別碼,接收到的臨時數據
ADD2 DB 61H ;ADD2為后8位用戶識別碼,接收到的臨時數據
DATA1 DB 62H ;8位數據碼,接收到的臨時數據
DATA2 DB 63H ;8位數據的反碼,接收到的臨時數據
USER1 DB ? ;用戶識別碼高8位,原始數據
USER2 DB ? ;用戶識別碼低8位,原始數據
POWER_DATA DB ? ;POWER鍵數據碼,原始數據
COPY_DATA DB ? ;COPY鍵數據碼,原始數據
COU122 DB ? ;靜音廷時用
COU8 DB ? ;電源接通廷時用,8個周期約為64mS
BUF1 DB ? ;中斷數據臨時存儲
BUF2 DB ? ;中斷數據臨時存儲
R2 DB ?
R3 DB ?
R6 DB ?
R7 DB ?
USB_VCC EQU PA.0 ;電腦電源檢測端,"1"表示電腦正在工作,"0"表示電腦關機
LED EQU PA.4 ;低電平時亮,表示硬盤盒處于工作狀態,滅則為關機狀態
IRIN EQU PA.6 ;紅外信號檢測端
MCUC EQU PA.1 ;音視頻信號切換端,高電平時切換到硬盤盒,低電平時切換到電腦
MCUSP EQU PA.2 ;靜音控制,高電平時靜音,低電平時恢復正常
POWER_HDD EQU PB.0 ;電源切換,高電平時接通HDD電源,低電平斷開
POWER_USB EQU PA.3 ;電源切換,高電平時接通USB電源,低電平斷開
POWER DBIT ;硬盤盒播放狀態位,“1”表示硬盤盒正處于播放狀態,“0”表示為關機
COPY DBIT ;USB狀態位,“1”表示正處于讀寫硬盤盒狀態,“0”表示關機
MUTE DBIT ;靜音狀態位,“1”表示靜音,“0”則無
COU DBIT ;計數開關,“1”打開,“0”關閉
CODE.SECTION 'CODE'
;===========================================================
ORG 00H
JMP START
NOP
NOP
JMP 00H ;陷阱
ORG 08H
JMP TIMER ;定時器中斷入口
NOP
NOP
JMP 00H ;陷阱
;=初始化====================================================
;---------------中斷初始化----------------------------------
START:
MOV A,10000111B
MOV TMRC,A ;將定時器均設為計數定時模式,預分頻數為256,
CLR TMR ;裝初值,定時長=256*64*0.25uS=16384uS
SET INTC.0 ;開放中斷
SET INTC.2
;MOV A,110B
;MOV WDTS,A 將看門狗的分頻比設為1:64,在電壓為5V時,溢出周期是65uS*256*64=1S
;-----------------------------------------------------------
;---------------變量初始化----------------------------------
CLR ADD1 ;將臨時接收數據區清零
CLR ADD2 ;將臨時接收數據區清零
CLR DATA1 ;將臨時接收數據區清零
CLR DATA2 ;將臨時接收數據區清零
CLR USER1 ;用戶識別碼高8位置初值
SET USER2 ;用戶識別碼低8位置初值
MOV A,14H
MOV POWER_DATA,A ;開關機鍵數據碼置初值
MOV A,41H
MOV COPY_DATA,A ;切換鍵數據碼置初值
SET LED ;關LED,表示為關機狀態
SET IRIN ;設置IRIN端為輸入狀態
CLR MCUC ;切換在電腦信號接通狀態
CLR MCUSP ;關靜音
CLR MUTE ;無靜音標志
CLR COU ;關閉計數開關
CLR POWER_HDD ;關HDD電源
CLR POWER_USB ;關USB電源
CLR POWER ;設為關機狀態
CLR COPY ;設為電腦接通狀態
MOV A,255
MOV COU122,A
MOV A,8
MOV COU8,A
CLR PAC ;將PA.6設為輸入,其它端口設為輸出
SET PAC.6
CLR PBC
SET PAC.0
;-----------------------------------------------------------
;===========================================================
MAIN:
SZ IRIN ;遙控掃描
JMP MAIN ;在正常無遙控信號時,紅外接收頭輸出是高電平,程序一直在循環。
;===========================================================
;解碼程序
;以下對遙控信號的9000 微秒的初始低電平信號的識別
IR:
MOV A,10
MOV R6,A
IR_SB:
CALL DELAY840 ;調用0.84ms延時子程序
;JB IRIN,IR_ERROR
SZ IRIN
JMP IR_ERROR
SDZ R6 ;重復10 次,目的是檢測在8820 微秒內如果出現高電平(誤碼)就轉到錯誤處理程序
JMP IR_SB
;(51)JNB IRIN, $
IR0: SNZ IRIN ;一直等到9 毫秒低電平引導脈沖結束
JMP IR0
CALL DELAY2400 ;2.25ms+0.25ms/2=2.375ms(約為2.4ms),結束碼為2.25ms的高電平加0.25ms的低電平
;(51)JNB IRIN,IR8
SNZ IRIN
JMP IR8 ;如這里為低電平,則接收信號為連發碼
CALL DELAY2400 ;延時4.8ms(前面還有2400us)避開4.5ms的結果碼
;---------------------------------- 以下是32數據碼的解碼 ,即0和1的識別
MOV A,60H
MOV MP,A ;設定(ADD1)為起始RAM 區,用于存放接收到的32位數據碼
MOV A,4
MOV R2,A ;32位數據碼所需RAM空間的長度
IR2:
MOV A,8
MOV R3,A ;即一個字節的位數
;(51)JNB IRIN,$
IR4:SNZ IRIN
JMP IR4 ;避開0.56ms低電平,等待高電平信號(以此判斷0與1)
CALL DELAY840 ;高電平開始后用0.84ms的時間尺去判斷信號此時的高低電平狀態
;MOV C,IRIN
;JNC IR6
SZ IRIN
JMP IR41
CLR C
JMP IR42
IR41:SET C
IR42:SZ IRIN ;如果IRIN 為0 就跳轉到IR6
CALL DELAY1000 ;如果為1,則延時避開bit“1”的高電平
IR6:RRC IAR ;將C中的值0 或1 移入MP所指存儲器的最低位
;DJNZ R3,IR4
SDZ R3 ;接收地址碼的高8位
JMP IR4
INC MP ;指針加1,換下一個RAM
;DJNZ R2,IR2
SDZ R2 ;接收完16 位地址碼和8 位數據碼和8 位數據,存放在ADD1開始的4個連續的RAM 中,解碼成功
JMP IR2
JMP IR_DONE
NOP
NOP
JMP 00H ;陷阱
IR8: ;這里為重復碼執行處
;按住遙控按鍵時,每過108ms 就到這里來
JMP MAIN
NOP
NOP
JMP 00H ;陷阱
IR_ERROR: ;錯誤處理
JMP MAIN ;退出解碼子程序
NOP
NOP
JMP 00H ;陷阱
;===========================================================
IR_DONE:
;這里還要判斷系統碼或用戶碼,用于識別不同的遙控器
MOV A,ADD1
SUB A,USER1
SZ ACC
JMP IR_ERROR ;用戶碼1不對則退出
MOV A,ADD2
SUB A,USER2
SZ ACC
JMP IR_ERROR ;用戶碼2不對則退出
;判斷兩個數據碼是否相反
CPLA DATA1
SUB A,DATA2
SZ ACC
JMP IR_ERROR ;兩個數據碼不相反則退出
;遙控執行部份
SET TMRC.4 ;起動定時器,供靜音與電源轉換時定時用
MOV A,DATA1
SUB A,POWER_DATA
SZ ACC
JMP ROMT1
SZ POWER ;POWER鍵有按下則將POWER標志取反
JMP ROMT00 ;
SET POWER ;
JMP ROMT01 ;
ROMT00:CLR POWER ;
ROMT01:
SNZ POWER
JMP ROMT71 ;關機則跳到ROMT8
;JNB POWER,ROMT8 ;關機則跳到ROMT8
CLR LED ;點亮LED
;關USB狀態
CLR COPY
CLR POWER_USB
;開播放器
SET MCUSP ;靜音
MOV A,255 ;置靜音初值,可廷時4S左右
MOV COU122,A
SET MUTE ;靜音狀態位置1
MOV A,8
MOV COU8,A
SET COU ;打開計數開關
CLR POWER_HDD
CLR POWER_USB
JMP ROMT12 ;然后跳到ROMT12
NOP
NOP
JMP 00H ;陷阱
ROMT1:
;JB USB_VCC,ROMT4 ;如果電腦處于開機狀態下則響應COPY鍵,否則不響應
SZ USB_VCC
JMP ROMT4
;JB COPY,ROMT8 ;COPY為1則表示關電腦前USB是連通的,所以需要先關硬盤盒(也就關了USB)
SZ COPY
JMP ROMT8
JMP ROMT12
NOP
NOP
JMP 00H ;陷阱
ROMT4:
MOV A,DATA1
;CJNE A,COPY_DATA,ROMT12
SUB A,COPY_DATA
SZ ACC
JMP ROMT12
SZ COPY ;COPY鍵有按下,則將COPY標志取反
JMP ROMT41 ;
SET COPY ;
JMP ROMT43 ;
ROMT41:CLR COPY ;
ROMT43:
;JNB COPY,ROMT8 ;關機則跳到ROMT8
SNZ COPY
JMP ROMT8
CLR LED
;關播放器
CLR POWER_HDD
;開USB
SNZ POWER
JMP ROMT7
CLR POWER ;清除POWER,表示已經轉換到USB狀態
SET MCUSP ;靜音
MOV A,60 ;置靜音初值,可廷時1S
MOV COU122,A
SET MUTE ;靜音狀態位置1
ROMT7:MOV A,8
MOV COU8,A
SET COU ;打開計數開關
CLR POWER_HDD
CLR POWER_USB
JMP ROMT12 ;然后跳到ROMT12
NOP
NOP
JMP 00H ;陷阱
ROMT71:SET MCUSP ;靜音
MOV A,60 ;置靜音初值,可廷時1S
MOV COU122,A
SET MUTE ;靜音狀態位置1
ROMT8:SET LED ;關LED
CLR MCUC ;切換在電腦信號接通狀態
CLR POWER_HDD ;關HDD電源
CLR POWER_USB ;關USB電源
CLR POWER ;設為關機狀態
CLR COPY ;設為關機狀態
ROMT12:
CLR ADD1 ;將臨時接收數據區清零
CLR ADD2 ;將臨時接收數據區清零
CLR DATA1 ;將臨時接收數據區清零
CLR DATA2 ;將臨時接收數據區清零
JMP MAIN
NOP
NOP
JMP 00H ;陷阱
;==============定時中斷執行程序=============================
TIMER PROC
MOV BUF1,A ;
MOV A,STATUS ;
MOV BUF2,A ;暫存寄存器數據
SNZ MUTE ;廷時后關靜音
JMP TIMER2
DEC COU122
SZ COU122
JMP TIMER2
CLR TMRC.4 ;關定時器
CLR MCUSP
CLR MUTE
TIMER2:SNZ COU ;廷時8*8.192mS后切換電源與音視頻
JMP TIMER_END
DEC COU8
SZ COU8
JMP TIMER_END
MOV A,8
MOV COU8,A
CLR COU
SNZ POWER
JMP TIMER4
CLR POWER_USB
SET POWER_HDD
SET MCUC
JMP TIMER_END
TIMER4:
SNZ COPY
JMP TIMER_END
CLR POWER_HDD
SET POWER_USB
CLR MCUC
TIMER_END:
MOV A,BUF2 ;返回寄存器數據
MOV STATUS,A ;
MOV A,BUF1 ;
RETI
TIMER ENDP
;===========================================================
NOP
NOP
JMP 00H ;陷阱
;=============延時子程序====================================
;延時0.84ms
DELAY840:
MOV A,167
MOV R7,A
NOP
DELAY840_A:
NOP
NOP
SDZ R7
JMP DELAY840_A
RET
;-----------------------------------------------------------
NOP
NOP
JMP 00H ;陷阱
;延時1ms
DELAY1000:
MOV A,199
MOV R7,A
NOP
DELAY1000_A:
NOP
NOP
SDZ R7
JMP DELAY1000_A
RET
;-----------------------------------------------------------
NOP
NOP
JMP 00H ;陷阱
;延時2.4ms
DELAY2400:
MOV A,240
MOV R7,A
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SDZ R7
JMP DELAY2400_A
RET
;-----------------------------------------------------------
NOP
NOP
JMP 00H ;陷阱
;===========================================================
END
|
|