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

📄 set_rules.asl

📁 一款智能老鼠的玩具源代码
💻 ASL
📖 第 1 页 / 共 3 页
字号:
+                     1 ;****************************************************************;
+                     2 ; Set Rules
+                     3 ;
+                     4 ; Function: set some limits to the movement rules
+                     5 ;
+                     6 ; Written by: lixy
+                     7 ; Date: 2004-03-02
+                     8 ;****************************************************************;
+                     9 ;================================================================;
+                    10 ;Constant Area
+                    11 ;================================================================;
001C                 12 c_mtr_tab_row		equ	#28	;motor move status totoal number range is 0~c_mtr_tab_row+1
0008                 13 c_rnd_range_f		equ	#8	;random number range is 8
0000                 14 c_offset_f_ini		equ	#0
+                    15 
0000                 16 c_flg_left		equ	#0
0001                 17 c_flg_right		equ	#1
0002                 18 c_flg_backup		equ	#2
0003                 19 c_flg_ahead		equ	#3
+                    20 ;//04-04-13// add
0004                 21 c_flg_stop		equ	#4
+                    22 
+                    23 
001A                 24 c_rnd_range_not_stop	equ	#26
+                    25 ;end add //04-04-13//
0002                 26 c_flg_l_rcved		equ	#2
0003                 27 c_flg_r_rcved		equ	#3
0004                 28 c_flg_f_l_rcved		equ	#4
0005                 29 c_flg_f_r_rcved		equ	#5
0001                 30 c_rnd_range_1		equ	#1		;random number range is 1
+                    31 ;c_rnd_range_2		equ	#2		;random number range is 2
+                    32 ;c_rnd_range_3		equ	#3		;random number range is 3
+                    33 ;c_rnd_range_4		equ	#4		;random number range is 4
+                    34 ;c_rnd_range_5		equ	#5		;random number range is 5
+                    35 ;c_rnd_range_6		equ	#6		;random number range is 6
+                    36 ;c_rnd_range_8		equ	#8		;random number range is 8
+                    37 ;c_offset_f		equ	#0
+                    38 ;;--------------------------------------以下为左转的开始偏移
+                    39 ;c_offset_l_20		equ	#72		;=9(row)*8(column) left 20 degree
+                    40 ;c_offset_l_40		equ	#80		;=10(row)*8(column) left 40 degree
+                    41 ;c_offset_l_60		equ	#88		;=11(row)*8(column) left 60 degree
+                    42 ;c_offset_l_80		equ	#96		;=12(row)*8(column) left 80 degree
+                    43 ;c_offset_l_100		equ	#104		;=13(row)*8(column) left 100 degree
+                    44 ;c_offset_l_120		equ	#112		;=14(row)*8(column) left 120 degree
+                    45 ;;--------------------------------------以下为右转的开始偏移
+                    46 ;c_offset_r_20		equ	#144		;=18(row)*8(column) right 20 degree
+                    47 ;c_offset_r_40		equ	#152		;=19(row)*8(column) right 40 degree
+                    48 ;c_offset_r_60		equ	#160		;=20(row)*8(column) right 60 degree
+                    49 ;c_offset_r_80		equ	#168		;=21(row)*8(column) right 80 degree
+                    50 ;c_offset_r_100		equ	#176		;=22(row)*8(column) right 100 degree
+                    51 ;c_offset_r_120		equ	#184		;=23(row)*8(column) right 120 degree
+                    52 ;;;-------------------------------------以下为红外左右转表的开始偏移
+                    53 ;;//04-03-17// add for swerve when detceting the obstacles
00F0                 54 c_offset_l_20_ir	equ	#240		;=30(row)*8(column) left 20 degree
00F8                 55 c_offset_l_40_ir	equ	#248		;=31(row)*8(column) left 40 degree
+                    56 ;c_offset_l_60_ir	equ	#256		;=32(row)*8(column) left 60 degree
0138                 57 c_offset_r_20_ir	equ	#312		;=39(row)*8(column) right 20 degree
0140                 58 c_offset_r_40_ir	equ	#320		;=40(row)*8(column) right 40 degree
+                    59 ;c_offset_r_60_ir	equ	#328		;=41(row)*8(column) right 60 degree
+                    60 ;;end adding //04-03-17//
+                    61 ;================================================================;
+                    62 ;Data Area
+                    63 ;================================================================;
+B 00 01

