EMC单片机的IIC程序软件包
扫描二维码
随时随地手机看文章
本程序已经稳定使用很长一段时间了,如果非要追根求源,应该追溹到1998年,由于本系统是基于IICEEPROM的,故对2401的读写采用了阻塞的方式,读不到数据或写不入数据就不退出。
本程序是基于447的,也在163上运行过,不过IO的初始化操作需要作些修改,其他可以完全不用修改。
程序开头的几行ADD A,@0xFF是非常有用的,在以后的文章中会有描述。
程序如下:
;SYSTEM CLOCK 4MHz
;IO port define
SDA == 4
SCL == 3
MSDA == 0
MSCL == 1
MCS == 2
MRST == 5
;Register define
TREG == 0X10
TCNT == 0X11
GCNT == 0X12
IICADDR == 0X1E
IICBUF == 0X28
IICDAT0 == 0X28
IICDAT1 == 0X29
IICDAT2 == 0X2A
IICDAT3 == 0X2B
IICDAT4 == 0X2C
IICDAT5 == 0X2D
IICDAT6 == 0X2E
IICDAT7 == 0X2F
INCLUDE "EM78P447S.H"
ORG 0X000
ADD A,@0XFF
ADD A,@0XFF
ADD A,@0XFF
ADD A,@0XFF
ADD A,@0XFF
START:
DISI
SET P6 P7 PULL UP EN
CONTR
MOV TREG,A
BC TREG,7
MOV A,TREG
CONTW
SET SCL SDA OUTPUT HIGH
MOV A,@0XFF
MOV TREG,A
BC TREG,SCL SCL OUTPUT
BC TREG,SDA SDA OUTPUT
MOV A,TREG
IOW IOC6
BS R6,SCL SCL HIGH
BS R6,SDA SDA HIGH
;********************************************************************
;读入的测试程序,读取2401的0x00~0x07地址内容
READ_2401:
MOV A,@0X00
MOV IICADDR,A
CALL IIC_R8BYT
RET
;********************************************************************
;写入的测试程序,向2401的0x00~0x07地址写入0x00
WRITE_2401:
MOV A,@0X00
MOV IICADDR,A
CLR IICDAT
CLR IICDAT
CLR IICDAT
CLR IICDAT
CLR IICDAT
CLR IICDAT
CLR IICDAT
CLR IICDAT
CALL IIC_W8BYT
RET
;********************************************************************
;与MicroChip的2401接口程序
;********************************************************************
;IIC_W8BYT,向2401的指定地址写入8个字节数据
;地址由IICADDR指定,数据存在IICDAT0~IICDAT7
IIC_W8BYT:
CALL IIC_START
MOV A,@0XA0
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_W8BYT
MOV A,IICADDR
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_W8BYT
WRITE 8 BYTES TO 24C01
MOV A,@IICBUF
MOV R4,A
MOV A,@8
MOV GCNT,A
IIC_W8BYT1:
MOV A,R0
INC R4
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_W8BYT
DJZ GCNT
JMP IIC_W8BYT1
CALL IIC_STOP
RET
;********************************************************************
;IIC_W1BYT,向2401的指定地址写入1个字节数据
;地址由IICADDR指定,数据存在IICDAT0
IIC_W1BYT:
CALL IIC_START
MOV A,@0XA0
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_W1BYT
MOV A,IICADDR
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_W1BYT
WRITE 1 BYTES TO 24C01
MOV A,@IICBUF
MOV A,IICDAT0
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_W1BYT1
CALL IIC_STOP
RET