结合单片机用汇编实现I2CBUS总线协议
始、停止、读、写、应答的程序。
(1)启始位程序:
ACK:CLR P1.3
NOP
NOP
SETB P1.2
NOP
NOP
NOP
CPL P1.3 ;P1.3=1
NOP
NOP
NOP
DENGDAI:JB P1.2,DENGDAI RET
(2)读数据程序:
读字节可以在当前地址读(CURRENT READ),可以随机读(RANDOM READ),读出数据的最后一个字节后不用加应答信号。
READ:PUSH 0EH
CLR P1.4
LCALL BSTART;START
MOV A,#0A0H;SEND
THE CONTROL BYTE
LCALL SENDBYTE
LCALL ACK
MOV A,R1;SEND THE ADDRESS
LCALL SENDBYTE
LCALL ACK
LCALL BSTART;START
MOV A,#0A1H;SEND THE CONTROL BYTE
LCALL SENDBYTE
LCALL ACK
LCALL READBYTE
LCALL BSTOP
POP 0EH
RET
送字节子程序:
SENDBYTE:PUSH 0EH
PUSH 00H
MOV R0,#08H
LOOP1:CLR P1.3
NOP
NOP
RLC A
MOV P1.2,C
CPL P1.3; P1.3=1
NOP
NOP
DJNZ R0,LOOP1
POP 00H
POP 0EH
RET
读字节子程序:
READBYTE:PUSH 0EH
PUSH 00H
MOV R0,#08H;
READ THE CONTENT
CLR A
LOOP4:CLR P1.3
NOP
NOP
NOP
SETB P1.3;P1.3=1
MOV C,P1.2
RLC A
DJNZ R0,LOOP4
MOV R2,A
POP 00H
POP 0EH
RET
(3)写数据程序:
WRITE:PUSH 0EH
CLR P1.4
LCALL BSTART
MOV A,#0A0H
LCALL SENDBYTE;
SEND CONTROL BYTE
LCALL ACK
MOV A,R1;SEND THE ADDRESS
LCALL SENDBYTE
CLALL ACK
MOV A,R2;WERITE THE CONTENT
LCALL SENDBYTE
LCALL ACK
LCALL BSTOP
POP 0EH
RET
连续写的两个字节之间最好是要有10ms的延时。当然,也可以进行页写(PAGE WTITE),一次性连续写8个字节,每个字节后要一个应答信号。
(4)停止位程序:
BSTOP:CL的P1.3
NOP
NOP
CLR P1.2
NOP
NOP
NOP
SETB P1.3
NOP
NOP
NOP
SETB P1.2
RET
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)