+                    64 	.area    set_rules_var(data)
+                    65 
0000                 66 temp_flg_ir_received::	.ds	1	;store the last flg_ir_received value
0001                 67 flg_last_barrier::	.ds	1	;there is barrier at the last time
+                    68 ;================================================================;
+                    69 ;Code Area
+                    70 ;================================================================;
+B 00 02

+                    71        .area    set_rules_code(code)
+                    72 
0000                 73 Run_judge::
0000 F1 00           74 	lda	flg_rcv_barrier	;Is there any barrier sign ahead?
0002 A7 01           75 	cmpe	#1
0004 06 00 2E        76 	brz	front_barrier
0007 F1 00           77 	lda	flg_new_random   ;there isn't barrier
0009 A7 00           78 	cmpe	#0
000B 07 00 1D        79 	brnz	Run_next_status  ;the last status finished(flg_new_random=1 or 2)
+                    80 ;--------------------------------------------------------------------------------
+                    81 ;no barrier at this times,the last status isn't finished
000E F1 01           82 	lda	flg_last_barrier
0010 A7 01           83 	cmpe	#1
0012 06 00 16        84 	brz     last_barrier_ahead	;if the last barrier,will go ahead 
0015 24              85 	ret  ;no barrier at this times and last times ,the last status isn't finished,no change,go on the current status
0016                 86 last_barrier_ahead:
0016 F3 00           87 	lda	#0              ;no barrier at this times,barrier at last times,last status isn't finished
0018 FD 01           88 	sta	flg_last_barrier ;go ahead
001A 02 00 85        89 	br	next_status_ahead
+                    90 ;------------------------------------------------------------------------------------
+                    91 ;no barrier at this time,the last status has be finished
001D                 92 Run_next_status:
001D F1 01           93 	lda	flg_last_barrier       ;the last status has be finished
001F A7 00           94 	cmpe	#0                    
0021 06 00 27        95 	brz	Run_random_status   ;there isn't barrier in the previous status,will random except backup
0024 02 00 16        96 	br	last_barrier_ahead  ;no barrier at this time,barrier at last time,current status finished,go ahead
0027                 97 Run_random_status:
0027 F3 03           98 	lda	#3	   ;no barrier at this time and last time,last status finished
0029 FD 00           99 	sta	rnd_num
002B 02 00 5C       100 	br	next_status_l_r_ahead  ;the next status will be left,right,(backup),ahead
+                   101 ;------------------------------------------------------------------------------------------
+                   102 ;barrier at the front
002E                103 front_barrier:
002E F3 01          104 	lda	#1
0030 FD 01          105 	sta	flg_last_barrier
0032 F1 00          106 	lda	flg_motor_status	;if the previous status is turning left or right, the next status is left or right too.
0034 A7 03          107 	cmpe	#c_flg_ahead
0036 06 00 58       108 	brz	next_status_l_r_b	;the next status is a random except ahead
0039 F1 00          109 	lda	flg_new_random
003B A7 00          110 	cmpe	#0
003D 06 00 57       111 	brz	pre_status_continue	;if the previous status is going on,no change director and continue the last status
0040 F1 00          112 	lda	flg_motor_status
0042 A7 00          113 	cmpe	#c_flg_left
0044 06 00 A5       114 	brz	next_status_left	;repeat the last status
0047 A7 01          115 	cmpe	#c_flg_right
0049 06 00 9A       116 	brz	next_status_right	;repeat the last status
004C A7 02          117 	cmpe	#c_flg_backup		;the previous status is backup
004E 06 00 7A       118 	brz	next_status_backup      ;repeat backup
0051 A7 04          119 	cmpe	#c_flg_stop		;if the previous status is stop, not stop next.
0053 06 00 A5       120 	brz	next_status_left	;turn left(assume),may turn right
0056 24             121 	ret
0057                122 pre_status_continue:
+                   123 ;	lda	#0		;go on the last status till it is finished(flg_new_random=1)
+                   124 ;	sta	flg_rcv_barrier
0057 24             125 	ret
0058                126 next_status_l_r_b:
0058 F3 02          127 	lda	#2		;0 will turn left,1 will turn right,2 will turn backup
005A FD 00          128 	sta	m_rnd_range
005C                129 next_status_l_r_ahead:
005C F3 00          130 	lda	#0
005E FD 00          131 	sta	rnd_num
0060 20 00 00       132 	call	read_random
0063 F1 00          133 	lda	rnd_num
0065 A7 00          134 	cmpe	#c_flg_left
0067 06 00 A5       135 	brz	next_status_left
006A A7 01          136 	cmpe	#c_flg_right
006C 06 00 9A       137 	brz	next_status_right
006F A7 02          138 	cmpe	#c_flg_backup
0071 06 00 7A       139 	brz	next_status_backup
0074 A7 03          140 	cmpe	#c_flg_ahead
0076 06 00 85       141 	brz	next_status_ahead
0079 24             142 	ret
007A                143 next_status_backup:
007A F1 00          144 	lda	flg_rcv_barrier
007C A7 00          145 	cmpe	#0
007E 06 00 9A       146 	brz	next_status_right  ;assume,if no barrier,it cann't backup
+                   147 ;   backup
+                   148 
+                   149    
0081 02 00 AD       150    	br	next_status_set_end
0084 24             151 	ret
0085                152 next_status_ahead:
0085 F3 00          153 	lda	#>c_offset_f_ini
0087 FD 00          154 	sta	m_offset_ini_h
0089 F3 00          155 	lda	#<c_offset_f_ini
008B FD 00          156 	sta	m_offset_ini
008D F3 08          157 	lda	#c_rnd_range_f
008F FD 00          158 	sta	m_rnd_range
0091 F3 00          159 	lda	#0
0093 FD 00          160 	sta	flg_new_random
0095 FD 00          161 	sta	cnt_ctrl_pulse		;clear control pulse counter in Timer1 Service Routine.
0097 FD 01          162 	sta	cnt_ctrl_pulse+1	;/*04-02-23*/
0099 24             163 	ret
009A                164 next_status_right:				;右转
009A F3 01          165 	lda	#>c_offset_r_40_ir
009C FD 00          166 	sta	m_offset_ini_h
009E F3 40          167 	lda	#<c_offset_r_40_ir
00A0 FD 00          168 	sta	m_offset_ini
00A2 02 00 AD       169 	br	next_status_set_end
00A5                170 next_status_left:			;左转
00A5 F3 00          171 	lda	#>c_offset_l_40_ir
00A7 FD 00          172 	sta	m_offset_ini_h
00A9 F3 F8          173 	lda	#<c_offset_l_40_ir
00AB FD 00          174 	sta	m_offset_ini
00AD                175 next_status_set_end:
00AD F3 01          176 	lda	#c_rnd_range_1
00AF FD 00          177 	sta	m_rnd_range
00B1 F3 00          178 	lda	#0
00B3 FD 00          179 	sta	flg_new_random
00B5 FD 00          180 	sta	cnt_ctrl_pulse		;clear control pulse counter in Timer1 Service Routine.
00B7 FD 01          181 	sta	cnt_ctrl_pulse+1	;/*04-02-23*/
00B9 24             182 	ret
+                   183 
+                   184 	
+                   185 
+                   186 
+                   187 ;set_rules::
+                   188 ;	;lda	flg_new_random
+                   189 ;	cmpe	#1
+                   190 ;;	brnz	set_rules_end
+                   191 ;	brnz	rules_for_ir		;if the flg_new_random is 2, set some rules for run when received ir.
+                   192 ;	
+                   193 ;;-------------------------------------这是flg_new_random==1时的设置一些规则,即是没有障碍物的情况下。
+                   194 ;rules_for_free_run:			;
+                   195 ;	lda	flg_motor_status	;if the previous status is turning left or right, the next move status is straight forward.
+                   196 ;	cmpe	#c_flg_stop		;if the previous status is stop, not stop next.

⌨️ 快捷键说明

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