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

📄 mouse_timer1.asl

📁 一款智能老鼠的玩具源代码
💻 ASL
📖 第 1 页 / 共 2 页
字号:
+                     1 ;****************************************************************;
+                     2 ; Timer1 Service Routine
+                     3 ;
+                     4 ; Generate motor control pulse and Play sound
+                     5 ; Timer1 frequency: 8K 
+                     6 ; Motor control pulse frequency:  
+                     7 ;
+                     8 ; Written by: lixy
+                     9 ; Date: 2004-02-14
+                    10 ;****************************************************************;
+                    11 
+                    12 ;================================================================;
+                    13 ;Constant Area
+                    14 ;================================================================;
00FE                 15 c_prtc0_0		equ	#11111110b
0001                 16 c_prtc0_1		equ	#00000001b
0001                 17 c_prtd0_1		equ	#00000001b
0002                 18 c_prtd1_1		equ	#00000010b
0004                 19 c_prtd2_1		equ	#00000100b
0007                 20 c_prtd012_1		equ	#00000111b
0005                 21 c_ir_transmit		equ	#5
0005                 22 c_ir_transmit_l		equ	#5
000D                 23 c_ir_transmit_h		equ	#13
000C                 24 c_ir_group		equ	#12
0004                 25 cnt_ir_transmit_high	equ	#4            ;05ms/(1/8k)=4
0014                 26 cnt_ir_tx_lead		equ	#20           ;2.5ms/(1/8k)=4
0004                 27 cnt_ir_tx_data_0		equ	#4            ;0.5ms/(1/8k)=4
+                    28 ;cnt_ir_tx_data2		equ	#4            ;0.5ms/(1/8k)=4
000C                 29 cnt_ir_tx_data_1		equ	#12           ;1.5ms/(1/8k)=12
+                    30 ;cnt_ir_tx_data2r	equ	#12           ;1.5ms/(1/8k)=12
0004                 31 cnt_ir_tx_stop		equ	#4            ;0.5ms/(1/8k)=12
001D                 32 cnt_ir_rcv_max		equ	#29           ;3.625ms
000F                 33 c_ir_tx_data		equ	#00001111b	;ir transmit data mouse_self
+                    34 ;================================================================;
+                    35 ;Timer1 Data Area
+                    36 ;================================================================;
+B 00 01

+                    37        .area       time1_var(data)
+                    38        
0000                 39 temp_a_1::		.ds	1	;store the acc value
0001                 40 temp_op1_1::		.ds	1
0002                 41 temp_dp_1::		.ds	1
0003                 42 cnt_timer1::		.ds	1	;the interrupt times counter
0004                 43 cnt_ctrl_pulse::	.ds	2	;the motor control pulse counter
+                    44 
0006                 45 cnt_ir_transmit::	.ds	1
+                    46 ;cnt_ir_group::		.ds	1
0007                 47 cnt_ir_rcv::		.ds	1
+                    48 ;//status_ir_rcv is defined in IR_RCV_INT
+                    49 ;status_ir_rcv::		.ds	1	;0 states no data received,1 is lead received ok
+                    50 ;2 is data1 received ok,3 is data2 received ok,4 is data1 reverse ok,5 is data2 reverse ok
+                    51 ;6 is mouse_self ok,7 states cheese broadcast sign received,8 states cheese touched received.
+                    52 ;cnt_ir_rcv_f::		.ds	1
+                    53 ;cnt_ir_rcv_l::		.ds	1
+                    54 ;cnt_ir_rcv_r::		.ds	1
0008                 55 flg_ir_judge::		.ds	1
0009                 56 flg_ir_transmit::	.ds	1
000A                 57 status_ir_transmit::	.ds	1	;0 is not transmit,1 is preamble,2 is data1(0),3 is data2(0)
+                    58 ;4 is data1 reverse(1),5 is data2 reverse(1),6 is stop bit
000B                 59 flg_ir_transmit_high::	.ds	1	;when it is set to 1, not transmit 38k
000C                 60 cnt_ir_tx_data::	.ds	1	;ir transmit data 00001111b
000D                 61 flg_ir_tx_1::		.ds	1	;tx 1 flag
+                    62 ;================================================================;
+                    63 ; PCM Speech Subroutine
+                    64 ;================================================================;
+                    65           ;.area   pcmvari(data)
+                    66 ;-------------------------------------
000E                 67 M_sphptr::      .ds     3
0011                 68 M_stopbit::	.ds	1
0012                 69 M_pcmdata::	.ds	1
+                    70 ;================================================================;
+                    71 ;Timer1 Code Area
+                    72 ;================================================================;
+B 00 02

