⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 volumecontrol2501b.asm

📁 音响红外控制电子音量
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		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 + -