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

📄 ir.asm

📁 ELAN IR接收
💻 ASM
字号:
include "HT1621.inc"
include "chip.inc"

public ir_init,ir_rec01
extern delayX5ms, mcu_iic_send

tmp		 	==		0x30
HEAD_LMAX	  	==		0x5d			
HEAD_LMIN	  	==		0x55			
HEAD_HMAX	  	==		0x2f
HEAD_HMIN	  	==		0x20
HEAD_RMIN	  	==		0x10	/*重复码高电位的最小值*/
REAP_LOW_MAX       	==		0x8	/*重复码的结束部分低电位宽度*/
LOG0_MIN	   	==		0x3
LOG0_MAX	   	==		0xa
LOG1_MAX	   	==		0x40
LONG_PRESS_CNT 	   	==		0x90	/*遥控器收到LONG_PRESS_CNT次重复码后产生长按键键值,其中最高位为标志位*/
LONG_STEP	   	==		0x20	/*遥控器长按后原键值+LONG_STEP产生新键值*/
			
		org 370
	
;函数 ir_ini初始化ir接收及发送
ir_init:	PROC
		clr	rec_is		;清除接收成功标志
		clr	ir_flag
		
		mov	a,	@0x7	;TCC选择内部指令时钟
		contw
		
		;set p60外部中断引脚
		ior	ioc6
		or	a,	@0x1;0xdf
		iow	IOC6
		
		mov	a,	@0x40	;set p60 extern interrupt pin
		iow	ioce
		;允许外部中断,屏蔽tcc中断和P6变化中断
		mov	a,	@0x4	
		iow	iocf
			
		;禁止p60内部下拉,设置p60内部上拉
		ior	iocb
		or	a,	@0x10	;禁止p60内部下拉
		iow	iocb
		
		ior	iocd
		and	a,	@0b11111110 	;p60内部上拉
		iow	iocd
		nop
		ret
		ENDP
;--------- tcc interrupt -----------
;外部中断接收ir,下降沿触发中断,定时器记数低电位脉宽
;ir_cnt
ir_rec01:	PROC
		;ret
		inc	randomval
		
		jbs	rf,	0x2
		jmp	end_rec	;非外部(ir)中断,退出


		jbc	rec_is,0x7
		jmp	end_rec	;等待处理前次接收按键,拒绝接收新键

		;bc	COMM_PORT,comm_pin	;12.20
		clr	counter
	rec_head_low:
		call   delayX5ms
		inc	counter
		jbs	ir_port,ir_pin
		jmp	rec_head_low

		;bs	COMM_PORT,comm_pin	;12.20
		mov	a,@HEAD_LMAX
		sub	a,counter
		jbc	status,c	;if @TIME_IR_HEAD<counter skip
		jmp	end_rec	 	;
		mov	a,@HEAD_LMIN
		sub	a,counter
		jbs	status,c
		jmp	end_rec
		
		clr	counter
		
	rec_head_high:	
		call   delayX5ms
		inc	counter
		jbc	ir_port,ir_pin	
		jmp	rec_head_high

		;bc	COMM_PORT,comm_pin	;12.20
		mov	a,@HEAD_HMAX
		sub	a,counter
		jbc	status,c	;if @TIME_IR_HEAD<counter skip
		jmp	end_rec
		mov	a,@HEAD_HMIN
		sub	a,counter
		jbs	status,c
