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

📄 i993_lcd_avr168.asm

📁 IPOD 线控程序(将IPOD AND IPHONE 的歌曲信息读出来显示的LCD 屏幕上) 适应于 所有的 苹果 MP3 和手机的机型
💻 ASM
📖 第 1 页 / 共 5 页
字号:
upkeyprogram_2:
;	lds	r16,model_status
;	cpi		r16,0
;	breq	upkeyprogram_3
	call	dis_vol
upkeyprogram_3:
	call	delay_300ms
	sbis	pinb,vol_add_key
	rjmp	upkeyprogram
	call	vol_save
;	rcall	send5767				;  调试程序
	rjmp	main
;=======================================================第二级
second_up_program:
	sbis	pinb,vol_add_key
	rjmp	second_up_program
	lds	r16,first_status
	cpi	r16,0
	brne	second_up_program_1
	ldi	r16,1
	rjmp	second_up_program_2
second_up_program_1:
	ldi	r16,0
second_up_program_2:
	sts	first_status,r16
	call	dis_set_model			; dis set repeat shuffle
	rjmp	main
;===================================================上键结束


;==============================================下键开始
;=======================================================第一级
first_down_program:
downkeyprogram:
	lds	r16,volregister
	cpi	r16,0
	breq	downkeyprogram_2
	cpi	r16,1
	breq	downkeyprogram_1
	dec	r16
	sts	volregister,r16
	call	vol_mius
	rjmp	downkeyprogram_2
downkeyprogram_1:
	dec	r16
	sts	volregister,r16
	lds	r16,model_status
	cpi	r16,0
	brne	downkeyprogram_1_0
	call	radio_mute
	rjmp	downkeyprogram_2
downkeyprogram_1_0:
	sbi	portd,mute
downkeyprogram_2:
;	lds	r16,model_status
;	cpi	r16,0
;	breq	downkeyprogram_3	
	call	dis_vol
;	call	radio_mute			;   tiaoshi  chengxcu
downkeyprogram_3:
	call	delay_300ms
	sbis	pinb,vol_mius_key
	rjmp	downkeyprogram
	rcall	vol_save
	rjmp	main
;==================================================第二级
second_down_program:
	sbis	pinb,vol_mius_key
	rjmp	second_down_program
	lds	r16,first_status
	cpi	r16,0
	brne	second_down_program_1
	ldi	r16,1
	rjmp	second_down_program_2
second_down_program_1:
	ldi	r16,0
second_down_program_2:
	sts	first_status,r16
	call	dis_set_model			; dis set repeat shuffle
	rjmp	main
;===========================================上下 键子程序
;****************************************** 左键
first_left_program:

;===========================pretrack =0 play =1 pause =2 FF =3 REW =4 stop
exPRETRACK:
	ldi	r16,100
exPRETRACK_0:
	call	delay_20ms
	sbic	pinb,pre_track_key
	rjmp	exPRETRACK_1
	dec	r16
	brne	exPRETRACK_0
	ldi	r16,6
	sts	playcontrol_status,r16
	call	play_control
	call	readipod_no_save
	lds	r16,play_status
	sts	play_status_temp,r16		; save play_status
	ldi	r16,3
	sts	play_status,r16	
	call	display_playinfo	;显示 快进
exPRETRACK_0_1:
;------------------------------------------------判断是不是下一首
	call	getcurrentplaytrackindex
	call	readipod
	lds	r16,readipod_start+8	
	lds	r17,dissendipodcount_hi
	cp	r16,r17
	brne	exPRETRACK_0_2
	lds	r16,readipod_start+9	
	lds	r17,dissendipodcount_lo
	cp	r16,r17	
	brne	exPRETRACK_0_2
;----------------------------------------------------------读进度
	call	delay_100ms	
	call	getplaystatus
   	 call	readipod
    	lds	r16,readipod_start+14
   	 cpi	r16,0
   	brne	exPRETRACK_0_1_1
;-------------------------------------------------------- STOP 到第一级
  	
	call	reset_program
;---------------------------------------------------------等松键
exPRETRACK_0_1_0:
	sbis	pinb,pre_track_key
	rjmp	exPRETRACK_0_1_0
	rjmp	main
exPRETRACK_0_1_1:
;------------------------------------------------------------显示进度
	call	display_jidu_key	;显示 快进
	sbis	pinb,pre_track_key
	rjmp	exPRETRACK_0_1
