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

📄 ir_judge.asm

📁 一款智能老鼠的玩具源代码
💻 ASM
字号:
;****************************************************************;
; IR Judge
;
; Carrier Frequency: 38K
; IR transmit output pin: PRTC[0]
; IR receive input pins: PRTD[0](front side)
;                        PRTD[1](left side)
;                        PRTD[2](right side)
;
; Written by: lixy
; Date: 2004-04-08
;****************************************************************;

;================================================================;
;Constant Area
;================================================================;
c_prtc012_1		equ	#00000111b
c_prtc012_0		equ	#11111000b

c_prtd012_1		equ	#00000111b
c_prtd0_1		equ	#00000001b
c_prtd0_0		equ	#11111110b
c_prtd1_1		equ	#00000010b
c_prtd1_0		equ	#11111101b
c_prtd2_1		equ	#00000100b
c_prtd2_0		equ	#11111011b

;c_38k_pulse		equ	#22		;the total number of 38k IR pulse transmitted(23*26us=598us)
;//04-03-17// revise the ir groups total number (primer value is 20)
;c_ir_group		equ	#12		;the interval between 38k pulse groups in one IR group
;end revise //04-03-17//
c_ir_rcv_f		equ	#10
c_ir_rcv_l		equ	#10
c_ir_rcv_r		equ	#10
c_flg_f_rcved		equ	#1		;表示前面有障碍物
c_flg_l_rcved		equ	#2		;表示左面有障碍物
c_flg_r_rcved		equ	#3		;表示右边有障碍物
c_flg_f_l_rcved		equ	#4		;表示前左有障碍物
c_flg_f_r_rcved		equ	#5		;表示前右有障碍物
c_flg_l_r_rcved		equ	#6		;表示左右有障碍物
c_flg_f_l_r_rcved	equ	#7		;表示前左右都有障碍物

c_offset_f		equ	#0
;--------------------------------------以下为左转的开始偏移
c_offset_l_20		equ	#72		;=9(row)*8(column) left 20 degree
c_offset_l_40		equ	#80		;=10(row)*8(column) left 40 degree
c_offset_l_60		equ	#88		;=11(row)*8(column) left 60 degree
c_offset_l_80		equ	#96		;=12(row)*8(column) left 80 degree
c_offset_l_100		equ	#104		;=13(row)*8(column) left 100 degree
c_offset_l_120		equ	#112		;=14(row)*8(column) left 120 degree
;--------------------------------------以下为右转的开始偏移
c_offset_r_20		equ	#144		;=18(row)*8(column) right 20 degree
c_offset_r_40		equ	#152		;=19(row)*8(column) right 40 degree
c_offset_r_60		equ	#160		;=20(row)*8(column) right 60 degree
c_offset_r_80		equ	#168		;=21(row)*8(column) right 80 degree
c_offset_r_100		equ	#176		;=22(row)*8(column) right 100 degree
c_offset_r_120		equ	#184		;=23(row)*8(column) right 120 degree
;;-------------------------------------以下为红外左右转表的开始偏移
;//04-03-17// add for swerve when detceting the obstacles
c_offset_l_20_ir	equ	#240		;=30(row)*8(column) left 20 degree
c_offset_l_40_ir	equ	#248		;=31(row)*8(column) left 40 degree
c_offset_l_60_ir	equ	#256		;=32(row)*8(column) left 60 degree
c_offset_r_20_ir	equ	#312		;=39(row)*8(column) right 20 degree
c_offset_r_40_ir	equ	#320		;=40(row)*8(column) right 40 degree
c_offset_r_60_ir	equ	#328		;=41(row)*8(column) right 60 degree
;end adding //04-03-17//

c_rnd_range_1		equ	#1		;random number range is 1
c_rnd_range_2		equ	#2		;random number range is 2
c_rnd_range_3		equ	#3		;random number range is 3
c_rnd_range_4		equ	#4		;random number range is 4
c_rnd_range_5		equ	#5		;random number range is 5
c_rnd_range_6		equ	#6		;random number range is 6
c_rnd_range_8		equ	#8		;random number range is 8

c_delay_short		equ	#120		;delay short constant

;================================================================;
;IR Data Area
;================================================================;
       .area       ir_judge_var(data)

flg_ir_received::	.ds	1	;接收后的状态(0-7表示)(哪个地方有障外)the flag of received IR
flg_l_or_r::		.ds	1	;the flag of turn left or turn right when detect obstacles in front or front-left-right of the mouse 
;cnt_38k_pulse::	.ds	1	;IR transmitted pulse counter
;cnt_ir_group::		.ds	1
cnt_ir_rcv_f::		.ds	1
cnt_ir_rcv_l::		.ds	1
cnt_ir_rcv_r::		.ds	1
;temp_delay_short::	.ds	1	;short delay variable

;================================================================;
;IR Code Area
;================================================================;
       .area       ir_judge_code(code)
       
;*********************************************************************
; intput:flg_motor_status,flg_ir_judge(接收是否完成)
;	cnt_ir_rcv_f,cnt_ir_rcv_l,cnt_ir_rcv_r(中,左,右接收的红外个数)
;
; output:
;*********************************************************************
ir_judge::
;//20040701
;	lda	flg_motor_status	;at stop status?(stop: flg_motor_status=4)
;	cmpe	#4
;	brnz	if_judge_ir
;
;	lda	#0			;/*04-03-02*/
;	sta	flg_ir_received		;added for eyes keep lighting normally when stopping.
;	br	judge_ir_end		;if at stop status, not transmit ir.

