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

📄 i2c2.asm

📁 是我在电子竞赛期间写的一些单片机汇编程序
💻 ASM
字号:
;2402的读写 
;AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,
;具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。 
;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序

	ORG 0000H
	SCL BIT P3.4;定义24C02的串行时钟线
	SDA BIT P3.5;定义24C02的串行数据线
	
	LJMP START
START:  LCALL STAR;调用
	MOV R2,#08H;一个数据有8位
	MOV DPTR,#0600H;定义源数据的位置
LOOP:	MOV A,#00H
	MOVC A,@A+DPTR
	LCALL SDATA
	LCALL ACK
	JC LOOP
	INC DPTR
	DJNZ R2,LOOP
	LCALL STOP;调用停止子程序

STAR:	SETB SDA
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	CLR SDA
	NOP
	NOP
	NOP
	NOP
	CLR SCL
	RET
SDATA:	MOV R0,#08H
LOOP0:	RLC A
	MOV SDA,C
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	CLR SCL
	DJNZ R0,LOOP0
	RET
ACK:	SETB SDA
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	MOV C,SDA
	CLR SCL
	RET
STOP:	CLR SDA
	NOP
	NOP
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	SETB SDA
	NOP
	NOP
	NOP
	NOP
	RET
	ORG 0600H
	DB 0A0H,10H,01H,02H,03H,04H,05H,06H
END


;读写子程序如下:

;写串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
EEPW:	MOV P1,#0FFH

  	CLR  P1.0  ;发开始信号
	MOV  A,R3  ;送器件地址
	ACALL  SUBS
	MOV  A,R4  ;送片内字节地址
	ACALL SUBS
AGAIN:  MOV A,@R1
	ACALL SUBS ;调发送单字节子程序INC   R1
  	DJNZ  R7,AGAIN;连续写n个字节
  	CLR    P1.0  ;SDA置0, 准备送停止信号
  	ACALL DELAY ;延时以满足传输速率要求
  	SETB   P1.1  ;发停止信号
  	ACALL DELAY
  	SETB   P1.0
  	RET

SUBS: 	MOV R0,#08H ;发送单字节子程序
LOOP: 	CLR P1.1
  	RLC  A
  	MOV  P1.0,C
  	NOP
  	SETB P1.1
  	ACALL DELAY
  	DJNZ R0,LOOP ;循环8次送8个bit
  	CLR  P1.1
  	ACALL DELAY
  	SETB P1.1
REP: 	MOV C,P1.0
  	JC  REP  ;判应答到否,未到则等待
  	CLR  P1.1
  	RET

DELAY: 	NOP
  	NOP
  	RET

;读串行E2PROM子程序EEPR
;(R1)=欲读数据存放地址指针
;; R3=10100001(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
;(R4)=片内字节地址
;(R7)=连续读字节数
;

EEPR: 	MOV P1,#0FFH
  	CLR  P1.0  ;发开始信号
  	MOV  A,R3  ;送器件地址
  	ACALL SUBS   ;调发送单字节子程序
  	MOV A,R4   ;送片内字节地址
  	ACALL SUBS
  	MOV P1,#0FFH
  	CLR P1.0   ;再发开始信号
  	MOV A,R3
  	SETB ACC.0  ;发读命令
  	ACALL SUBS
MORE: 	ACALL SUBR
  	MOV @R1,A
  	INC R1
  	DJNZ R7,MORE
  	CLR P1.0
  	ACALL DELAY
  	SETB P1.1
  	ACALL DELAY
  	SETB P1.0 ;送停止信号
  	RET

SUBR: 	MOV  R0,#08H 		;接受单字节子程序
LOOP2: 	SETB  P1.1
  	ACALL DELAY
  	MOV C,P1.0
  	RLC A
  	CLR P1.1
  	ACALL DELAY
  	DJNZ R0,LOOP2
  	CJNE R7,#01H,LOW
  	SETB P1.0  		;若是最后一个字节置A=1
  	AJMP SETOK
LOW: 	CLR P1.0 	 	;否则置A=0
SETOK: 	ACALL DELAY
  	SETB  P1.1		
  	ACALL DELAY
  	CLR  P1.1
  	ACALL DELAY
  	SETB P1.0  ;应答毕,SDA置1
  	RET

; 程序中多处调用了DELAY子程序(仅两条NOP指令),
;这是为了满足I2C总线上数据传送速率的要求,
;只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。
;另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。 

⌨️ 快捷键说明

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