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

📄 iic_pro.dt

📁 FM发射器的源代码,义隆MCU+三洋发射IC,LV2280方案.可实现睡眠,省电,发射频率88MHZ~108MHZ.
💻 DT
字号:
;************************************************************
;*  Tilte: IIC function for EM78x447                        *
;*  Description: IICaddress,IICdata is eeprom               *
;                xtal 4Mhz,4clock,enable watchdog           *
;*  Company:     Elan microelectronics (sz) ltd.            *
;*  Author:      HongXi.Tang                                *
;*  Date:        13/05/2005                                 *
;*  Version:     v1.0                                       *
;************************************************************

include "EM78P447.inc"
include "clrEM78RamBank.inc"

;================================
i2port		==	0x06
scl	==	7
sda	==	6
wrcfg	==	10111111b	  ;eeprom write tri-state value
rdcfg	==	01000000b	  ;eeprom read tri-state value
;================================
IICaddress 	==	0x08	
IICdata		==	0x09
tmp1		==	0x0a
tmp2		==	0x0b
IIC_Hi	==	0x0c
IIC_Lw	==	0x0d
cnt_hi	==	0x0e
cnt_lw	==	0x0f
;================================

	org	0000h
reset:
	jmp	start
	
	org	0010h
Led_dis:
	tbl
	retl	0b11000000		;"0"
	retl	0b11111001		;"1"
	retl	0b10100100		;"2"
	retl	0b10110000		;"3"
	retl	0b10011001		;"4"
	retl	0b10010010		;"5"
	retl	0b10000010		;"6"
	retl	0b11111000		;"7"
	retl	0b10000000		;"8"
	retl	0b10010000		;"9"
;================================
;*以下是对IIC总线的操作子程序*
;*********启动总线***********************************
;The START condition precedes all commands to the   *
;devices and is defined as a HIGH to LOW transition *
;of SDA when SCL is HIGH.						   *
;scl	____/~~~~\__								*
;sda	__/~~~\____								 *
;****************************************************
IICStart:
	bc	i2port,scl
	bs	i2port,sda
	bs	i2port,scl
	jmp	$+1
	bc	i2port,sda
	jmp	$+1
	bc	i2port,scl
	ret
;*********停止IIC总线********************************
;The STOP condition is defined as a LOW to HIGH     *
;transition of SDA when SCL is HIGH.				*
;scl	____/~~~~								   *
;sda	______/~~								   *	
;****************************************************
IICStop:
	bc	i2port,scl
	bc	i2port,sda
	jmp	$+1
	bs	i2port,scl
	jmp	$+1
	bs	i2port,sda
	ret
;********检查应答位**********************************
;After a successful data transfer, each receiving   *
;device is required to generate an acknowledge.     *
;The Acknowledging device pulls down the SDA line.  *
;****************************************************
IICRecAck:
	ior	i2port
	or	a,@rdcfg
	iow	i2port
		
	bs	i2port,scl
	jmp	$+1	
	jbc	i2port,sda
	jmp	$-1
	bc	i2port,scl
	jmp	$+1
	
	ior	i2port
	and	a,@wrcfg
	iow	i2port
	ret
;************************************
;**********不对IIC总线产生应答*******
;************************************
IICNoAck:
	bc	i2port,scl
	jmp	$+1
	bs	i2port,sda
	jmp	$+1
	bs	i2port,scl
	jmp	$+1
	bc	i2port,scl
	ret
;**********************************
;*********向IIC总线写数据**********
;**********************************
IICSendByte:
	mov	tmp2,a
	mov	a,@8
	mov	tmp1,a
send_b:	
	rlc	tmp2
	jbc	STATUS,C
	jmp	send_1
	bc	i2port,sda
	jmp	s_ret
send_1:
	bs	i2port,sda
	jmp	$+1
s_ret:
	bs	i2port,scl
	jmp	$+1
	bc	i2port,scl
	jmp	$+1
	djz	tmp1
	jmp	send_b
	ret
;*********************************
;****从IIC总线上读数据子程序******
;*********************************
IICReceiveByte:
	mov	a,@8
	mov	tmp1,a
	clr	tmp2
	
	ior	i2port
	or	a,@rdcfg
	iow	i2port
rece_b:
	bs	i2port,scl
	jmp	$+1
	jbc	i2port,sda
	jmp	rece_1
	bc	STATUS,C
	jmp	r_ret