+                    73        .area       timer1_isr(code)
+                    74 
0000                 75 t1_isr::
0000 FD 00           76 	sta	temp_a_1		;save register A
0002 F0 22           77 	lda	r_op1			;save register OP1
0004 FD 01           78 	sta	temp_op1_1
0006 F0 21           79 	lda	r_dp			;save register DP
0008 FD 02           80 	sta	temp_dp_1
+                    81 	
000A 20 01 19        82 	call	motor_control_pulse	
+                    83 ;//04-04-09// add 
+                    84 ;//20040630,transmit mouse self data 0011
000D F1 0A           85 	lda 	status_ir_transmit
000F A7 00           86 	cmpe 	#0			;if status=0,yes,no need transmit
0011 06 00 17        87 	brz	p_skip_tx
0014 20 00 40        88 	call 	ir_transmit		;need transmit
0017                 89 p_skip_tx:
+                    90 ;//Receive IR count
0017 F1 07           91 	lda	cnt_ir_rcv		;receive IR count*125us
0019 1F              92 	inca
001A FD 07           93 	sta	cnt_ir_rcv
001C A7 1D           94 	cmpe	#cnt_ir_rcv_max		;cnt_ir_rcv>=cnt_ir_rcv_max, c=1	
001E 05 00 27        95 	brnc	t1_isr_play	        ;cnt_ir_rcv<max,receiver ir normal,skip
0021 F3 00           96 	lda	#0
0023 FD 07           97 	sta	cnt_ir_rcv
0025 FD 00           98 	sta	status_ir_rcv
+                    99        
0027                100 t1_isr_play:
0027 F3 FF          101 	lda	#0ffh			;检查是否播发完?
0029 A5 11          102 	cmpe	M_stopbit
002B 06 00 35       103 	brz	t1_isr_end
002E 20 00 EE       104 	call	Pcm_Play
0031 F1 12          105 	lda	M_pcmdata
0033 FC 34          106 	sta	r_pwmc
0035                107 t1_isr_end:        
0035 F1 02          108 	lda	temp_dp_1		;restore register DP
0037 FC 21          109         sta	r_dp
0039 F1 01          110 	lda	temp_op1_1		;restore register OP1
003B FC 22          111 	sta	r_op1
003D F1 00          112 	lda	temp_a_1		;restore register A
003F 25             113         reti
+                   114 
+                   115 ;--------------------------------------------------------------------;
+                   116 ;IR Transmit and Receive Subroutine
+                   117 ;IR transmit pin: PRTC.0 ("1" not transmit, "0" transmit)
+                   118 ;IR receive pins: PRTD.7 (front)
+                   119 
0040                120 ir_transmit:
0040 F1 06          121 	lda	cnt_ir_transmit		;发射的信号的电平长度计数
0042 1F             122 	inca
0043 FD 06          123 	sta	cnt_ir_transmit
0045 F1 0B          124 	lda 	flg_ir_transmit_high	;1 stop 38k
0047 A7 00          125 	cmpe	#0
0049 06 00 81       126 	brz	ir_transmit_low         ;=0,goto low
004C F1 06          127 	lda 	cnt_ir_transmit         ;high
004E A7 04          128 	cmpe	#cnt_ir_transmit_high    ;0.5ms/125us=4,
0050 06 00 54       129 	brz	ir_transmit_next_bit         ;=4 will enter the next status(low)
0053 24             130 	ret				 ;continue hold high
0054                131 ir_transmit_next_bit:
0054 F1 0C          132 	lda 	cnt_ir_tx_data
0056 8B 00          133 	adda	#0	;clear cy
0058 7E             134 	rolc
0059 FD 0C          135 	sta	cnt_ir_tx_data
005B F3 00          136 	lda	#0
005D FD 0D          137 	sta	flg_ir_tx_1	;clear 0
005F 99 0D          138 	addc	flg_ir_tx_1
0061 FD 0D          139 	sta	flg_ir_tx_1     ;set cy
0063 F0 31          140 	lda	r_prtc			;when prtc.0 is low, 38k carrier pulse pass-by.
0065 CB FE          141 	anda	#c_prtc0_0
0067 FC 31          142 	sta	r_prtc	
0069 F3 00          143 	lda	#0
006B FD 06          144 	sta	cnt_ir_transmit		;clear the counter,repeat count
006D FD 0B          145 	sta 	flg_ir_transmit_high	;0 to transmit 38k
006F F1 0A          146 	lda	status_ir_transmit
0071 1F             147 	inca	
0072 FD 0A          148 	sta	status_ir_transmit
0074 A7 0B          149 	cmpe	#11
0076 04 00 7A       150 	brc	ir_transmit_over
0079 24             151 	ret 
007A                152 ir_transmit_over:                      ;stop bit,shouldn't have this status 
007A F0 31          153 	lda	r_prtc			;when prtc.0 is high, not transmit ir.
007C DB 01          154 	ora	#c_prtc0_1		;把PC[1]置高
007E FC 31          155 	sta	r_prtc
0080 24             156 	ret
+                   157 ;	cmpe	#1			;is lead preamble?
+                   158 ;	brnz	ir_transmit_next1
+                   159 ;	lda	#2
+                   160 ;	sta	status_ir_transmit
+                   161 ;	ret
+                   162 ;ir_transmit_next1:
+                   163 ;
+                   164 ;	cmpe	#2			;is data1?
+                   165 ;	brnz	ir_transmit_next2
+                   166 ;	lda	#3
+                   167 ;	sta	status_ir_transmit
+                   168 ;	ret
+                   169 ;ir_transmit_next2:
+                   170 ;	cmpe	#3			;is data2?
+                   171 ;	brnz	ir_transmit_next3
+                   172 ;	lda	#4
+                   173 ;	sta	status_ir_transmit
+                   174 ;	ret
+                   175 ;ir_transmit_next3:
+                   176 ;	cmpe	#4			;is data1 reverse?
+                   177 ;	brnz	ir_transmit_next4
+                   178 ;	lda	#5
+                   179 ;	sta	status_ir_transmit
+                   180 ;	ret
+                   181 ;ir_transmit_next4:
+                   182 ;	cmpe	#5			;is data2 reverse?
+                   183 ;	brnz	ir_transmit_next5
+                   184 ;	lda	#6
+                   185 ;	sta	status_ir_transmit
+                   186 ;	ret	
+                   187 ;ir_transmit_next5:                      ;stop bit,shouldn't have this status 
+                   188 ;	lda	r_prtc			;when prtc.0 is high, not transmit ir.
+                   189 ;	ora	#c_prtc0_1		;把PC[1]置高
+                   190 ;	sta	r_prtc
+                   191 ;	ret
+                   192 	
0081                193 ir_transmit_low:
0081 F1 0A          194 	lda	status_ir_transmit
0083 A7 01          195 	cmpe	#1			;is lead preamble?
+                   196 ;	brnz	ir_transmit_low_1
0085 07 00 9A       197 	brnz	ir_transmit_data_low
0088 F1 06          198 	lda	cnt_ir_transmit         ;transmit lead code
008A A7 14          199 	cmpe	#cnt_ir_tx_lead
008C 04 00 C2       200 	brc	ir_transmit_low_00      ;>=,turn to high 0.5ms
008F F0 31          201 	lda	r_prtc			;continue tx 38k,when prtc.0 is low, 38k carrier pulse pass-by.
0091 CB FE          202 	anda	#c_prtc0_0
0093 FC 31          203 	sta	r_prtc	
0095 F3 0F          204 	lda	#c_ir_tx_data           ;set initial value #00001111b
0097 FD 0C          205 	sta	cnt_ir_tx_data
0099 24             206 	ret
+                   207 
009A                208 ir_transmit_data_low:
009A A7 0A          209 	cmpe	#10			;is stop bit?
009C 04 00 D1       210 	brc	ir_tx_data_low_over
009F F1 0D          211 	lda	flg_ir_tx_1
00A1 A7 01          212 	cmpe	#1
00A3 06 00 B4       213 	brz	ir_transmit_data_1
00A6 F1 06          214 	lda	cnt_ir_transmit          ;flg_ir_tx_1=0 
00A8 A7 04          215 	cmpe	#cnt_ir_tx_data_0
00AA 06 00 C2       216 	brz	ir_transmit_low_00
00AD F0 31          217 	lda	r_prtc			;continue tx 38k,when prtc.0 is low, 38k carrier pulse pass-by.
00AF CB FE          218 	anda	#c_prtc0_0
00B1 FC 31          219 	sta	r_prtc	
00B3 24             220 	ret   
00B4                221 ir_transmit_data_1:
00B4 F1 06          222 	lda	cnt_ir_transmit         ;tx 1(low)
00B6 A7 0C          223 	cmpe	#cnt_ir_tx_data_1
00B8 06 00 C2       224 	brz	ir_transmit_low_00
00BB F0 31          225 	lda	r_prtc			;continue tx 38k,when prtc.0 is low, 38k carrier pulse pass-by.
00BD CB FE          226 	anda	#c_prtc0_0
00BF FC 31          227 	sta	r_prtc	
00C1 24             228 	ret        
00C2                229 ir_transmit_low_00:
00C2 F3 01          230 	lda	#1
00C4 FD 0B          231 	sta 	flg_ir_transmit_high	;1 stop 38k
00C6 F3 00          232 	lda	#0
00C8 FD 06          233 	sta	cnt_ir_transmit		;repeat start counting
00CA F0 31          234 	lda	r_prtc			;when prtc.0 is high, not transmit ir.
00CC DB 01          235 	ora	#c_prtc0_1		;把PC[1]置高

⌨️ 快捷键说明

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