;-----------------------------------------------------------
exPRETRACK_0_2:
	ldi	r16,0x07
	sts	playcontrol_status,r16
	call	play_control		; 停止后退
	call	readipod_no_save
	lds	r16,play_status_temp
	sts	play_status,r16
	call	pofang_zhuangtai	;显示 播放图标
	rjmp	exPRETRACK_exit
;===============================================================上一首
exPRETRACK_1:
	;ldi	r16,0
	;sts	play_status,r16
	call	pofang_zhuangtai	;显示 播放图标
;------------------------------------	
	call	getnumplayingtrack
	call	readipod
	lds	r16,playnumber_start+2
	sts	playnumber_high,r16
	lds	r16,playnumber_start+3
	sts	playnumber_low,r16
	call	getcurrentplaytrackindex
	call	readipod
	lds	r16,playindex_start+2
	sts	playindex_high,r16
	lds	r16,playindex_start+3
	sts	playindex_low,r16
	lds	r16,playindex_high
	cpi	r16,0
	brne	exPRETRACK_2
	lds	r16,playindex_low
	cpi	r16,0
	breq	exPRETRACK_exit	
exPRETRACK_2:	
	ldi	r16,4		; 上一首
	sts	playcontrol_status,r16
	call	play_control
	call	readipod_no_save
	call	display_playinfo
	LDI	R16,0
	STS	dis_leixing,R16
exPRETRACK_exit	:
	rjmp	main
;=======================================================
;===============================================
second_left_program:	
	sbis	pinb,pre_track_key
	rjmp	second_left_program
	lds	r16,first_status
	cpi	r16,1
	brne	second_left_program_1
	lds	r16,repeat_status
	rjmp	second_left_program_2
second_left_program_1:
	lds	r16,shuffle_status
second_left_program_2:
	cpi	r16,0
	brne	second_left_program_3
	ldi	r16,2
	rjmp	second_left_program_4
second_left_program_3:
	dec	r16
second_left_program_4:
	lds	r17,first_status
	cpi	r17,1
	brne	second_left_program_5
	STS	repeat_status,r16
	rjmp	second_left_program_6
second_left_program_5:
	sts	shuffle_status,r16
second_left_program_6:
	call	dis_set_model
	rjmp	main

;
;*************************************************右键开始

;=============================================================第二级
first_right_program:	;next track =0 play =1 pause =2 FF =3 REW =4 stop
exnextTRACK:	
	ldi	r16,100
exnextTRACK_0:
	call	delay_20ms
	sbic	pinb,next_track_key
	rjmp	exnextTRACK_1
	dec	r16
	brne	exnextTRACK_0
	ldi	r16,5
	sts	playcontrol_status,r16
	call	play_control
	call	readipod_no_save
	lds	r16,play_status
	sts	play_status_temp,r16		; save play_status
	ldi	r16,2
	sts	play_status,r16
exnextTRACK_0_0:
	call	display_playinfo	;显示 快进
exnextTRACK_0_1:
;------------------------------------------------判断是不是下一首
	call	getcurrentplaytrackindex
	call	readipod
	lds	r16,readipod_start+8	
	lds	r17,dissendipodcount_hi
	cp	r16,r17
	brne	exnextTRACK_0_2
	lds	r16,readipod_start+9	
	lds	r17,dissendipodcount_lo
	cp	r16,r17	
	brne	exnextTRACK_0_2
;--------------------------------------------------------读进度
	call	delay_100ms	
	call	getplaystatus
   	 call	readipod
    	lds	r16,readipod_start+14
   	 cpi	r16,0
   	brne	exnextTRACK_0_1_1
;----------------------------------------------------------- STOP 到第一级
  	
	call	reset_program
;---------------------------------------------------------等松键
exnextTRACK_0_1_0:
	sbis	pinb,next_track_key
	rjmp	exnextTRACK_0_1_0
	rjmp	main
exnextTRACK_0_1_1:
;------------------------------------------------------------显示进度
	call	display_jidu_key	;显示 快进
	sbis	pinb,next_track_key
	rjmp	exnextTRACK_0_1
exnextTRACK_0_2:
	ldi	r16,0x07
	sts	playcontrol_status,r16
	call	play_control
	call	readipod_no_save
	lds	r16,play_status_temp
	sts	play_status,r16
	call	pofang_zhuangtai	;	显示播放图标
	rjmp	exnextTRACK_exit