rece_1:
	bs	STATUS,C
	jmp	$+1
r_ret:
	bc	i2port,scl	
	jmp	$+1
	rlc	tmp2	
	djz	tmp1
	jmp	rece_b
	
	ior	i2port
	and	a,@wrcfg
	iow	i2port
	ret
;=================================
WriteChar:
	mov	a,@0xa0
	call	IICStart
	call	IICSendByte	
	call	IICRecAck
		
	mov 	a,IICaddress
	call	IICSendByte	
	call	IICRecAck
	
	mov     a,IICdata
	call	IICSendByte	
	call	IICRecAck
	
	call	IICStop
	call	delay_5ms	
	ret
;=================================
ReadChar:
	mov	a,@0xa0
	call	IICStart
	call	IICSendByte	
	call	IICRecAck
	
	mov	 a,IICaddress
	call	IICSendByte
	call	IICRecAck

	mov	 a,@0xa1
	call	IICStart
	call	IICSendByte
	call	IICRecAck
	
	call	IICReceiveByte
	call	IICNoAck
	call	IICStop
	ret
;=================================
delay_5ms:
	mov	a,@5
	mov	tmp2,a
dly_1ms:
	mov	a,@250
	mov	tmp1,a
dly_4us:	
	wdtc				;1
	djz	tmp1		 ;1 			
	jmp	dly_4us	  ;2	
	djz	tmp2
	jmp	dly_1ms
	ret
;=================================
tst_rtcc:
	wdtc
	jbs	tcc,7		;32ms
	ret
	bc	tcc,7
	inc	cnt_lw
	jbc	status,z
	inc	cnt_hi		
	ret		
;=================================
start:
	m447ClrRamBank		;clear all ram
;System_init
	mov	a,@7
	contw
	clr	R5
	mov	a,@0
	iow	IOC5			;P5 port is output
	mov	a,@0xff
	mov	R6,a			
	mov	a,@0x3f		 ;P6 port is input
	iow	IOC6
	mov	a,@0xff
	mov	R7,a
	mov	a,@0			;P7 port is output
	iow	IOC7
	mov	a,@0xff		;disable P6 wake up function
	iow	IOCB
	mov	a,@0xb7		;disable P74~5 wake up function,disable P76~7 open drain,enable wdt
	iow	IOCE
	mov	a,@0xf6		;mask all interrpt
	iow	IOCF
	disi
	wdtc
	
	mov	a,0
	mov	IICaddress,a
	call	ReadChar
	mov	a,tmp2
	mov	IIC_Lw,a
	
	inc	IICaddress
	call	ReadChar
	mov	a,tmp2
	mov	IIC_Hi,a

	mov	a,IIC_Lw
	sub	a,@0x99
	jbc	status,c
	jmp	comp_hi_data
	clr	IIC_Lw
	clr	IIC_Hi
	jmp	pro_key_or_dis
comp_hi_data:
	mov	a,IIC_Hi
	sub	a,@0x99
	jbc	status,c
	jmp	pro_key_or_dis
	clr	IIC_Hi	
pro_key_or_dis:				;keyscan
	jbs	port6,0
	jmp	IIC_Value_inc
	jbs	port6,1
	jmp	IIC_Value_dec		
dis_data_pro		:		;display function	
	mov	a,IIC_Hi
	jbs	status,z
	jmp	execute_hi_dis
	mov	a,IIC_Lw
	and	a,@0xf0
	jbs	status,z
	jmp	execute_lw_dis
dis_lw_down:
	mov	a,IIC_Lw
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x10
	mov	port5,a
	call	delay_5ms
	jmp	pro_key_or_dis
execute_hi_dis:
	mov	a,IIC_Hi
	and	a,@0xf0
	jbc	status,z
	jmp	execute_hi_next
	swapa	IIC_Hi
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x80
	mov	port5,a
	call	delay_5ms
execute_hi_next:
	mov	a,IIC_Hi
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x40
	mov	port5,a
	call	delay_5ms
execute_lw_dis:
dis_lw_up:	
	swapa	IIC_Lw
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x20
	mov	port5,a
	call	delay_5ms
	jmp	dis_lw_down

IIC_Value_inc:
idis_data_pro:	
	mov	a,IIC_Hi
	jbs	status,z
	jmp	iexecute_hi_dis
	mov	a,IIC_Lw
	and	a,@0xf0
	jbs	status,z
	jmp	iexecute_lw_dis
