历史上的今天
今天是:2025年01月27日(星期一)
2018年01月27日 | EMC单片机的IIC程序软件包
2018-01-27 来源:eefocus
本程序已经稳定使用很长一段时间了,如果非要追根求源,应该追溹到1998年,由于本系统是基于IIC EEPROM的,故对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
;********************************************************************
;IIC_R8BYT,从2401的指定地址(IICADDR)读入8个字节数据
IIC_R8BYT:
CALL IIC_START
MOV A,@0XA0
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_R8BYT
MOV A,IICADDR
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_R8BYT
CALL IIC_START
MOV A,@0XA1
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_R8BYT
READ 8 BYTES FROM 24C01
MOV A,@IICBUF
MOV R4,A
MOV A,@7
MOV GCNT,A
IIC_R8BYT1:
CALL IIC_RBYT
MOV R0,A
INC R4
CALL IIC_SACK
DJZ GCNT
JMP IIC_R8BYT1
CALL IIC_RBYT
MOV R0,A
CALL IIC_SNACK
CALL IIC_STOP
RET
;********************************************************************
;IIC_R1BYT,向2401的指定地址读出1个字节数据
;地址由IICADDR指定,数据存在IICDAT0
IIC_R1BYT:
CALL IIC_START
MOV A,@0XA0
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_R1BYT
MOV A,IICADDR
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_R1BYT
CALL IIC_START
MOV A,@0XA1
CALL IIC_WBYT
CALL IIC_CACK
JBC R3,GP IF GP=1 OPTION AGAIN
JMP IIC_R1BYT
READ 1 BYTES FROM 24C01
CALL IIC_RBYT
MOV IICDAT0,A
CALL IIC_SNACK
CALL IIC_STOP
RET
;********************************************************************
;IIC_START
IIC_START:
BS R6,SCL SCL=1
BS R6,SDA SDA=1
CALL IIC_DELAY
BC R6,SDA SDA=0
CALL IIC_DELAY
RET
;********************************************************************
;IIC_STOP
IIC_STOP:
BS R6,SCL SCL=1
BC R6,SDA SDA=0
CALL IIC_DELAY
BS R6,SDA SDA=1
CALL IIC_DELAY
RET
;********************************************************************
;IIC_CACK IF ACK,FIIC=0
IIC_CACK:
SET SDA INPUT
IOR IOC6
MOV TREG,A
BS TREG,SDA
MOV A,TREG
IOW IOC6
BS R6,SCL SCL=1
BC R3,GP
JBC R6,SDA
BS R3,GP
BC R6,SCL SCL=0
SET SDA OUTPUT
IOR IOC6
MOV TREG,A
BC TREG,SDA
MOV A,TREG
IOW IOC6
RET
;********************************************************************
;IIC_SACK
IIC_SACK:
BC R6,SDA SDA=0
NOP
BS R6,SCL SCL=1
CALL IIC_DELAY
BC R6,SCL SCL=0
CALL IIC_DELAY
RET
;********************************************************************
;IIC_SNACK
IIC_SNACK:
BS R6,SDA SDA=1
NOP
BS R6,SCL SCL=1
CALL IIC_DELAY
BC R6,SCL SCL=0
CALL IIC_DELAY
RET
;********************************************************************
;IIC_WBYT
IIC_WBYT:
MOV TREG,A
MOV A,@8
MOV TCNT,A
IIC_WBYT1:
BC R6,SCL SCL=0
JBC TREG,7
JMP IIC_WBIT1
JMP IIC_WBIT0
IIC_WBIT1:
BS R6,SDA
JMP IIC_WBYT2
IIC_WBIT0:
BC R6,SDA SDA=X
JMP IIC_WBYT2
IIC_WBYT2:
RLC TREG
CALL IIC_DELAY
BS R6,SCL SCL=1
CALL IIC_DELAY
DJZ TCNT
JMP IIC_WBYT1
BC R6,SCL SCL=0
CALL IIC_DELAY
RET
;********************************************************************
;IIC_RBYT
IIC_RBYT:
MOV A,@8
MOV TCNT,A
SET SDA INPUT
IOR IOC6
OR A,@0X10
IOW IOC6
IIC_RBYT1:
BS R6,SCL SCL=1
JBC R6,SDA
JMP IIC_RBIT1
JMP IIC_RBIT0
IIC_RBIT1:
BS TREG,0
JMP IIC_RBYT2
IIC_RBIT0:
BC TREG,0 SDA=X
JMP IIC_RBYT2
IIC_RBYT2:
RLC TREG
BC R6,SCL SCL=0
CALL IIC_DELAY
DJZ TCNT
JMP IIC_RBYT1
STORE READ RESULT
RRC TREG
MOV A,TREG
MOV TCNT,A
SET SDA OUTPUT
IOR IOC6
AND A,@0XEF
IOW IOC6
RESTORE READ RESULT
MOV A,TCNT
RET
;********************************************************************
;
IIC_DELAY:
NOP
NOP
RET
ORG 0XFFF
JMP START
史海拾趣
|
1.要正确选型 要用好继电器,正确选型是很重要的,首先必须对被控对象的性质、特点和使用要求有透彻的了解,并进行周密考虑。对所选继电器的原理、用途、技术参数、结构特点、规格型号要掌握和分析。在此基础上应根据项目实际情况和 ...… 查看全部问答> |
|
我调用rasdial拨号上网,设置是之前设置好的一个拨号连接,现在我想更改这个拨号连接的设置,让其不用流控,我找了半天ras相关的函数,都没有发现可以进行这些设置的,RasSetCommSettings是在自己写的dll里面更改波特率之类的,但是就是没有更改是 ...… 查看全部问答> |
|
现在手头充电器太多了 我想能不能订做一个开关电源 把手机、PSP、笔记本电脑等的充电器都集成到一个开关电源里面 接出来不同的接口 这样可以吗?各种充电器是不是就是一个电压转换的作用啊?谢谢各位… 查看全部问答> |
|
兼职MCU,DSP,ARM,FPGA,CPLD芯片程序的破解 本人擅长于MCU,DSP,ARM,FPGA,CPLD程序的破解和电路板的抄板,原理图和PCB的绘制,破解的成功率非常高。同时还承担单片机系统以及中央空调等方面的开发。如有需要请联系我。sale.jiemi@gmail.com … 查看全部问答> |
|
..今天上课的时候, 老师写了一串代码.. ORG 0000H SJMP MAIN ORG 000BH SJMP INT0 MAIN:MOV TMOD,#01H MOV A, #FEH MOV P1,A MOV TH0, #23H & ...… 查看全部问答> |
|
请问:用vc++编的界面程序怎么跟人机界面里的伺服驱动器通讯(用232),说下大体思路和注意事项.谢谢了! 请问: 用vc++编的界面程序怎么跟人机界面里的伺服驱动器通讯(用232),说下大体思路和注意事项.谢谢了! 我刚进公司,没做过这个,上司交给我这个任务,要是完不成就要走人了. 请高人指教.分不多了,实在不好意思,重在交流嘛… 查看全部问答> |
|
本系统需要使用到的IC资料收集如下: 1. LPC1768: 2. LPC1114: 3. dp83848: 4. 华为GTM900 无线模块 产品描述手册: 5. 24C02: 6. LCD1602: 7. LM2596-5.0: 8. DS18B20: 9. 3.2tft: [ 本帖最后由 zhaojun_xf 于 2010-8-6 06:34 ...… 查看全部问答> |




