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

📄 volumecontrol2501b.asm

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