;		jmp	end_rec
		jmp	rep_irkey	/*goto receive repeat key */
		clr	ir_data_high
		clr	ir_data_low
		clr	counter
		jmp	goon_rec
		/*接收重复码*/
	rep_irkey:
		mov	a,@HEAD_RMIN
		sub	a,counter
		jbs	status,c
		jmp	end_rec	/*错误的重复码*/
		clr	counter
		clr	irend_cnt
		
	rep_low:	
		call   delayX5ms
		inc	counter
		jbs	ir_port,ir_pin	
		jmp	rep_low

		;bs	COMM_PORT,comm_pin	;12.20
		mov	a,@REAP_LOW_MAX
		sub	a,counter
		jbc	status,c
		jmp	end_rec	/*err*/
		inc	repkey_cnt
		mov	a,@LONG_PRESS_CNT
		sub	a,repkey_cnt
		jbs	status,c
		jmp	end_rec
			/*产生重复码*/
		mov	a,@LONG_STEP
		add	ir_data_low,a
		clr	irend_cnt
		clr	repkey_cnt
		jmp	real_key
		/**/
	goon_rec:	
		mov	a,@0x8
		mov	count8,a
		mov	a,@0x2
		mov	count2,a
;		clr	0x1f
;		clr	0x1e
		
	wait_low:
		jbs	ir_port,ir_pin
		jmp	wait_low
		;bs	COMM_PORT,comm_pin	;12.20
		clr	counter
	wait_high:	
		call   delayX5ms
		inc	counter
		jbc	ir_port,ir_pin
		jmp	wait_high
		
		;bc	COMM_PORT,comm_pin	;12.20
		mov	a,@LOG0_MIN
		sub	a,counter
		jbs	status,c
		jmp	end_rec
		mov	a,@LOG0_MAX
		sub	a,counter
		jbc	status,c
		jmp	is_log1
		
	is_data:
		rrc	ir_data_high
		jmp	a_log_data
		
	is_log1:		
		mov	a,@LOG1_MAX
		sub	a,counter
		jbc	status,c
		jmp	end_rec
		bs	status,c
		jmp	is_data
		
	a_log_data:
		djz	count8			;if complete a byte then skip
		jmp	wait_low
		;go on receive next byte
		mov	a,@0x08
		mov	count8,a
		djz	count2
		jmp	mov_high

		jbc	ir_flag,0x02	;if(irflag(3)==0) receiveing address else data is received
		jmp	rec_succ
		jmp	check_addr
		
	mov_high:				
		mov	a,ir_data_high
		mov	ir_data_low,a
		jmp	wait_low

		;addr接收成功,比较addr与预定遥控器是否相同
		;加入比较程序,比较如果相同,进入数据接收状态
	check_addr:
		mov	a,@IR_ADDR_LOW
		sub	a,ir_data_low
		jbs	status,z			;if(ir_data_low==@IR_ADDR_LOW) skip else ir-low-address is err
		jmp	end_rec
		
		mov	a,@IR_ADDR_HIGH
		sub	a,ir_data_high
		jbs	status,z			;if(ir_data_high==@IR_ADDR_HIGH) skip else ir-high-address is err
		jmp	end_rec
		;go on receive ir data and ndata
		mov	a,@rec_ir_data	;set receive irHead addr low byte
		mov	ir_flag,a
		jmp	goon_rec
		
rec_succ:	/*接收完成一个irkey,判断是否有长按,如果没有则送出键值*/
		mov	a,ir_data_low
		;add	a,@0x1
		;call    convert_irkey
		;mov	TmpA,a
		;jbc	TmpA,0x0
		;jmp	cnt_long_press
		
real_key:
		mov	a,@rec_is_ok	;12.20 	mark
		mov	rec_is,a	;12.20	mark
		jmp	end_rec

cnt_long_press:
		clr	repkey_cnt
		bs	repkey_cnt,0x7	;设置长按计数标志位
		clr	irend_cnt
		jmp	end_rec
		
end_rec:
		mov	a,@0x0
		mov	ir_flag,a
		
		mov    	a,rf
		and	a,@0x00
		mov	rf,a			;clear extern int flag
/*
		jbs	rec_is,	0x7
		reti
		
		mov	a,	@0x01
		mov     iic_sendcom, a
		mov	a,	ir_data_low
		mov	iic_senddata, a
		call	mcu_iic_send
		clr	rec_is			;清除接收成功标志
*/		
		reti
		ENDP

		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -