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

📄 example.asm

📁 i2c通信协议及程序。适合各种有需要的相关人士.
💻 ASM
字号:
;用LPC932模拟24WC02
;用其硬件I2C从工作方式模拟,从地址为0A0H,存储器地址00H--2FH(48字节)
;可字节写/连续字节写操作

;定义LPC932的I2C相关寄存器的定义
I2ADR	DATA	0DBH
I2DAT	DATA	0DAH		
I2CON	DATA	0D8H
I2STAT	DATA	0D9H
I2SCLH	DATA	0DDH
I2SCLL	DATA	0DCH
SI	BIT	I2CON.3
IEN1	DATA	0E8H
EI2C	BIT	IEN1.0

;定义LPC932的部分特殊寄存器
TRIM	DATA	96H	
DIVM	DATA	95H	  ;CPU分频设置寄存器
P1M1	DATA	91H
P1M2	DATA	92H


WRSLA      EQU   60H  	;写从器件的总线状态字(进入此状态后用RCVBYTE取总线数据)
RDSLA      EQU   0A8H  	;读从器件的总线状态字(进入此状态后用SENDBYTE发送数据)
CSI24WC02  EQU   0A0H 	;定义器件从地址

EEPROM  EQU  30H        ;存储器映象区30H--5FH  (对应于00H-2FH)
ACK     BIT  00H       	;定义标志位


	;程序开始
	ORG    	0000H
	AJMP   	MAIN

	;I2C总线中断入口
	ORG    	0033H
	AJMP   	I2C_INT



;主程序MAIN
;进行系统的初始化
	ORG     0080H
MAIN:  
       	MOV	DIVM,#2
       	MOV	R7,#0
	DJNZ	R7,$
	;由于上电复位时所用IO口设置为高阻态,所以要进行IO设置
	MOV	P1M1,#2CH
	MOV	P1M2,#0CH

        MOV    	R0,#00H     	;R0设为存储器指针,初化为00H
        SETB   	EI2C         	;开I2C中断
        SETB   	EA
        MOV    	A,#CSI24WC02
        LCALL  	SETBUS      	;初始化总线,设置器件从地址
        SJMP   	$           	;等待中断
        
    


   
;I2C中断处理程序 
;接收到对本器件操作的寻址信号时,进入中断        
I2C_INT:   
        	MOV   	A,I2STAT      	;取总线状态字
        	CJNE  	A,#WRSLA,NEXT_L1;判断寻址方式
;写从机方式        
WRSLA_C:	LCALL 	RCVBYTE        	;取器件子地址         
        	JNB   	ACK,EXT_INT
        	MOV   	R0,A           	;取得的地址放入地址指针寄存器       
WRSLA_L1:	MOV   	A,R0          	;判断地址是否大于2FH
         	CLR   	C
         	SUBB  	A,#30H            
         	JC    	WRSLA_L2       	;R0小于30H时CY会为1
         	MOV   	R0,#00H         ;若地址超出则设置地址为00H          
         
WRSLA_L2:	MOV   	A,R0           	;指针调整
         	ADD   	A,#30H
         	MOV   	R1,A
         	LCALL 	RCVBYTE       	;接收数据并发送应答位
         	JNB   	ACK,EXT_INT    	;若接收到结束/重启信号则退出
         	MOV   	@R1,A          	;保存数据
         	INC   	R0             	;指针自增
         	SJMP  	WRSLA_L1         
          
                                 
NEXT_L1:	CJNE  	A,#RDSLA,EXT_INT
;读从机方式        
RDSLA_C: 	MOV   	A,R0         	;判断输入地址是否大于2FH
         	CLR   	C
         	SUBB  	A,#30H            
         	JC    	RDSLA_L1
         	MOV   	R0,#00H       	;若是则设置地址为00H                            

RDSLA_L1:	MOV   	A,R0         	;指针调整
         	ADD   	A,#30H
         	MOV   	R1,A
         	MOV   	A,@R1         	;取出数据
         	LCALL 	SENDBYTE      	;发送数据
         	JNB   	ACK,EXT_INT   	;若接收到非应答信号,退出
         	INC   	R0            	;指针自增
         	SJMP  	RDSLA_C

EXT_INT:	RETI        
        
$INCLUDE(HI2Csla_ASM.INC) 
          
		END

⌨️ 快捷键说明

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