📄 volumecontrol2501b.asm
字号:
;*******************************************************************************
; * Filename : 音量控制 *
; * Function : 红外接受,音量控制,待机状态 *
; * Product : SN8P2501BS *
; * Crystal :Fosc12MHz Fcpu = Fosc/8=1.5MHz *
; * Data :2008-8-21 *
; * version number :V1.0
;EPROM Check Sum is 3C3F.
;Security Check Sum is 9B20 *
;*******************************************************************************
CHIP SN8P2501B ; Select the CHIP
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Watch_Dog Disable
.Code_Option Reset_Pin Reset
.Code_Option High_Clk 12M_X'tal ; Crystal/Resonator: 10Mhz~16Mhz
.Code_Option Fcpu #3 ; Fcpu = Fosc/8
.Code_Option Security Enable
.Code_Option LVD LVD_H ; 2.4V Reset Enable LVD36 bit of PFLAG for 3.6V Low Voltage Indicator
//}}SONIX_CODE_OPTION
;-------------------------------------------------------------------------------
; Include Files
;-------------------------------------------------------------------------------
.nolist ; do not list the macro file
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
.list ; Enable the listing function
;-------------------------------------------------------------------------------
; I/O Definition
;-------------------------------------------------------------------------------
P_IR EQU P0.0 ;红外输入脚
P_LEDRED EQU P2.0 ;P_LEDRED=1 红灯亮 待机模式
P_LEDGREEN EQU P2.1 ;P_LEDGREEN=1 绿灯亮 工作模式 闪亮为接受命令模式
P_MUTE EQU P2.2 ;P_MUTE=1待机模式 静音
P_M62429_CK EQU P2.3 ;控制M62429的SCL信号
P_M62429_DA EQU P2.4 ;控制M62429的SDA信号
P_AudioCheck EQU P2.5 ;音频检测
;-------------------------------------------------------------------------------
; Constants Definition
;-------------------------------------------------------------------------------
;IR Constants
D_IRBitCnt EQU 32 ;4bytes
D_HeaderLowMin EQU 30 ;(9ms-3ms)/200us=30
D_HeaderLowMax EQU 60 ;(9ms+3ms)/200us=60
D_1stHeaderHiMin EQU 17 ;(4.5ms-1.1ms)/200us=17
D_1stHeaderHiMax EQU 30 ;(4.5ms+1.5ms)/200us=30
D_2ndHeaderHiMin EQU 6 ;(2.25ms-1ms)/200us=6
D_2ndHeaderHiMax EQU 16 ;(2.25ms+1ms)/200us=16
D_Data0LowMin EQU 1 ;(565us-200us)
D_Data0LowMax EQU 5 ;(565us+500us)
D_Data0HiMin EQU 1 ;(565us-200us)
D_Data0HiMax EQU 5 ;(565us+300us)
D_Data1LowMin EQU 1 ;(565us-200us)
D_Data1LowMax EQU 5 ;(565us+500us)
D_Data1HiMin EQU 6 ;(1690us-500us)
D_Data1HiMax EQU 12 ;(1690us+500us)
D_IRCycleMin EQU 78 ;108ms-30ms
D_IRCycleMax EQU 138 ;108ms+30ms
D_CmdVolumeUp EQU 12H ;音量加
D_CmdVolumeDown EQU 13H ;音量减
D_CmdVolumeOnOff EQU 40H ;开关机
D_UserCode EQU 00H ;用户码
D_VolumeMin EQU 081H
D_VolumeDefaul EQU 075H
D_GradeDefault EQU 15
;
;-------------------------------------------------------------------------------
; Variables Definition
;-------------------------------------------------------------------------------
.DATA
org 0h ;Data section start from RAM address 0
Wk00 DS 1 ;Temporary buffer for main loop
Iwk00 DS 1 ;Temporary buffer for ISR
AccBuf DS 1 ;Accumulater buffer
PflagBuf DS 1 ;PFLAG buffer
t1 DS 1
;IR程序数据
R_IRData0 DS 1 ;地址高8位
R_IRData1 DS 1 ;地址地8位
R_IRData2 DS 1 ;数据码
R_IRData3 DS 1 ;数据反码
R_LowCnt DS 1 ;低电平期间计数
R_HiCnt DS 1 ;高电平期间计数
R_IRBitCnt DS 1
R_EndCodeCnt DS 1 ;尾码计数
R_Volume DS 1
R_VolumeBak DS 1
R_VolumeGrade DS 1
R_1ms DS 1
R_Count8 DS 1
R_Timer50ms DS 1
R_Timer108ms DS 1
R_100ms DS 1
R_15s DS 1
R_10m DS 1
;位变量
R_TimerFlag DS 1
R_IRState DS 1
R_VolumeState DS 1
R_TempFlag DS 1
;-------------------------------------------------------------------------------
; Bit Variables Definition
;-------------------------------------------------------------------------------
Wk00B0 EQU Iwk00.0 ;Bit 0 of Wk00
Iwk00B1 EQU Iwk00.1 ;Bit 1 of Iwk00
b_test EQU R_IRState.4
B_NewEndCode EQU R_IRState.0 ;新的尾码
B_ValidCode EQU R_IRState.1 ;接受到了有效的数据码
B_IRHigh EQU R_IRState.2 ;高电平期间标志位
B_IRHeaderOk EQU R_IRState.3 ;头码完成
;Timer
B_Timer200usFlag EQU R_TimerFlag.0
B_Timer1msAFlag EQU R_TimerFlag.1
B_Timer1msBFlag EQU R_TimerFlag.2
B_Timer100msAFlag EQU R_TimerFlag.3
;IR最后接受到的指令
B_EndCodeVolumeAdd EQU R_VolumeState.1
B_EndCodeVolumeSub EQU R_VolumeState.2
;申请执行的动作
B_VolumeONOFFEn EQU R_VolumeState.3
B_VolumeAddEn EQU R_VolumeState.4
B_VolumeSubEn EQU R_VolumeState.5
;杂项
B_FirstEndCode EQU R_TempFlag.0
B_GreenLedFlash EQU R_TempFlag.1
B_MuteState EQU R_TempFlag.4
B_GreenLedOn EQU R_TempFlag.5
;-------------------------------------------------------------------------------
; Code section
;-------------------------------------------------------------------------------
.CODE
ORG 0 ;Code section start
JMP Reset ;Reset vector
;Address 4 to 7 are reserved
ORG 8
JMP Isr ;Interrupt vector
ORG 10h
;-------------------------------------------------------------------------------
; Program reset section
;-------------------------------------------------------------------------------
Reset:
MOV A,#07Fh ;Initial stack pointer and
B0MOV STKP,A ;disable global interrupt
CLR PFLAG ;pflag = x,x,x,x,x,c,dc,z
MOV A,#00h ;Initial system mode
B0MOV OSCM,A
;I0口输入输出设定
MOV A,#0
MOV P0M,A ;P0.0为输入口
MOV A,#0
MOV P1M,A ;P1口为输入口,不使用
MOV A,#00011111B
MOV P2M,A ;P2.0-P2.4为输出口,P2.5为输入口
MOV A,#0
MOV P5M,A ;P5.4为输入口,不使用
;I0口上拉电阻设定
MOV A,#0FFH
MOV P0UR,A ;P0.0有上拉电阻
MOV A,#0FFH
MOV P1UR,A ;P1口有上拉电阻,不使用
MOV A,#00100000B
MOV P2UR,A ;P2.0-P2.4没有上拉,P2.5有上拉
MOV A,#0FFH
MOV P5UR,A ;P5口有上拉电阻,不使用
;输出口设定
B0BSET P_LEDRED ;红灯开
B0BCLR P_LEDGREEN ;绿灯关
B0BSET P_MUTE ;静音
B0BCLR P_M62429_CK ;锁存
B0BCLR P_M62429_DA ;锁存
;T0
CLR T0M
CLR T0C
;TC0
MOV A,#01110100B ;禁止 2分频 内部时钟源 自动从装 P5.4输入输出口 禁止PWM
MOV TC0M,A
MOV A,#106
MOV TC0C,A
MOV TC0R,A
MOV A, #0x5A
B0MOV WDTR, A ;Clear watchdog timer
CALL F_ClrRAM ;Clear RAM
;开启总中断和TC0中断,并启动
B0BSET FGIE ;Enable global interrupt
MOV A,#00100000B
MOV INTEN,A
B0BSET FTC0ENB
;音量初始化
MOV A,#D_GradeDefault
MOV R_VolumeGrade,A
MOV A,#D_VolumeMin
MOV R_Volume,A
MOV A,#D_VolumeDefaul
B0MOV R_VolumeBak,A ;R_VolumeBak音量备份
CALL F_M62429SlcL ;音量设定值输入M62429
B0BSET B_MuteState ;B_MuteState=1 为待机状态 P_MUTE =1
;时间
MOV A,#100
MOV R_100ms,A
MOV A,#150 ;100ms*150=15s
B0MOV R_15s,A
MOV A,#40 ;15s*40=10m
B0MOV R_10m,A
;###############################################################################
; Main routine
;###############################################################################
Main:
MOV A, #0x5A
B0MOV WDTR, A ;Clear watchdog timer
CALL F_IRPro ;红外接受
CALL F_IRDataDecode ;解码
CALL F_VolumeOnOff ;控制开关
CALL F_VolumeUp ;控制音量增加
CALL F_VolumeDown ;控制音量减小
CALL F_LedControl ;灯的控制
CALL F_IRcodeCycleCnt ;尾码监控
CALL F_WorkTimeContrl ;工作时间计时
JMP Main
;-------------------------------------------------------------------------------
; 红外接受
;
;Function: 检测红外接受到的每一位的数据,并整理
;Input : 红外接收器
;Used : R_Timer200usFlag(200us定时),B_IRHeaderOk(头码已正确接受)
; R_VolumeState ,B_IRHigh(高电平标志),R_HiCnt,R_LowCnt (高低电平期间计数)
;
;Output : B_ValidCode(接收到了有效的数据码),B_NewEndCode(接受到尾码)
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
;Input :/
;Output :R_LowCnt(低电平计数),R_HiCnt(高电平计数)
;Used :R_Timer200usFlag,B_IRHigh(高低平标志,用于找出第一个低电平,清除方式位,识别到第一个低电平就清除)
F_IRPro:
B0BTS1 B_Timer200usFlag ;定时200uS时间到否
JMP L_ReceiveIrEnd ;不到 退出
BCLR B_Timer200usFlag ;清除标志位
B0BTS1 P_IR ;IR 输入脚电平判断
JMP L_IRChkFall
L_IRChkRaise: ;
B0BSET B_IRHigh ;设置高电平期间标志位
INCMS R_HiCnt ;高电平计数
JMP L_ReceiveIrEnd
JMP L_IRErr
L_IRChkFall:
B0BTS0 B_IRHigh ;如果B_IRHigh=1,则说明这是低电平期间的第一次低电平
JMP L_IRDecode ;第一个低电平送去查询
INCMS R_LowCnt ;低电平计数
JMP L_ReceiveIrEnd
JMP L_IRErr
L_IRDecode:
B0BCLR B_IRHigh ;清除高电平标志位
B0BTS0 B_IRHeaderOk ;B_IRHeaderOk=0 跳到头码,B_IRDatafinish=1 跳到数据码
JMP L_IRDecodeData1
;---------------------------头码部分------------------------------------
;Input :R_LowCnt,R_HiCnt
;Output :B_IRHeaderOk(头码是否已经接受过),IR的编码位数
;Used :
L_IRDecodeHeader:
MOV A,R_LowCnt ;check Header low(normal 9ms)
SUB A,#D_HeaderLowMin
B0BTS1 FC
JMP L_IRErr ;Header Low level too min
MOV A,R_LowCnt
SUB A,#D_HeaderLowMax+1
B0BTS0 FC
JMP L_IRErr ;Header Low level too max
L_IRDecode1stHeaderHi:
MOV A,R_HiCnt ;check 1st Header high(normal 4.5ms)
SUB A,#D_1stHeaderHiMin
B0BTS1 FC
JMP L_IRDecode2ndHeaderHi ;1st Header High level too min
MOV A,R_HiCnt
SUB A,#D_1stHeaderHiMax+1
B0BTS0 FC
JMP L_IRErr ;Header High level too max
B0BSET B_IRHeaderOk ;头码通过,设置头码完成标志位 B_IRHeaderOk=1
MOV A,#D_IRBitCnt ;4 bytes 32 bits for uPD6121
B0MOV R_IRBitCnt,A
;设置定时器
JMP L_IRNextBit
;---------------------------尾码部分------------------------------------
;Input :R_LowCnt,R_HiCnt
;Output :B_NewEndCode(是否有新的尾码输出)
;Used :B_FirstEndCode(第一个尾码不计数)
L_IRDecode2ndHeaderHi:
MOV A,R_HiCnt ;check 2nd Header high(normal 2.25ms)
SUB A,#D_2ndHeaderHiMin
B0BTS1 FC
JMP L_IRErr ;2nd Header High level too min
MOV A,R_HiCnt
SUB A,#D_2ndHeaderHiMax+1
B0BTS0 FC
JMP L_IRErr ;2nd Header High level too max
B0BSET B_NewEndCode ;有新的尾码
JMP L_IRNextBit
;---------------------------数据位部分------------------------------------
;Input :R_LowCnt,R_HiCnt
;Output :R_IRData0(用户码),R_IRData2(地址码),B_ValidCode(接收到正确的数据码)
;Used :B_FirstEndCode(第一个尾码不计数)
L_IRDecodeData1:
MOV A,R_LowCnt
SUB A,#D_Data1LowMin
B0BTS1 FC
JMP L_IRErr ;Data 1 low level too min
MOV A,R_LowCnt
SUB A,#D_Data1LowMax+1
B0BTS0 FC
JMP L_IRErr ;Data 1 low level too max
MOV A,R_HiCnt
SUB A,#D_Data1HiMin
B0BTS1 FC
JMP L_IRDecodeData0 ;Data 1 high level too min
MOV A,R_HiCnt
SUB A,#D_Data1HiMax+1
B0BTS0 FC
JMP L_IRErr ;Data 1 high level too max
B0BSET FC
JMP L_IRReceiveLoop
L_IRDecodeData0:
MOV A,R_HiCnt
SUB A,#D_Data0HiMin
B0BTS1 FC
JMP L_IRErr ;Data 0 high level too min
MOV A,R_HiCnt
SUB A,#D_Data0HiMax+1
B0BTS0 FC
JMP L_IRErr ;Data 0 high level too max
B0BCLR FC
L_IRReceiveLoop:
RRCM R_IRData3
RRCM R_IRData2
RRCM R_IRData1
RRCM R_IRData0
DECMS R_IRBitCnt
JMP L_IRNextBit
;用户码校验 R_IRData0=0 R_IRData1=0FFH
MOV A,R_IRData0 ;finish receive 2Bytes Custom code & 2Bytes Data Code
B0BTS1 FZ
JMP L_IRErr ;Custom code err
MOV A,#0FFH
CMPRS A,R_IRData1
JMP L_IRErr ;Custom code err
;地址码校验
MOV A,R_IRData2
XOR A,#0ffH
CMPRS A,R_IRData3
JMP L_IRErr ;Data code err
L_IRReceiveOk:
B0BSET B_ValidCode ;IR Receive OK
B0BCLR B_IRHeaderOk
L_IRErr:
BCLR B_IRHigh
B0BCLR B_IRHeaderOk
L_IRNextBit: ;start to receive next bit
CLR R_HiCnt
CLR R_LowCnt
L_ReceiveIrEnd:
RET
;-------------------------------------------------------------------------------
; 处理IR接受到的新数据
;
;Function: 处理IR接受到的新数据
;Input : R_IRData2(地址码),B_ValidCode(接收到正确的数据码)
;Used : /
;Output : R_VolumeState
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_IRDataDecode:
B0BTS1 B_ValidCode
RET
BCLR B_ValidCode
MOV A,R_IRData2
CMPRS A,#D_CmdVolumeOnOff
JMP @F
CLR R_VolumeState
B0BSET B_VolumeONOFFEn ;申请执行开关机动作
RET
@@:
MOV A,R_IRData2
CMPRS A,#D_CmdVolumeUp
JMP @F
CLR R_VolumeState
B0BSET B_EndCodeVolumeAdd ;IR最后接收到的指令标志位
B0BSET B_VolumeAddEn ;申请执行音量加动作
B0BSET B_GreenLedFlash ;绿灯闪烁
MOV A,#5
MOV R_EndCodeCnt,A
RET
@@:
MOV A,R_IRData2
CMPRS A,#D_CmdVolumeDown
JMP @F
CLR R_VolumeState
B0BSET B_EndCodeVolumeSub ;IR最后接收到的指令标志位
B0BSET B_VolumeSubEn ;申请执行音量减动作
B0BSET B_GreenLedFlash ;绿灯闪烁
MOV A,#5
MOV R_EndCodeCnt,A
RET
@@:
CLR R_VolumeState
RET
;-------------------------------------------------------------------------------
; 音量-
;
;Function: 控制M62429的音量-
;Input : B_VolumeUpEn(音量加使能位)
;Used : R_VolumeGrade(音量等级),R_Volume,R_VolumeBak
;Output : B_GreenLedFlash
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_VolumeDown:
B0BTS0 B_MuteState
RET
B0BTS1 B_VolumeSubEn
RET
B0BCLR B_VolumeSubEn
MOV A,#40
SUB A,R_VolumeGrade
B0BTS1 FC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -