EMC單片機(jī)的IIC程序軟件包
本程序已經(jīng)穩(wěn)定使用很長(zhǎng)一段時(shí)間了,如果非要追根求源,應(yīng)該追溹到1998年,由于本系統(tǒng)是基于IICEEPROM的,故對(duì)2401的讀寫(xiě)采用了阻塞的方式,讀不到數(shù)據(jù)或?qū)懖蝗霐?shù)據(jù)就不退出。
本程序是基于447的,也在163上運(yùn)行過(guò),不過(guò)IO的初始化操作需要作些修改,其他可以完全不用修改。
程序開(kāi)頭的幾行ADD A,@0xFF是非常有用的,在以后的文章中會(huì)有描述。
程序如下:
;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
;********************************************************************
;讀入的測(cè)試程序,讀取2401的0x00~0x07地址內(nèi)容
READ_2401:
MOV A,@0X00
MOV IICADDR,A
CALL IIC_R8BYT
RET
;********************************************************************
;寫(xiě)入的測(cè)試程序,向2401的0x00~0x07地址寫(xiě)入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的指定地址寫(xiě)入8個(gè)字節(jié)數(shù)據(jù)
;地址由IICADDR指定,數(shù)據(jù)存在IICDAT0~I(xiàn)ICDAT7
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的指定地址寫(xiě)入1個(gè)字節(jié)數(shù)據(jù)
;地址由IICADDR指定,數(shù)據(jù)存在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