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

📄 dr-1.asm

📁 单片机音频信号处理软件1.
💻 ASM
字号:
.include  "1200def.inc"

;***** Global Registers

.def	x_sr		=r0	;
.def	x_o_buf_l	=r1	;codec output buffer register
.def	x_o_buf_h	=r2
.def	x_i_buf_l	=r3	;codec input buffer register
.def	x_i_buf_h	=r4
.def	x_adc_com	=r5
.def	x_adc_value	=r6
.def	x_o_data_l	=r7	;codec output data register
.def	x_o_data_h	=r8
.def	x_delay_h	=r9
.def	x_portd_i_buf	=r10
.def	x_flags		=r11
.def	x_rep_val	=r12
.def	x_adc_clk_cunt	=r13

.def	u_tmp		=r16
.def	u_tmp_l		=r17
.def	u_tmp_h		=r18
.def	u_adc_pin	=r19
.def	u_i_data_l	=r20	;codec input data register
.def	u_i_data_h	=r21	
.def	old_value_l	=r22
.def	old_value_h	=r23
.def	u_fb_data_l	=r24
.def	u_fb_data_h	=r25
.def	u_o_ptr_l	=r26
.def	u_o_ptr_h	=r27
.def	u_i_ptr_l	=r28
.def	u_i_ptr_h	=r29
.def	u_flags		=r30
.def	u_portd_o_buf	=r31



;***** Constant


.equ	codec_do	= 0

.equ	codec_bck	= 2
.equ	codec_fs	= 3
.equ	adc_ch0		= 3
.equ	adc_ch1		= 7
.equ	adc_dat_rdy_f	= 2
.equ	k_adc_dat_rdy_f	= 0b00000100
.equ	adc_rec_act_f	= 1
.equ	k_adc_rec_act_f	= 0b00000010	
.equ	adc_di		= 0
.equ	k_adc_di	= 0b00000001
.equ	adc_clk		= 1
.equ	k_adc_clk_pin	= 0b00000010
.equ	k_adc_cs_pin	= 0b00000100
.equ	adc_cs		= 2
.equ	adc_do		= 0
.equ	last_adc_data_clk 	= 13
.equ	last_adc_com_clk	= 5
.equ	by_pass_mode = 0b01010110
.equ	delay_dat_f	= 3
.equ	k_delay_dat_f	= 0b00001000
.equ	enable_effect_f	= 4
.equ	k_toggle_sw	= 0b00010000
.equ	led_pin		= 4
.equ	k_led_pin	= 0b00010000

.equ	adc_sw_dir		= 0b11010111
.equ	sw_pin		= 5
.equ	sw_pressed_f	= 5
.equ	k_sw_pressed_f	= 0b00100000
.equ	effect_latch	= 7
.equ	k_effect_latch	= 0b10000000
.equ	bypass_latch	= 6
.equ	k_bypass_latch	= 0b01000000

	

;flags define
;	match level 	0
;	x		1
;	adc process	2
;	adc repeat	3
;	adc delay 	4
;	adc mix		5
;	adc onoff	6
;	x		7	

;x_flags
;	pressed		0
;	toggle		1
;	effect		2

.MACRO	latch_all
	ldi	u_portd_o_buf,0b00001111
	out	PORTD,u_portd_o_buf
	
.ENDMACRO

.MACRO	latch_add_l
	ldi	u_portd_o_buf,0b00011111
	out	PORTD,u_portd_o_buf
	nop
.ENDMACRO

.MACRO	latch_add_h
	ldi	u_portd_o_buf,0b00101111
	out	PORTD,u_portd_o_buf
	nop
.ENDMACRO

.MACRO	low_ram_read
	ldi	u_portd_o_buf,0b00111111
	out	PORTD,u_portd_o_buf
	
.ENDMACRO

.MACRO	high_ram_read
	ldi	u_portd_o_buf,0b01001111
	out	PORTD,u_portd_o_buf

	
.ENDMACRO

.MACRO	low_ram_write
	ldi	u_portd_o_buf,0b01011111
	out	PORTD,u_portd_o_buf
	
	
.ENDMACRO

.MACRO	high_ram_write
	ldi	u_portd_o_buf,0b01101111
	out	PORTD,u_portd_o_buf
.ENDMACRO

.MACRO	adc_latch
	ldi	u_portd_o_buf,0b01111111	
	out	PORTD,u_portd_o_buf
.ENDMACRO


.MACRO	SET_PORTB_INPUT
	clr	u_tmp			;1*
	out	DDRB,u_tmp		;1* set input
.ENDMACRO

.MACRO	SET_PORTB_OUTPUT
	ser	u_tmp
	out	DDRB,u_tmp		;1* set output
.ENDMACRO
;*************************** code segment 
	.cseg
	.org	$0000
	rjmp	init

	.org	INT0addr
	rjmp	ext_int0
	
	.org	OVF0addr
	reti

	.org	ACIaddr
	reti

;************************** External int. by BCK 
ext_int0:

	in	x_sr,SREG	;1 store status register
dat_to_codec:
	rol	x_o_buf_l		;1 c<- outbuf_l(7)		
	rol	x_o_buf_h		;1 outbuf_h(0) <- c ,c<-outbuf_h(7)		
	andi	u_portd_o_buf,0b11111101
	brcc	out_dat_to_codec
	ori	u_portd_o_buf,0b00000010
out_dat_to_codec:
	out	PORTD,u_portd_o_buf
	in	x_portd_i_buf,PIND	;skip codec data is low
	ror	x_portd_i_buf			
	rol	x_i_buf_l		 
	rol	x_i_buf_h	
	out	SREG,x_sr
	reti	
	
;*********************************************************		
init:	
;	ldi	u_tmp,0x65
;	out	0x3d,u_tmp	
	ldi	u_tmp,(1<<DDD1)+(1<<DDD4)
	out	DDRD,u_tmp

	ldi	u_tmp,0x40
	out	GIMSK,u_tmp		;Enable external interrupt 0
	ldi	u_tmp,0x02
	out	MCUCR,u_tmp		;on falling edges
		
	ldi	u_tmp,0b01110010	;set the portd bit direction
	out	DDRD,u_tmp

	
	
	ldi	u_tmp,0x7f
	mov	x_delay_h,u_tmp
	
	


initadc_latch:

	adc_latch	
	ldi	u_adc_pin,0b00001111	;.7 x
					;.6 x
					;.5 x
					;.4 x
					;.3 led off    1
					;.2 adc cs h   1
					;.1 adc clk h  1
					;.0 adc di     1
	ser	u_tmp
	out	DDRB,u_tmp
	out	PORTB,u_adc_pin
	latch_all

	clr	x_adc_value
	clr	x_rep_val
	clr	x_flags

;********************************
clr_ext_mem:	
	ldi	u_tmp_h,0x7f
	clr	u_tmp_l
	clr	u_tmp
	
	SET_PORTB_OUTPUT			

addressing:
	out	PORTB,u_tmp_l		
	latch_add_l
	latch_all

	out	PORTB,u_tmp_h		
	latch_add_h
	latch_all

	out	PORTB,u_tmp	
	low_ram_write
	latch_all

	out	PORTB,u_tmp		
	high_ram_write
	latch_all

	subi	u_tmp_l,low(1)
	sbci	u_tmp_h,high(1)
	brpl	addressing	
;*********************************
;init value	
	clr	x_i_buf_l
	clr	x_i_buf_h
	
	clr	x_o_data_l
	clr	x_o_data_h

	clr	u_tmp_l
	clr	u_tmp_h

	ldi	u_tmp,0b00000011	;adc_ch0
	mov	x_adc_com,u_tmp

	clr	x_adc_clk_cunt		
	ldi	u_tmp,0b00001100	;adc process flag, adc repeat
	mov	r30,u_tmp		;u_flags

	clr	u_o_ptr_l	
	clr	u_o_ptr_h	
	clr	u_i_ptr_l
	clr	u_i_ptr_h
;*********************************
start:	sbis	PIND,3			;wait for fs high
	rjmp	start

	mov	x_o_buf_l,x_o_data_l	
	mov	x_o_buf_h,x_o_data_h	
	mov	u_i_data_l,x_i_buf_l	
	mov	u_i_data_h,x_i_buf_h	
	sei
	rjmp	prepare_data_from_ram	

wait_fs_pulse:
	latch_all
wait_fs:
	sbis	PIND,3			; wait for FS high
	rjmp 	wait_fs	 	;*** notice: don't check bck
	mov	x_o_buf_l,x_o_data_l	
	mov	x_o_buf_h,x_o_data_h	
	mov	u_i_data_l,x_i_buf_l	
	mov	u_i_data_h,x_i_buf_h	
		
;***************************************** 
prepare_data_from_ram:
	SET_PORTB_OUTPUT

	out	PORTB,u_o_ptr_l		
	latch_add_l
	latch_all	

	out	PORTB,u_o_ptr_h		
	latch_add_h
	latch_all

	SET_PORTB_INPUT
	
	low_ram_read	
	nop	
	in	x_o_data_l,PINB		
	
	high_ram_read	
	nop	
	in	x_o_data_h,PINB		
	
	sbrs	u_flags,0		;crossing flag
	rjmp	remain_fb_data
	
	cp	x_o_data_h,old_value_h	;match together
	
	breq	match_data

	sbrs	old_value_h,7		;test negative value
	rjmp	positive_old_value
	
	subi	old_value_l,low(-16)	;if -ve, increment
	sbci	old_value_h,high(-16)
	brpl	keep_zero
	mov	x_o_data_h,old_value_h	;change the value
	mov	x_o_data_l,old_value_l
	rjmp	remain_fb_data

positive_old_value:
	subi	old_value_l,low(16)	; if +ve decrement
	sbci	old_value_h,high(16)
	brcs	keep_zero
	mov	x_o_data_h,old_value_h
	mov	x_o_data_l,old_value_l
	rjmp	remain_fb_data


keep_zero:
	clr	old_value_l
	clr	old_value_h
	rjmp	remain_fb_data

match_data:
	andi	u_flags,0b11111110	;if match, clear crossing flag
	
******************************************
;prepare_feedback_data_to_ram
remain_fb_data:
	

	mov	u_tmp_l,x_o_data_l	
	mov	u_tmp_h,x_o_data_h	
	clt				
	sbrs	u_tmp_h,7		
	rjmp	div_8			
	
;change to positive number
	set				
 	com	u_tmp_l			
	com	u_tmp_h			
	subi	u_tmp_l,low(-1)		
	sbci	u_tmp_h,high(-1)	
	
div_8:	mov	u_fb_data_l,u_tmp_l
	mov	u_fb_data_h,u_tmp_h

	clc				
	ror	u_tmp_h			
	ror	u_tmp_l				
	clc				
	ror	u_tmp_h			
	ror	u_tmp_l				
	clc				
	ror	u_tmp_h			
	ror	u_tmp_l			
		
	mov	u_tmp,x_rep_val
	cpi	u_tmp,6
	brge	check_neq
	cpi	u_tmp,5
	breq	times_7_8
	cpi	u_tmp,4
	breq	times_6_8
	cpi	u_tmp,3
	breq	times_4_8
	cpi	u_tmp,2
	breq	times_2_8
	cpi	u_tmp,1
	breq	times_1_8	;1_8
	
	
times_0:clr	u_fb_data_l
	clr	u_fb_data_h
	rjmp	store_fb_data

times_1_8:
	mov	u_fb_data_l,u_tmp_l
	mov	u_fb_data_h,u_tmp_h
	rjmp	check_neq
		
times_2_8:
	clc
	rol	u_tmp_l
	rol	u_tmp_h
	mov	u_fb_data_l,u_tmp_l
	mov	u_fb_data_h,u_tmp_h
	rjmp	check_neq	

times_4_8:
	clc
	ror	u_fb_data_h
	ror	u_fb_data_l
	rjmp	check_neq	

times_6_8:
	sub	u_fb_data_l,u_tmp_l
	sbc	u_fb_data_h,u_tmp_h
	sub	u_fb_data_l,u_tmp_l
	sbc	u_fb_data_h,u_tmp_h
	rjmp	check_neq	

times_7_8:
	sub	u_fb_data_l,u_tmp_l
	sbc	u_fb_data_h,u_tmp_h
	rjmp	check_neq	;14


check_neq:
	brtc	store_fb_data
	com	u_fb_data_l		
	com	u_fb_data_h		
	subi	u_fb_data_l,low(-1)	
	sbci	u_fb_data_h,high(-1)	

store_fb_data:
	SET_PORTB_OUTPUT
	
	out	PORTB,u_fb_data_l	
	low_ram_write
	latch_all

	out	PORTB,u_fb_data_h	
	high_ram_write
	latch_all

;**************************************
;prepare_data_to_ram:

	SET_PORTB_OUTPUT			
	out	PORTB,u_i_ptr_l		
	latch_add_l
	latch_all

	out	PORTB,u_i_ptr_h		
	latch_add_h
	latch_all

	SET_PORTB_INPUT
	
	low_ram_read
	nop
	in	u_tmp_l,PINB
	
	high_ram_read
	nop
	in	u_tmp_h,PINB
;******************************
	sbrc	u_i_data_h,7
	rjmp	neg_i

	sbrc	u_tmp_h,7
	rjmp	pos_neg

two_pos:
	add	u_tmp_l,u_i_data_l
	adc	u_tmp_h,u_i_data_h
	brvc	store_data_to_ram
	ser	u_tmp_l
	ldi	u_tmp_h,0x7f
	rjmp	store_data_to_ram

neg_i:	sbrs	u_tmp_h,7
	rjmp	pos_neg

two_neg:add	u_tmp_l,u_i_data_l
	adc	u_tmp_h,u_i_data_h
	subi	u_tmp_l,low(1)
	sbci	u_tmp_h,high(1)
	sbrs	u_tmp_h,7
	rjmp	max_neg
	subi	u_tmp_l,low(-1)
	sbci	u_tmp_h,high(-1)
	rjmp	store_data_to_ram

max_neg:ldi	u_tmp_l,0x01
	ldi	u_tmp_h,0x80
	rjmp	store_data_to_ram


pos_neg:
	add	u_tmp_l,u_i_data_l
	adc	u_tmp_h,u_i_data_h

;************************
store_data_to_ram:
	

store_memory:

	SET_PORTB_OUTPUT	 

	out	PORTB,u_tmp_l	
	low_ram_write
	latch_all

	out	PORTB,u_tmp_h		
	high_ram_write
	latch_all

;**************************************
;update in pointer

reverse_mode:
	cp	u_o_ptr_l,u_i_ptr_l
	cpc	u_o_ptr_h,u_i_ptr_h
	brne	skip_flaging
	ori	u_flags,0b00000001
	mov	old_value_h,x_o_data_h
	mov	old_value_l,x_o_data_l
	
skip_flaging:	
	subi	u_i_ptr_l,low(-1)
	sbci	u_i_ptr_h,high(-1)
	tst	u_i_ptr_l
	brne	update_out_ptr
	cp	x_delay_h,u_i_ptr_h
	breq	init_pointer

update_out_ptr:	
	subi	u_o_ptr_l,low(1)
	sbci	u_o_ptr_h,high(1)
	sbrs	u_o_ptr_h,7
	rjmp	beginning_at_ram_process
	mov	u_o_ptr_h,x_delay_h
	dec	u_o_ptr_h
	rjmp	beginning_at_ram_process

init_pointer:
	clr	u_o_ptr_l	
	clr	u_o_ptr_h	
	clr	u_i_ptr_l
	clr	u_i_ptr_h
	

;**************************************
beginning_at_ram_process:
	sbrc	u_flags,0	;crossing process
	rjmp	wait_fs
	

adc_processing:	
	sbrc	r30,2			;adc data receiving finished
	rjmp	adc_process

	sbrc	r30,3			;adc repeat process
	rjmp	adc_repeat

	sbrc	r30,4
	rjmp	adc_delay

	sbrc	r30,5
	rjmp	adc_mix	

on_off:
	andi	r30,0b10111111	;reset the adc data recived
	ori	r30,0b00001100	;change next adc data for repeat
	ldi	u_tmp,0b00000011	;adc ch0
	mov	x_adc_com,u_tmp
	
	sbrs	x_adc_value,7
	rjmp	no_press
	sbrc	x_flags,0		;pressed flag				
	rjmp	wait_fs
	ldi	u_tmp,0b00000001
	or	x_flags,u_tmp		;set pressed flag
	ldi	u_tmp,0b00000010
	eor	x_flags,u_tmp		;toggle flag
	sbrs	x_flags,1
	rjmp	bypass_state
	cli
	andi	u_adc_pin,0b11110111	;turn on led
	rjmp	clr_ext_mem
bypass_state:
	ori	u_adc_pin,0b00001000	;turn off led
	rjmp	off_mode

no_press:
	ldi	u_tmp,0b11111110
	and	x_flags,u_tmp
	rjmp	wait_fs	

