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

📄 i2c.asm

📁 i2c通信汇编程序
💻 ASM
字号:
eeprom   .section   'data'
 	scl			equ		pa.3		;定义pa.3为时钟脚   pa--I/O寄存器
 	scl_c			equ		pac.3
 	sda			equ		pa.1		;定义pa.1为数据脚   pac--I/O控制寄存器  输入相应位置一,否
    	sda_c			equ		pac.1                                                    ;则清零
 	read_out		equ		[70h]		;读出数据暂存器
 	write_in		equ		[71h]		;写入数据暂存器
	word_address		equ		[72h]		;读写地址暂存器
	data_8			equ		[73h]
	delay_5			equ		[77h]
	delay			equ		[78h]
eepromc   .section  'code'
	org	00h
	jmp	start
	org	020h
start:     	
	mov	a,55h
	mov	write_in,a		;写入55H
	mov	a,14h			;写入14H为要操作的eeprom的地址00010100
	mov	word_address,a
write_data:	
	bc	sda_c
	bc	scl_c
           	
	bs	p6,sda
	bs	p6,scl
	bc	p6,sda                   	;起始信号
	bc	p6,scl
           	
	bs	p6,sda                   	;1
	bs	p6,scl
	bc	p6,scl
           	
	bc	p6,sda                   	;0
	bs	p6,scl
	bc	p6,scl
           	
	bs	p6,sda                   	;1
	bs	p6,scl
	bc	p6,scl	
           	
	bc	p6,sda                   	;0
	bs	p6,scl
	bc	p6,scl
           	
	bc	p6,sda                   	;a2,a1,a0=000
	bs	p6,scl                          ;0
	bc	p6,scl
           	
	bs	p6,scl                          ;0   1-->0
	bc	p6,scl	
           	
	bs	p6,scl                          ;0
	bc	p6,scl
           	
	bs	p6,scl                   	;写0,设定为写入模式
	bc	p6,scl
           	
	bs	sda_c
	bs	p6,scl
wait_ack: 
 	
	jbc 	p6,sda                   	;等待应答信号
	jmp	wait_ack
	bc	p6,scl
	bc	sda_c
	mov	a,08h                	        ;设传输数据长度8
	mov	data_8,a
random_write:
	bc	p6,sda
	jbc 	word_address,7
	bs	p6,sda
	bs	p6,scl
	bc	p6,scl
	   	
	rlc 	word_address
	djz	data_8
	jmp	random_write
	bs	sda_c
	bs	p6,scl
	
fdev:
	jbc 	p6,sda                   	;等待应答信号
	jmp	fdev
	bc	p6,scl
	bc	sda_c
	mov	a,08h
	mov	data_8,a
dtat_in:   	
	bc	p6,sda
	jbc	write_in,7
	bs	p6,sda
	bs	p6,scl
	bc	p6,scl
	rlc 	write_in
	djz	data_8
	jmp	dtat_in

	bs	p6,scl
	bc	p6,scl
           	
	bc	p6,sda
	bs	p6,scl
	bs	p6,sda			;停止信号
           	
	mov	a,30h
	mov	delay_5,a
	mov	a,05h
	mov	delay,a
delay1:    	
	djz	delay_5
	jmp	delay1
	djz	delay
	jmp	delay1


;_______________________________
;读
do_read:
	clr	read_out
	bc	sda_c
	bc	scl_c
           	
	bs	p6,sda
	bs	p6,scl														
	bc	p6,sda			;起始信号
           	
	bc	p6,scl
	bs	p6,sda			;1
	bs	p6,scl
	bc	p6,scl
           	
	bc	p6,sda			;0
	bs	p6,scl
	bc	p6,scl
           	
	bs	p6,sda			;1
	bs	p6,scl
	bc	p6,scl
           	
	bc	p6,sda			;0
	bs	p6,scl
	bc	p6,scl

	bc	p6,sda
	bs	p6,scl			;a0,a1,a2=0
	bc	p6,scl
           	
	bs	p6,scl			;0
	bc	p6,scl
           	
	bs	p6,scl			;0
	bc	p6,scl
           	
	bc	p6,sda			;写模式,写地址
	bs	p6,scl
	bc	p6,scl
           	
	bs	sda_c
	bs	p6,scl
           	
wait:      	
	jbc 	p6,sda
	jmp	wait
	bc	p6,scl
	mov	a,08h
	mov	data_8,a
	bc	sda_c
read_address_in:
	bc	p6,sda
	jbc 	word_address,7
	bs	p6,sda
	bs	p6,scl
           	
	bc	p6,scl
	rlc 	word_address
	djz	data_8
	jmp	read_address_in

	bs	sda_c	
	bs	p6,scl
           	
ack:       	
	jbc 	p6,sda
	jmp	ack
	cbc	p6,scl
	bc	sda_c

read_data:
	bs	p6,sda
	bs	p6,scl
	bc	p6,sda			;start bit
	bc	p6,scl
           	
	bs	p6,sda			;1
	bs	p6,scl
	bc	p6,scl
           	
	bc	p6,sda			;0
	bs	p6,scl
	bc	p6,scl
           	
	bs	p6,sda			;1
	bs	p6,scl
	bc	p6,scl	
           	
	bc	p6,sda			;0
	bs	p6,scl
	bc	p6,scl

	bc	p6,sda			;a2,a1,a0
	bs	p6,scl
	bc	p6,scl
           	
	bs	p6,scl
	bc	p6,scl
           	
	bs	p6,scl
	bc	p6,scl
           	
	bs	p6,sda			;读模式
	bs	p6,scl
	bc	p6,scl
           	
	bs	sda_c
	;set	scl
w_ack:
	jbc	p6,sda
	jmp     w_ack
	;clr	scl

	bs	p6,scl			;down_edge data out
	mov	a,08h
	mov	data_8,a
	bs	sda_c
random_out:
	bs	p6,scl
	call 	del
	bc	p6,scl 	
	call 	del
	rlc	read_out
	bc	read_out.0
	jbc	sda
	bs	read_out.0
	djz	data_8
	jmp     random_out
	mov	a,read_out		;modify
	mov	[41h],a			;modify
	bc	sda_c			;for stop
	bs	p6,scl
	bs	p6,sda
	bc	p6,scl
	bc	p6,sda
	bs	p6,sda			;stop end
           	
	mov	a,055h
	xor	a,read_out
	;sz 	acc
        jbc     stts,z
	jmp	fail_out
	jmp	OK_end
           	
fail_out:  	
	ret
ok_end:    	
	ret

del:                   ;for delay
	nop
	nop
	nop
ret




;更改:在读取数据时应该从低位存入,逐次左移
;注意:读取操作的时钟频率不应该太高
;在演示中系统时钟频率为1.5MHz,如果系统时钟频率比较高的话,
;则应该加上延时操作,否则会出现读取数据错误.
;在HT48R30A-1上通过

⌨️ 快捷键说明

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