📄 volumecontrol2501b.asm
字号:
JMP L_AchieveMin
INCMS R_VolumeGrade
B0MOV A,R_VolumeGrade
ADD A,#T_VolumeTable$L
B0MOV Z,A
B0MOV Y,#T_VolumeTable$M
B0BTS0 FC
INCMS Y
MOVC
B0MOV R_Volume,A
B0MOV R_VolumeBak,A ;R_VolumeBak音量备份
CALL F_M62429SlcL ;音量设定值输入M62429
RET
L_AchieveMin:
B0BCLR B_GreenLedFlash
RET
;-------------------------------------------------------------------------------
; 音量+
;
;Function: 控制M62429的音量+
;Input : B_VolumeUpEn(音量加使能位)
;Used : R_VolumeGrade,R_Volume,R_VolumeBak
;Output : B_GreenLedFlash
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_VolumeUp:
B0BTS0 B_MuteState
RET
B0BTS1 B_VolumeAddEn
RET
B0BCLR B_VolumeAddEn
B0MOV A,R_VolumeGrade ;先判断是否达到最大音量
B0BTS0 FZ
JMP L_AchieveMax
DECMS R_VolumeGrade
NOP
B0MOV A,R_VolumeGrade
ADD A,#T_VolumeTable$L
B0MOV Z,A
B0MOV Y,#T_VolumeTable$M
B0BTS0 FC
INCMS Y
MOVC
B0MOV R_Volume,A
B0MOV R_VolumeBak,A ;R_VolumeBak音量备份
CALL F_M62429SlcL ;音量设定值输入M62429
RET
L_AchieveMax:
B0BCLR B_GreenLedFlash
RET
;-------------------------------------------------------------------------------
; 开关机
;
;Function: 控制开关机
;Input : B_VolumeONOFFEn(申请待机或者开机动作的标志位)
;Used : B_MuteState
;Output : /
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_VolumeOnOff:
B0BTS1 B_VolumeONOFFEn
RET
B0BCLR B_VolumeONOFFEn
B0BTS0 B_MuteState
JMP L_VolumeOn
;关机 静音
L_VolumeOff:
B0BSET B_MuteState ;B_MuteState=1 为待机状态 P_MUTE =1
MOV A,#D_VolumeMin
MOV R_Volume,A
CALL F_M62429SlcL
B0BSET P_MUTE
RET
;开机 打开声音
L_VolumeOn:
B0BCLR B_MuteState ;B_MuteState=0 为开机状态 P_MUTE =0
MOV A,R_VolumeBak
MOV R_Volume,A
CALL F_M62429SlcL
B0BCLR P_MUTE
RET
;-------------------------------------------------------------------------------
; 灯的控制
;
;Function: 控制灯的亮灭
;Input : B_MuteState(待机或者开机标志位) ,B_GreenLedFlash(绿灯闪亮标志位)
;Used : R_Timer50ms,B_GreenLedOn,B_Timer1msAFlag(1ms标志位)
;Output : /
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_LedControl:
B0BTS0 B_MuteState
JMP L_RedOnGreenOff
B0BTS1 B_GreenLedFlash
JMP L_RedOffGreenOn
JMP L_GreenLedFlash
;--------------------------------绿灯闪亮------------------------------------
L_GreenLedFlash:
B0BTS1 B_Timer1msAFlag
RET
B0BCLR B_Timer1msAFlag
DECMS R_Timer50ms
RET
MOV A,#100
MOV R_Timer50ms,A
B0BTS1 B_GreenLedOn
JMP L_GreenLedOn
;绿灯关
L_GreenLedOff:
B0BCLR B_GreenLedOn
B0BSET P_LEDGREEN
B0BCLR P_LEDRED
RET
;绿灯开
L_GreenLedOn:
B0BSET B_GreenLedOn
B0BCLR P_LEDGREEN
B0BCLR P_LEDRED
RET
;--------------------------------灯的开关机显示------------------------------------
;关机 红灯亮绿灯灭
L_RedOnGreenOff:
B0BSET P_LEDRED
B0BCLR P_LEDGREEN
RET
;开机 红灯灭绿灯亮
L_RedOffGreenOn:
B0BSET P_LEDGREEN ;绿灯亮
B0BTS0 P_AudioCheck ;高电平 没有音频信号 / 低电平 有音频信号
JMP @F
B0BCLR P_LEDRED
RET
@@:
B0BSET P_LEDRED
RET
;-------------------------------------------------------------------------------
; IR尾码监控
;Function: 监控IR整个指令周期,用于计数尾码
;Input : B_GreenLedFlash ,B_NewEndCode(新的尾码)
;Used : R_Timer108ms, B_Timer1msBFlag(1ms标志位) ,R_EndCodeCnt
;Output : /
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_IRcodeCycleCnt:
;是否有申请监控
B0BTS1 B_GreenLedFlash
RET
;是否到1ms计时
B0BTS1 B_Timer1msBFlag
RET
B0BCLR B_Timer1msBFlag
INCMS R_Timer108ms
;尾码计数,第一次音量变化的尾码计数为5,后面的为3
B0BTS1 B_NewEndCode
JMP L_NoNewEndCode
B0BCLR B_NewEndCode
CLR R_Timer108ms
DECMS R_EndCodeCnt
RET
MOV A,#3
MOV R_EndCodeCnt,A
;判断最后一次的IR命令
B0BTS0 B_EndCodeVolumeAdd
JMP L_VolumeAddAgain
B0BTS0 B_EndCodeVolumeSub
JMP L_VolumeSubAgain
JMP L_IRCycleErr
;再次音量-
L_VolumeSubAgain:
B0BSET B_VolumeSubEn
B0BSET B_GreenLedFlash
RET
;再次音量+
L_VolumeAddAgain:
B0BSET B_VolumeAddEn
B0BSET B_GreenLedFlash
RET
;一直没有新的尾码标志,超过最长的允许时间,则报错,停止灯的闪烁
L_NoNewEndCode:
MOV A,R_Timer108ms
SUB A,#D_IRCycleMax
B0BTS0 FC
JMP L_IRCycleErr
RET
L_IRCycleErr:
CLR R_Timer108ms
B0BCLR B_NewEndCode
B0BCLR B_GreenLedFlash
RET
;-------------------------------------------------------------------------------
; 工作时间控制
;Function: 没有音频信号工作5分钟后关机
;Input : B_MuteState(开机状态1为关机0为开机)
;Used : B_Timer100msAFlag(100ms标志位)
;Output : B_MuteState
;Comment : /
;Nesting : 1
;-------------------------------------------------------------------------------
F_WorkTimeContrl:
B0BTS0 B_MuteState
RET
B0BTS1 B_Timer100msAFlag
RET
B0BCLR B_Timer100msAFlag
;0.1s 检查一次
B0BTS1 P_AudioCheck ;高电平 没有音频信号 / 低电平 有音频信号
JMP L_HaveAudio
;没有音频信号
DECMS R_15s
RET
MOV A,#150 ;100ms*150=15s
B0MOV R_15s,A
DECMS R_10m
RET
MOV A,#40 ;1s*120=2m
B0MOV R_10m,A
B0BSET B_VolumeONOFFEn ;停止工作
RET
;有音频信号
L_HaveAudio:
MOV A,#150 ;100ms*150=15s
B0MOV R_15s,A
MOV A,#40 ;15s*40=10m
B0MOV R_10m,A
RET
;-----------------------------------
; M62429
;Function: 对M62429串行输入
;Input : R_Volume
;Used : R_Count8
;Output : /
;Comment : /
;Nesting : 1
;-----------------------------------
;D0位
;声道选择 左声道 或者 右声道
;声道选择 左
F_M62429SlcL:
B0BCLR FGIE ;Disable global interrupt
B0BSET P_M62429_DA ;D0=1 选择左声道
CALL F_Delay
B0BSET P_M62429_CK ;CK上升沿串入数据
CALL F_Delay
B0BCLR P_M62429_DA
CALL F_Delay
B0BCLR P_M62429_CK
JMP F_M62429SlcTwo
;声道选择 右
F_M62429SlcR:
B0BCLR FGIE ;Disable global interrupt
B0BCLR P_M62429_DA
CALL F_Delay
B0BCLR P_M62429_CK
CALL F_Delay
B0BCLR P_M62429_DA ;D0=0 选择右声道
CALL F_Delay
B0BSET P_M62429_CK ;CK上升沿串入数据
CALL F_Delay
B0BCLR P_M62429_DA
CALL F_Delay
B0BCLR P_M62429_CK
JMP F_M62429SlcTwo
;D1位
;通道选择 单通道 或者 双声道
;单通道
;F_M62429SlcOne:
;CALL F_Delay
;B0BSET P_M62429_DA ;选择单通道 D1=1
;CALL F_Delay
;B0BSET P_M62429_CK ;CK上升沿串入数据
;CALL F_Delay
;B0BCLR P_M62429_DA
;CALL F_Delay
;B0BCLR P_M62429_CK
;JMP F_M62429Volume
F_M62429SlcTwo:
CALL F_Delay
B0BCLR P_M62429_DA ;选择单通道 D1=0
CALL F_Delay
B0BSET P_M62429_CK ;CK上升沿串入数据
CALL F_Delay
B0BCLR P_M62429_DA
CALL F_Delay
B0BCLR P_M62429_CK
JMP F_M62429Volume
;D2--D9位
;音量位D2-D8 和第一个结束位D9
F_M62429Volume:
MOV A,#8
MOV R_Count8,A
L_M62429VolumeLoop:
RLCM R_Volume ;串入音量数据
CALL F_Delay
B0BTS0 FC
B0BSET P_M62429_DA
CALL F_Delay
B0BSET P_M62429_CK
CALL F_Delay
B0BCLR P_M62429_DA
CALL F_Delay
B0BCLR P_M62429_CK
CALL F_Delay
DECMS R_Count8
JMP L_M62429VolumeLoop
;D10位
;第二个结束位
B0BSET P_M62429_DA ;第二个结束位 D10=1
CALL F_Delay
B0BSET P_M62429_CK ;CK上升沿串入数据
CALL F_Delay
B0BSET P_M62429_DA ;结束信号
CALL F_Delay
B0BCLR P_M62429_CK
B0BSET FGIE ;Disable global interrupt
RET
;-------------------------------------------------------------------------------
; Isr (Interrupt Service Routine)
; Arguments :
; Returns :
; Reg Change:
;-------------------------------------------------------------------------------
Isr:
;-----------------------------------
; Save ACC
;-----------------------------------
B0XCH A,AccBuf ;B0XCH instruction do not change C,Z flag
B0MOV A,PFLAG
B0MOV PflagBuf,A
;-----------------------------------
; Interrupt service routine
;-----------------------------------
INTTC0CHK: ; Check TC0 interrupt request
B0BTS1 FTC0IEN ; Check TC0IEN
JMP INT_EXIT ; Jump to exit of IRQ
B0BTS0 FTC0IRQ ; Check TC0IRQ
JMP INTTC0 ; Jump to TC0 interrupt service routine
;-----------------------------------
; Exit interrupt service routine
;-----------------------------------
INT_EXIT:
B0MOV A, PflagBuf
B0MOV PFLAG, A ;Restore the PFlag
B0XCH A,AccBuf ;Restore the Reg. A
;B0XCH instruction do not change C,Z flag
RETI ;Exit the interrupt routine
;-------------------------------------------------------------------------------
; TC0 interrupt service routine 200us
;-------------------------------------------------------------------------------
INTTC0:
B0BCLR FTC0IRQ
B0BSET B_Timer200usFlag
;定时1ms
DECMS R_1ms
JMP INT_EXIT
MOV A,#5 ;1ms
B0MOV R_1ms,A
B0BSET B_Timer1msAFlag
B0BSET B_Timer1msBFlag
;定时100ms
DECMS R_100ms
JMP INT_EXIT
MOV A,#100 ;100ms
B0MOV R_100ms,A
B0BSET B_Timer100msAFlag
JMP INT_EXIT
;-------------------------------------------------------------------------------
; ClrRAM
; Use index @YZ to clear RAM (00h~2Fh)
;-------------------------------------------------------------------------------
F_ClrRAM:
CLR Y
MOV A, #0x2f
B0MOV Z, A ;Set @YZ address from 2fh
L_ClrRAM10:
CLR @YZ ;Clear @YZ content
DECMS Z ;z = z - 1 , skip next if z=0
JMP L_ClrRAM10
CLR @YZ ;Clear address $00
RET
;-------------------------------------------------------------------------------
F_Delay:
NOP
NOP
NOP
NOP
RET
T_VolumeTable:
;DW 二进制列 R_VolumeGrade 16进制
;DW 00000000B ;填空 00H 填空
DW 10101111B ;0 0AFH
DW 10101101B ;1 0ADH
DW 00101111B ;2 02FH
DW 00101101B ;3 02DH
DW 11001111B ;4 0CFH
DW 11001101B ;5 0CDH
DW 01001111B ;6 04FH
DW 01001101B ;7 04DH
DW 10001111B ;8 08FH
DW 10001101B ;9 08DH
DW 00001111B ;10 00FH
DW 00001101B ;11 00DH
DW 11110111B ;12 0F7H
DW 11110101B ;13 0F5H
DW 01110111B ;14 077H
DW 01110101B ;15 075H
DW 10110111B ;16 0B7H
DW 10110101B ;17 0B5H
DW 00110111B ;18 037H
DW 00110101B ;19 035H
DW 11010111B ;20 0D7H
DW 11010101B ;21 0D5H
DW 01010111B ;22 057H
DW 01010101B ;23 055H
DW 10010111B ;24 087H
DW 10010101B ;25 085H
DW 00010111B ;26 017H
DW 00010101B ;27 015H
DW 11100111B ;28 0E7H
DW 11100101B ;29 0E5H
DW 01100111B ;30 067H
DW 01100101B ;31 065H
DW 10100111B ;32 0A7H
DW 10100101B ;33 0A5H
DW 00100111B ;34 027H
DW 00100101B ;35 025H
DW 11000111B ;36 0C7H
DW 11000101B ;37 0C5H
DW 01000111B ;38 047H
DW 01000101B ;39 045H
DW 10000111B ;40 087H
DW 10000101B ;41 085H
;-------------------------------------------------------------------------------
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -