📄 example.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 + -