;**************************
adc_process:
	andi	u_adc_pin,0b11111011	;clear adc cs pin for selection
	sbrc	u_adc_pin,adc_clk		
	rjmp	adc_clk_to_low		;
;**************************
adc_clk_to_high:
	ori	u_adc_pin,0b00000010	;set adc clock pin
	inc	x_adc_clk_cunt
	mov	u_tmp,x_adc_clk_cunt
	cpi	u_tmp,14	;
	brcc	adc_data_fully_rec
	cpi	u_tmp,6
	brcc	rec_adc_data
	out	PORTB,u_adc_pin
	adc_latch
	rjmp	wait_fs_pulse
	

adc_data_fully_rec:
	andi	r30,0b11111011		;	
	clr	x_adc_clk_cunt
	ori	u_adc_pin,0b00000100	;set adc cs pin
	out	PORTB,u_adc_pin
	adc_latch
	rjmp	wait_fs_pulse

rec_adc_data:
	ldi	u_tmp,0b11111110
	out	DDRB,u_tmp	

	out	PORTB,u_adc_pin		;*** notice the adco normal
	adc_latch
	nop		;time delay ,do not mov
	sec
	sbic	PINB,0		
	clc			
	rol	x_adc_value	
	rjmp 	wait_fs_pulse	

;***********************************
adc_clk_to_low:
	
	andi	u_adc_pin,0b11111101	;clear adc clk 
	ror	x_adc_com
	brcc	zero

one:	ori	u_adc_pin,0b00000001
	rjmp	cont
zero:	andi	u_adc_pin,0b11111110
	
	
cont:	out	PORTB,u_adc_pin
latch_adc:
	adc_latch
	rjmp	wait_fs_pulse	

;***************************************		
adc_repeat:
	andi	r30,0b11110111	;reset the adc data received 
	ori	r30,0b00010100	;change next adc data for delay
	ldi	u_tmp,0b00000111	;adc_ch1
	mov	x_adc_com,u_tmp
	
	mov	x_rep_val,x_adc_value
	lsr	x_rep_val
	lsr	x_rep_val
	lsr	x_rep_val
	lsr	x_rep_val
	lsr	x_rep_val
	rjmp	wait_fs
;***************************************	
adc_delay:
	andi	r30,0b11101111	;reset the adc data received
	ori	r30,0b00100100	;change next adc data for mix
	ldi	u_tmp,0b00001011	;adc ch2
	mov	x_adc_com,u_tmp
	ldi	u_tmp,0b00001100
	add	x_adc_value,u_tmp
	brcc	not_max
	ser	u_tmp
	mov	x_adc_value,u_tmp
not_max:	
	clc
	ror	x_adc_value
	mov	x_delay_h,x_adc_value
	rjmp	wait_fs

;**************************************
adc_mix:
	andi	r30,0b11011111	;reset the adc data received 
	ori	r30,0b01000100	;change next adc data for on off
	ldi	u_tmp,0b00001111	;adc_ch3
	mov	x_adc_com,u_tmp

	sbrc	u_adc_pin,3
	rjmp	off_mode

	mov	u_tmp,x_adc_value
	cpi	u_tmp,3
	brlo	p3
	cpi	u_tmp,58
	brlo	p3_e1
	cpi	u_tmp,106
	brlo	p3_e2
	cpi	u_tmp,159
	brlo	p3_e3
	cpi	u_tmp,198
	brlo	p2_e3
	cpi	u_tmp,253
	brlo	p1_e3
e3:	ldi	u_adc_pin,0b11000111	
	rjmp	wait_fs
p3:	ldi	u_adc_pin,0b00110111	
	rjmp	wait_fs
p3_e1:	ldi	u_adc_pin,0b01110111	
	rjmp	wait_fs
p3_e2:	ldi	u_adc_pin,0b10110111	
	rjmp	wait_fs
p3_e3:	ldi	u_adc_pin,0b11110111	
	rjmp	wait_fs
p2_e3:	ldi	u_adc_pin,0b11010111	
	rjmp	wait_fs
p1_e3:	ldi	u_adc_pin,0b11100111
	rjmp	wait_fs

off_mode:
	ldi	u_adc_pin,0b00111111
	rjmp	wait_fs

;**********************************

	




















⌨️ 快捷键说明

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