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

📄 int2_rx.asm

📁 一款智能老鼠的玩具源代码
💻 ASM
字号:
;****************************************************************;
;INT2_isr Service Routine
;
; function: IR Receiver judge
; Extern Interrupt High to low trigger
;
; Written by: Mr.Kelvin Yuan
; Date: 2004-06-30
;
;****************************************************************;

;================================================================;
;Constant Area
;================================================================;
;//04-03-17// revise for reducing the ir detect interval time
cnt_ir_lead_min		equ	#22	;standard value shall be 24(2.5ms+0.5ms=3ms),3ms/125us
cnt_ir_lead_max		equ	#29	;3.5ms+125us,1ms=8
cnt_ir_data_max		equ	#19	;standard is 16(2.0ms),+4(0.5ms)
cnt_ir_data_min		equ	#4      ;the minium data 0 is 1ms,0.5ms is limited(4)
cnt_ir_data0_max	equ	#12	;>=1.5ms is 1(2ms,16),<1.5ms is 0(1ms,8)
mouse_self_data		equ	#00001111b ;receive mouse self data
cheese_broadcast_data	equ	#01011010b ;receive cheese broadcast data
cheese_touched_data	equ	#11100001b ;receive cheese touched data
;================================================================;
;Data Area
;================================================================;
       .area    INT1_var(data)
temp_a_3::		.ds	1
temp_op1_3::		.ds	1
temp_dp_3::		.ds	1
status_ir_rcv::		.ds	1	;0 states no data received,1 is lead received ready
;2 is data1 received ready;3 is data2 received ready,4 is data1 reverse ready,5 is data2 reverse ready
;6 is mouse_self ok,7 states cheese broadcast sign received,8 states cheese touched received.
ir_rcv_data::		.ds	1
;ir_rcv_data_temp::	.ds	1
;cnt_broadcast_tmr::	.ds	2
flg_rcv_broadcast::	.ds	1    ;1 broadcast sign received,it will be clear in 2s(timer2)
;temp_count::		.ds	2    ;for test
flg_rcv_touched::	.ds	1    ;touched sign be received flag
;cnt_ir_rcv_temp :	.ds 	5 ;for test
flg_rcv_barrier::	.ds	1	;barrier sign received
;================================================================;
;Code Area
;================================================================;
       .area    INT2_isr(code)

INT2_isr::
 
	sta	temp_a_3
	lda	r_op1
	sta	temp_op1_3
	lda	r_dp
	sta	temp_dp_3

	lda	status_ir_rcv
	cmpe	#0             		;0 is the first entry interrupt
	brz	ir_rcv_first
	cmpe	#1     			;1 is the second entry intterrup
	brz	ir_rcv_lead		;lead code judge
	lda	cnt_ir_rcv

	cmpe	#cnt_ir_data_max	;cnt_ir_rcv>=cnt_ir_data_max,c=1,error
	brc	ir_rcv_data_err		;error process
	cmpe	#cnt_ir_data_min	;cnt_ir_rcv<cnt_ir_data_min,c=0,psuedo pulse,no process
;20040707
	brnc	ir_rcv_data_err	;psuedo pulse,skip,wait for the next int,count continue
	cmpe 	#cnt_ir_data0_max	;>=1.5ms is 1,<1.5ms c=0,
	lda	ir_rcv_data
	rolc
	sta	ir_rcv_data
	lda	status_ir_rcv
; cmpe	#2
; brnz	ir_rcv_data_test1
; lda	cnt_ir_rcv
; sta	cnt_ir_rcv_temp         ;for test
; br	test_return
;ir_rcv_data_test1:
; cmpe	#3
; brnz	ir_rcv_data_test2
; lda	cnt_ir_rcv
; sta	cnt_ir_rcv_temp+1         ;for test
; br	test_return
;ir_rcv_data_test2:
; cmpe	#4
; brnz	ir_rcv_data_test3
; lda	cnt_ir_rcv
; sta	cnt_ir_rcv_temp+2         ;for test
; br	test_return
;ir_rcv_data_test3:
; cmpe	#5
; brnz	test_return
; lda	cnt_ir_rcv
; sta	cnt_ir_rcv_temp+3         ;for test
; nop
;test_return:

	lda	#0
	sta	cnt_ir_rcv
	lda	status_ir_rcv
	cmpe	#9			;is the last data reverse?
	brz	ir_rcv_data_ok
	inca
	sta	status_ir_rcv
	br	INT2_isr_end
ir_rcv_data_ok:
;	lda	temp_count      ;for test
;	inca
;	sta	temp_count
;	lda	temp_count+1
;	addc	#0
;	sta	temp_count+1
	lda	ir_rcv_data
	cmpe	#mouse_self_data
	brz	ir_rcv_data_ok_self
	cmpe	#cheese_broadcast_data
	brz	ir_rcv_data_ok_bc
	cmpe	#cheese_touched_data
	brz	ir_rcv_data_ok_touched
ir_rcv_data_err:
	lda	#0		;data wrong
	sta	status_ir_rcv
	sta	cnt_ir_rcv
	sta	ir_rcv_data
	br	INT2_isr_end

ir_rcv_data_ok_touched:         ;maouse be touched,game will over
	lda	flg_touched_key   ;it is wrong that touched sign is received before broadcast sign received and key presssed
	cmpe	#1
	brnz	ir_rcv_data_err
	lda	#1
	sta	flg_rcv_touched
	lda	#0
	sta	status_ir_transmit	;stop transmit IR
	br	ir_rcv_data_err       ;the result is ok, only initial all,	
ir_rcv_data_ok_bc:
	lda	#0			;broadcast sign is received,will slow tx IR
	sta	cnt_broadcast_tmr
	sta	cnt_broadcast_tmr+1
	lda	#1
	sta	flg_rcv_broadcast      ;setup the received broadcast flag
	br	ir_rcv_data_err       ;the result is ok, only initial all,

ir_rcv_data_ok_self:
	lda	#1			;barrier, will change director
	sta	flg_rcv_barrier
	br	ir_rcv_data_err       ;the result is ok, only initial all,
ir_rcv_lead:
	lda	cnt_ir_rcv
	cmpe	#cnt_ir_lead_max	;cnt_ir_rcv>=cnt_ir_lead_max,c=1 jump
	brc	ir_rcv_data_err		;too big,error and exit,the status will be cleared in timer1_isr
	cmpe	#cnt_ir_lead_min        ;c/=1,is too small,error.c=1 is ok,
	brnc	ir_rcv_data_err
	lda	#2
	sta	status_ir_rcv           ;lead ok,ready to receive data
	lda	#0
	sta	ir_rcv_data		;clear receive data registor
	sta	cnt_ir_rcv              ;clear ir receive counter,it will increase in timer1_isr 
	br	INT2_isr_end
ir_rcv_first:
	lda	#1            ;the first entry INT,
	sta	status_ir_rcv
	lda	#0
	sta	cnt_ir_rcv
	br	INT2_isr_end
INT2_isr_end:
	lda	temp_dp_3
	sta	r_dp
	lda	temp_op1_3
	sta	r_op1
	lda	temp_a_3
	reti			;/*04-06-30/

⌨️ 快捷键说明

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