if_judge_ir:
	lda	flg_ir_judge		;if judge IR?(是否接收发射完成了?)
	cmpe	#1
	brnz	ir_judge_end

	lda	#0
	sta	flg_ir_judge
judge_ir:
	call	ir_received_judge	;接收判断子程序

;************/*04-02-26*/***************;
	lda	flg_ir_received
	cmpe	#c_flg_f_rcved
	brz	judge_ir_end
	cmpe	#c_flg_f_l_r_rcved
	brz	judge_ir_end

	lda	flg_l_or_r
	xora	#1
	sta	flg_l_or_r
;***************************************;
judge_ir_end:
;	lda	#0			;clear the flag and the counters
;	sta	cnt_ir_group
;	sta	cnt_ir_rcv_f
;	sta	cnt_ir_rcv_l
;	sta	cnt_ir_rcv_r
ir_judge_end:
	ret
	
;----------------------------------------------------------------;
;IR Received Judge Subroutine接收判断子程序
;----------------------------------------------------------------;
ir_received_judge::

f_judge:
	lda	cnt_ir_rcv_f
	cmpe	#c_ir_rcv_f
	brnc	f_no_l_judge

f_yes_l_judge:
	lda	cnt_ir_rcv_l
	cmpe	#c_ir_rcv_l
	brnc	f_yes_l_no_r_judge

f_yes_l_yes_r_judge:
	lda	cnt_ir_rcv_r
	cmpe	#c_ir_rcv_r
	brnc	f_yes_l_yes_r_no
	
;*************/*04-02-26*/**************;
f_yes_l_yes_r_yes:
	lda	#c_flg_f_l_r_rcved	;左右前方有障碍,左转或右转
	sta	flg_ir_received
  	lda	flg_l_or_r
	anda	#1
	brnz	f_l_r_turn_right	;0 turn left, 1 turn right
f_l_r_turn_left:			;左转;//04-03-17// revise the initial offset
	lda	#>c_offset_l_40_ir	;为什么这样写>(可能是想表明这里是送进查表里的)
	sta	m_offset_ini_h		;查表地址开始值
	lda	#<c_offset_l_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range		;m_rnd_range为所求的随机数的大小
	br	ir_received_set
f_l_r_turn_right:			;右转
	lda	#>c_offset_r_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_r_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
;***************************************;
   
f_yes_l_yes_r_no:
	lda	#c_flg_f_l_rcved	;左前方有障碍,右转
	sta	flg_ir_received
        lda	#>c_offset_r_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_r_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
f_yes_l_no_r_judge:
	lda	cnt_ir_rcv_r
	cmpe	#c_ir_rcv_r
	brnc	f_yes_l_no_r_no
f_yes_l_no_r_yes:
	lda	#c_flg_f_r_rcved	;右前方有障碍,左转
	sta	flg_ir_received
        lda	#>c_offset_l_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_l_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
 f_yes_l_no_r_no:
	lda	#c_flg_f_rcved		;前方有障碍,左转或右转
	sta	flg_ir_received
;*************/*04-02-26*/**************;
	lda	flg_l_or_r
	anda	#1
	brnz	f_turn_right		;0 turn left, 1 turn right
f_turn_left:				;左转
	lda	#>c_offset_l_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_l_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
f_turn_right:				;右转
	lda	#>c_offset_r_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_r_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
;No Front ***************************************;
f_no_l_judge:
	lda	cnt_ir_rcv_l
	cmpe	#c_ir_rcv_l
	brnc	f_no_l_no_r_judge
f_no_l_yes_r_judge:
	lda	cnt_ir_rcv_r
	cmpe	#c_ir_rcv_r
	brnc	f_no_l_yes_r_no
f_no_l_yes_r_yes:
	lda	#c_flg_l_r_rcved	;左右方有障碍,前行
	sta	flg_ir_received
	lda	#c_offset_f
	sta	m_offset_ini
	lda	#c_rnd_range_8
	sta	m_rnd_range
	br	ir_received_set
f_no_l_yes_r_no:
	lda	#c_flg_l_rcved		;左方有障碍,右转
	sta	flg_ir_received
	lda	#>c_offset_r_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_r_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
f_no_l_no_r_judge:
	lda	cnt_ir_rcv_r
	cmpe	#c_ir_rcv_r
	brnc	f_no_l_no_r_no
f_no_l_no_r_yes:
	lda	#c_flg_r_rcved		;右方有障碍,左转
	sta	flg_ir_received
	lda	#>c_offset_l_40_ir
	sta	m_offset_ini_h
	lda	#<c_offset_l_40_ir
	sta	m_offset_ini
	lda	#c_rnd_range_1
	sta	m_rnd_range
	br	ir_received_set
f_no_l_no_r_no:
	lda	#0			;没有障碍
	sta	flg_ir_received
	ret
ir_received_set:			;/*04-02-19*/
	lda	#2			;有IR时产生新随机数的标志为2
	sta	flg_new_random
	lda	#0
	sta	cnt_ctrl_pulse		;clear control pulse counter in Timer1 Service Routine.
	sta	cnt_ctrl_pulse+1	;/*04-02-23*/
ir_received_judge_end:
	ret

⌨️ 快捷键说明

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