|
本帖最后由 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
|
|