idis_lw_down:
	mov	a,IIC_Lw
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x10
	mov	port5,a
	call	delay_5ms
	jmp	iexit_dis
iexecute_hi_dis:
	mov	a,IIC_Hi
	and	a,@0xf0
	jbc	status,z
	jmp	iexecute_hi_next
	swapa	IIC_Hi
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x80
	mov	port5,a
	call	delay_5ms
iexecute_hi_next:
	mov	a,IIC_Hi
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x40
	mov	port5,a
	call	delay_5ms
	jmp	idis_lw_up
iexecute_lw_dis:
idis_lw_up:	
	swapa	IIC_Lw
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x20
	mov	port5,a
	call	delay_5ms
	jmp	idis_lw_down
iexit_dis:
	call	tst_rtcc
	jbc	port6,0
	jmp	enter_inc1

	jbs	cnt_hi,0	;8s	timer >8s is del 93c46 function
	jmp	IIC_Value_inc
erase_24c08:
	bc	cnt_hi,0

	clr	IICdata
	clr	IICaddress
	call	WriteChar
	inc	IICaddress
	call	WriteChar
		
	wdtc
	jbs	port6,0
	jmp	$-2
	jmp	start
enter_inc1:
	clr	cnt_lw
	clr	cnt_hi
	mov	a,IIC_Lw
	add	a,@1
	daa
	mov	IIC_Lw,a
	jbs	status,c
	jmp	save_value_to_24c08
	mov	a,IIC_Hi
	add	a,@1
	daa
	mov	IIC_Hi,a
save_value_to_24c08:	
	clr	IICaddress
	mov	a,IIC_Lw
	mov	IICdata,a
	call	WriteChar
	
	call	ReadChar
	mov	a,tmp2
	xor	a,IIC_Lw
	jbs	status,z
	jmp	start
	
	inc	IICaddress
	mov	a,IIC_Hi
	mov	IICdata,a
	call	WriteChar
	
	call	ReadChar
	mov	a,tmp2
	xor	a,IIC_Hi
	jbs	status,z
	jmp	start
	jmp	dis_data_pro
IIC_Value_dec:
sdis_data_pro:	
	mov	a,IIC_Hi
	jbs	status,z
	jmp	sexecute_hi_dis
	mov	a,IIC_Lw
	and	a,@0xf0
	jbs	status,z
	jmp	sexecute_lw_dis
sdis_lw_down:
	mov	a,IIC_Lw
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x10
	mov	port5,a
	call	delay_5ms
	jmp	sexit_dis
sexecute_hi_dis:
	mov	a,IIC_Hi
	and	a,@0xf0
	jbc	status,z
	jmp	sexecute_hi_next
	swapa	IIC_Hi
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x80
	mov	port5,a
	call	delay_5ms
sexecute_hi_next:
	mov	a,IIC_Hi
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x40
	mov	port5,a
	call	delay_5ms
;	jmp	sdis_lw_up
sexecute_lw_dis:
sdis_lw_up:	
	swapa	IIC_Lw
	and	a,@0x0f
	call	Led_dis
	mov	port7,a
	mov	a,@0x20
	mov	port5,a
	call	delay_5ms
	jmp	sdis_lw_down
sexit_dis:
	call	tst_rtcc
	jbc	port6,1
	jmp	enter_dec1
	jmp	IIC_Value_dec
enter_dec1:
	mov	a,@1
	sub	IIC_Lw,a
	jbc	status,c
	jmp	pro_lw_data
	mov	a,@0x99
	mov	IIC_Lw,a
	mov	a,@1
	sub	IIC_Hi,a
	jbc	status,c
	jmp	pro_hi_data
	mov	a,@0x99
	mov	IIC_Hi,a
	jmp	save_value_to_24c08
pro_lw_data:
	mov	a,IIC_Lw
	and	a,@0x0f
	xor	a,@0x0f
	jbs	status,z
	jmp	save_value_to_24c08
	mov	a,@6
	sub	IIC_Lw,a
	jmp	save_value_to_24c08
pro_hi_data:
	mov	a,IIC_Hi
	and	a,@0x0f
	xor	a,@0x0f
	jbs	status,z
	jmp	save_value_to_24c08
	mov	a,@6
	sub	IIC_Hi,a
	jmp	save_value_to_24c08

	org	0fffh
	jmp	reset
	end

⌨️ 快捷键说明

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