;---------------------------------------;停止 快进
	call	getplaystatus
	call	readipod
	lds	r16,stop_start
	cpi	r16,0
	brne	exnextTRACK_1
	ldi	r16,1
;	sts	main_status,r16
	ldi	r16,4		;  错误
	sts	play_status,r16
	call	pofang_zhuangtai	; 关了 播放图标
	rjmp	exnextTRACK_exit
exnextTRACK_1:
	;ldi	r16,0
	;sts	play_status,r16
	call	pofang_zhuangtai	;	显示播放图标
;----------------------------------------
	call	getnumplayingtrack
	call	readipod
	lds	r16,playnumber_start+2
	sts	playnumber_high,r16
	lds	r16,playnumber_start+3
	sts	playnumber_low,r16
	call	getcurrentplaytrackindex
	call	readipod
	lds	r16,playindex_start+2
	sts	playindex_high,r16
	lds	r16,playindex_start+3
	sts	playindex_low,r16
	lds	r16,playindex_high
	lds	r17,playnumber_high
	cp	r16,r17
	brne	exnextTRACK_2
	lds	r16,playindex_low
	inc	r16
	lds	r17,playnumber_low
	cp	r16,r17
	breq	exnextTRACK_exit	
exnextTRACK_2:	
	ldi	r16,3
	sts	playcontrol_status,r16
	call	play_control
	call	readipod_no_save
	call	display_playinfo
	ldi	r16,0
	sts	dis_leixing,r16
exnextTRACK_exit:
	rjmp	main	
	
;===================================================右键第一级
second_right_program:	
	sbis	pinb,next_track_key
	rjmp	second_right_program
;-----------------------------------------------
	lds	r16,first_status
	cpi	r16,1
	brne	second_right_program_1
	lds	r16,repeat_status
	rjmp	second_right_program_2
second_right_program_1:
	lds	r16,shuffle_status
second_right_program_2:
	cpi	r16,2
	brne	second_right_program_3
	ldi	r16,0
	rjmp	second_right_program_4
second_right_program_3:
	inc	r16
second_right_program_4:
	lds	r17,first_status
	cpi	r17,1
	brne	second_right_program_5
	STS	repeat_status,r16
	rjmp	second_right_program_6
second_right_program_5:
	sts	shuffle_status,r16
second_right_program_6:
	call	dis_set_model	
	rjmp	main			
;;******************************************************main program end
        
;******************************************************sub program start   代写
;=============================================

frequency_mius:
	;clc
	lds		r16,frequency_lo
	subi		r16,1
	sts		frequency_lo,r16
	lds		r16,frequency_hi
	ldi		r17,0
	sbc		r16,r17
	sts		frequency_hi,r16
	lds		r17,frequency_lo
	subi		r17,0x6b
	sbci		r16,0x03
	brcc		frequency_mius_1
	ldi		r16,0x04
	sts		frequency_hi,r16
	ldi		r16,0x38
	sts		frequency_lo,r16
frequency_mius_1:
	ret	
;------------------------------------------
frequency_add:
         ;   clc  
	lds		r16,frequency_lo 
	ldi		r17,1
	add		r16,r17
	sts		frequency_lo,r16
	lds		r16,frequency_hi
	ldi		r17,0
        adc		r16,r17
        sts		frequency_hi,r16
        lds		r17,frequency_lo
        subi		r17,0x39
        sbci		r16,0x04
        brcs		frequency_add_1	
        ldi		r16,0x03
        sts		frequency_hi,r16
        ldi		r16,0x6b
        sts		frequency_lo,r16					
frequency_add_1:
	ret        
;===================================================
EEPROM_WRITE:
	sbic	eecr,eewe
	rjmp	EEPROM_WRITE
	ldi	r16,0
	out	eearh,r16
	lds	r16,eepromaddr_hi 
	out	eearl,r16
	lds	r16,eepromdata_hi
	out	eedr,r16
	sbi	eecr,eemwe
	sbi	eecr,eewe
EEPROM_WRITE_1:
	sbic	eecr,eewe
	rjmp	EEPROM_WRITE_1
	ldi	r16,0
	out	eearh,r16
	lds	r16, eepromaddr_hi
	inc	r16
	out	eearl,r16
	lds	r16,eepromdata_lo
	out	eedr,r16
	sbi	eecr,eemwe
	sbi	eecr,eewe
	ret
;---------------------------------------------------	
EEPROM_read:
	sbic	eecr,eewe
	rjmp	EEPROM_read
	ldi	r16,0
	out	eearh,r16
	lds	r16,eepromaddr_hi 
	out	eearl,r16
	sbi	eecr,eere
	in	r16,eedr
	sts	eepromdata_hi,r16
EEPROM_read_1:
	sbic	eecr,eewe
	rjmp	EEPROM_read_1
	ldi	r16,0
	out	eearh,r16
	lds	r16,eepromaddr_hi
	inc	r16
	out	eearl,r16
	sbi	eecr,eere
	in	r16,eedr
	sts	eepromdata_lo,r16
	ret
;;;-----------------------------------------send data to 5767


radio_mute:
	call	dly
	call	start		
        ldi    r16,0x0c0
	call	shout				
	lds	r16, senddata	
	ori	r16,0x80
	call	shout				
	lds	r16,senddata+1	
	call	shout				
	lds	r16,senddata+2	  
	call	shout		  	  
	lds	r16,senddata+3	  	
	call	shout		  			  	
	lds	r16,senddata+4	  
	call	shout		  	  
	call	stop
	ret

;----------------------------------------------
send5767:                  
	lds	r16, senddata
	andi	r16,0x3f    
	sts	senddata,r16
searsend5767:
	call	dly
	call	start		
        ldi    r16,0x0c0
	call	shout				
	lds	r16, senddata	
	;andi	r16,0x3f
	call	shout				
	lds	r16,senddata+1	
	call	shout				
	lds	r16,senddata+2	  
	call	shout		  	  
	lds	r16,senddata+3	  	
	call	shout		  			  	
	lds	r16,senddata+4	  
	call	shout		  	  
	call	stop
	ret
;----------------------------------------------

read5767:
	call	dly
	call	start		
    ldi     r16,0x0c1
	call	shout				
	call	I2CReceiveByte		
	call	ack				
	sts	readdata,r16
	call	I2CReceiveByte		
	call	ack				
	sts	readdata+1,r16
		
	call	I2CReceiveByte		
	call	ack				
	sts	readdata+2,r16
		
	call	I2CReceiveByte		
	call	ack				
	sts	readdata+3,r16
		
	call	I2CReceiveByte		
	call	ack				
	sts		readdata+4,r16
	call	stop
	ret
;========================================
I2CReceiveByte:
	cbi	ddrc,sda
	call	dly
	ldi	r17,8
	sbi	portc,sda	;SDA=1;
	ldi	r16,0
I2CReceiveByte_0:
	cbi	portc,scl;SCL=0;
	call	dly	;I2CWait();
	sbi	portc,scl;	SCL=1;
	call	dly	;	I2CWait();	   //从高位开始 ddata|=SDA;ddata<<=1
	sbic	pinc,sda;	if(SDA)
	rjmp	I2CReceiveByte_1
	clc
	rjmp	I2CReceiveByte_2
I2CReceiveByte_1:
	sec
I2CReceiveByte_2:
	rol	r16
	dec	r17
	brne	I2CReceiveByte_0
	cbi	portc,scl
	sbi	ddrc,sda
	ret
;==========================================================================
start:
	sbi	portc,SDA
	sbi	portc,SCL
	call	dly		;nop		; enforce setup delay and cycle delay
	cbi	portc,SDA	;clr	sda
	call	dly		;	nop			; enforce hold delay
	cbi	portc,scl	;clr	SCL
	ret
;---------------------------------------------------------

stop:
	cbi	portc,sda	;clr	SDA
	call	dly	;		nop
	sbi	portc,scl	;setb	SCL
	call	dly	;	nop			; enforce setup delay
	sbi	portc,sda	;setb	SDA
	ret

;--------------------------------------------------------
shout:
	ldi	r17,8
x42:
	rol	r16		;rlc	a		; move bit into CY
	brcs	x42_0
	cbi	portc,sda
	rjmp	x42_1
x42_0:
	sbi	portc,sda
x42_1:
	call	dly		
	sbi	portc,scl	;setb	SCL		; raise clock
	call	dly

⌨️ 快捷键说明

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