📄 i2c.asm
字号:
;--------------------------------------------------
;程序功能:将单片机内部数据存储器中30H-3FH中的数据写入24C04中
; 30H开始的16个连续存储单元中;从24C04中30H-3F中读取数据
; 存储到单片机中从40H开始的16个存储单元中,并显示读出的值
;入口参数:写操作:单片机内部数据存储器中30H-3FH中的数据 读操作:24C04中30H-3FH
;出口参数:写操作:24C04中30H-3FH 读操作:单片机内部数据存储器40H-4FH
;程序编写:zqp
;创建时间:2007-8-11
;联系方式:QQ:30871641
;修改日志:
; NO.1:增加数码管数据显示子程序 2007-8-18
; NO.2: MOV NUMBYTE,#8 24C04只能连续写入8个字节? 2007-8-19
;---------------------------------------------------
ACK BIT 10H ;应答标志位
SLA DATA 50H ;器件地址字
SUBA DATA 51H ;器件子地址
NUMBYTE DATA 52H ;读/写字节数
SDA BIT P1.5
SCL BIT P1.4 ;I2C总线定义
MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
MRD EQU 40H ;接收数据缓存区首地址(40H-4FH)
;显示缓冲区定义
displaybuf0 EQU 70H
displaybuf1 EQU 71H
displaybuf2 EQU 72H
displaybuf3 EQU 73H
displaybuf4 EQU 74H
displaybuf5 EQU 75H
AJMP MAIN
ORG 80H
;--------------------------------------------------
;程序名称:IWRNBYTE
;程序功能:向器件指定子地址写N个数据
;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
;出口参数:
;---------------------------------------------------
IWRNBYTE:
MOV R3,NUMBYTE ;发送字节数NUMBYTE
LCALL START ;启动总线
MOV A,SLA ;器件地址字SLA
LCALL WRBYTE ;发送器件地址字
LCALL CACK
JNB ACK,RETWRN ;无应答则退出
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYTE ;开始写入数据
LCALL CACK
JNB ACK,IWRNBYTE
INC R1
DJNZ R3,WRDA ;判断是否写完
RETWRN: LCALL STOP
RET
;--------------------------------------------------
;程序名称:IRDNBYTE
;程序功能:从器件指定子地址读取N个数据
;入口参数:器件地址字SLA,子地址SUBA,接收字节数NUMBYTE
;出口参数:接收数据缓存区MRD
;---------------------------------------------------
IRDNBYTE:
MOV R3,NUMBYTE
LCALL START
MOV A,SLA
LCALL WRBYTE ;发送器件地址字
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
LCALL START ;重新启动总线
MOV A,SLA
INC A ;准备进行读操作
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE
MOV R1,#MRD
RON1: LCALL RDBYTE ;读操作开始
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK ;最后一字节发非应答位
RETRDN: LCALL STOP
RET
SACK: LCALL MACK
INC R1
SJMP RON1
;--------------------------------------------------
;程序名称:START
;程序功能:启动I2C总线子程序—发送I2C总线起始条件
;入口参数:
;出口参数:
;---------------------------------------------------
START: SETB SDA ;发送起始条件数据信号
NOP ;起始条件建立时间大于4.7us
SETB SCL ;发送起始条件的时钟信号
NOP
NOP
NOP
NOP
NOP ;起始条件锁定时间大于4.7us
CLR SDA ;发送起始信号
NOP
NOP
NOP
NOP ;起始条件锁定时间大于4.7us
CLR SCL ;钳住I2C总线,准备发送或接收数据
NOP
RET
;--------------------------------------------------
;程序名称:STOP
;程序功能:停止I2C总线子程序—发送I2C总线停止条件
;入口参数:
;出口参数:
;---------------------------------------------------
STOP: CLR SDA ;发送停止条件的数据信号
NOP
NOP
SETB SCL ;发送停止条件的时钟信号
NOP
NOP
NOP
NOP
NOP ;起始条件建立时间大于4.7us
SETB SDA ;发送I2C总线停止信号
NOP
NOP
NOP
NOP
NOP ;延迟时间大于4.7us
RET
;--------------------------------------------------
;程序名称:MACK
;程序功能:发送应答信号子程序
;入口参数:
;出口参数:
;---------------------------------------------------
MACK: CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP ;保持数据时间,大于4.7us
CLR SCL
NOP
NOP
RET
;--------------------------------------------------
;程序名称:MNACK
;程序功能:发送非应答信号子程序
;入口参数:
;出口参数:
;---------------------------------------------------
MNACK: SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL ;保持数据时间,大于4.7us
NOP
NOP
RET
;--------------------------------------------------
;程序名称:CACK
;程序功能:检查应答位子程序
;入口参数:
;出口参数:ACK=1时表示有应答
;---------------------------------------------------
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判断应答位
CEND: NOP
CLR SCL
NOP
RET
;--------------------------------------------------
;程序名称:WRBYTE
;程序功能:发送字节子程序
;入口参数:字节数据放入ACC
;出口参数:SDA
;---------------------------------------------------
WRBYTE: MOV R0,#08H
WLP: RLC A ;取数据位
JC WRI
SJMP WRO ;判断数据位
WLP1: DJNZ R0,WLP
NOP
RET
WRI: SETB SDA ;发送1
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WRO: CLR SDA ;发送0
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;--------------------------------------------------
;程序名称:RDBYTE
;程序功能:读取字节子程序
;入口参数:SDA
;出口参数:读出的数据存放在ACC
;---------------------------------------------------
RDBYTE: MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL ;时钟线为高,接收数据位
NOP
NOP
MOV C,SDA ;读取数据位
MOV A,R2
CLR SCL ;将SCL拉低,时间大于4.7us
RLC A ;进行数据位的处理
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP ;未够8位,继续读入
RET
;--------------------------------------------------
;程序名称:MAIN
;程序功能:初始化 、向24C01C中写数据 、从24C01C中读数据、显示数据
;入口参数:写:单片机中30H-3FH 读:24C01C中30H开始的16个字节
;出口参数:写:24C01C中30H开始的16个字节 读:单片机中40H-4FH
;---------------------------------------------------
MAIN: MOV R4,#0F0H ;延时,等待其它芯片复位完成
DJNZ R4,$
MOV A,#00h ;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
MOV R0,#30H
S1: MOV @R0,A
INC R0
INC A
CJNE R0,#40H,S1
;--------------------------------------------------
WRITE: MOV SLA,#0A0H ;向24C01C中写数据,数据存放在24C01C中30H开始的16个字节中,24C01C地址字,写操作
MOV SUBA,#30H ;目标地址
MOV NUMBYTE,#8 ;MOV NUMBYTE,#16 ;字节数
LCALL IWRNBYTE ;写数据
;--------------------------------------------------
DELAY: MOV R5,#20 ;延时
D1: MOV R6,#248
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
;--------------------------------------------------
READ: MOV SLA,#0A0H ;从24C01C中读数据,数据送AT89C51中40H开始的16个字节中,24C01C地址字,伪写入操作
MOV SUBA,#30H ;目标地址
MOV NUMBYTE,#16;MOV NUMBYTE,#16 ;字节数
LCALL IRDNBYTE ;读数据
;--------------------------------------------------
;程序功能:数码管数据显示(适用于:动态扫描方式 共阴数码管)
;入口参数:要显示的数据依次存放在显示缓冲区:70H—75H六个存储单元中,
;出口参数:显示数据端口占用:P2口 ,位选通:P0
;程序编写:zqp
;创建时间:2006-11-29
;修改日志:
; NO.1:显示数据端口占用:P2口 ,位选通:P0
;---------------------------------------------------
MOV displaybuf0, 40H ;显示缓冲区送数据
MOV displaybuf1, 41H
MOV displaybuf2, 42H
MOV displaybuf3, 43H
MOV displaybuf4, 44H
MOV displaybuf5, 45H
;---------------------------------------------------
DISPLAY:
MOV A,displaybuf0 ;待显示的数码送累加器A
MOV DPTR,#TAB ;共阴显示代码表的首地址送DPTR
MOVC A,@A+DPTR ;根据待显示的数据找到其对应的共阴显示代码并送到
MOV P2,A ;把待显示的数据对应的共阴显示代码送到P2口
CLR P0.5 ;选通最高位
LCALL DELY10MS ;延时显示一段时间
SETB P0.5 ;关闭显示
MOV A,displaybuf1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
CLR P0.4 ;
LCALL DELY10MS
SETB P0.4
MOV A,displaybuf2
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
CLR P0.3 ;
LCALL DELY10MS
SETB P0.3
MOV A,displaybuf3
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
CLR P0.2 ;选通第四位
LCALL DELY10MS
SETB P0.2
MOV A,displaybuf4
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
CLR P0.1 ;选通第五位
LCALL DELY10MS
SETB P0.1
MOV A,displaybuf5
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
CLR P0.0 ;选通第六位
LCALL DELY10MS
SETB P0.0
ljmp DISPLAY ;重复执行显示程序
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,079H
;共阴显示代码分别对应:0 1 2 3 4 5 6 7 8 9 灭 E
;---------------------------------------------------
;延时程序(按12MHz计算)
;---------------------------------------------------
DELY10MS:MOV R6,#2
Dl: MOV R7,#248
DJNZ R7,$
DJNZ R6,Dl
RET
;---------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -