完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
为什么我的程序跑不了,求救各位大虾T,.T
include"at 24c02.h" org 0x00 start: R: call I2C_INIT mov a,@0x55 mov I2C_DATA,a call I2C_WRITE_BYTE call I2C_READ_BYTE call I2C_WRITE_BYTE call I2c_SequentialRead nop JMP R ret /*-------------------------------------------------------------- 24C02送数据/命令程序 入口 : I2C_ADDR 地址 I2C_DATA 数据 出口 : 无 ----------------------------------------------------------------*/ if I2C_SEQU_OP==1 I2C_PAGE_WRITE: call I2c_Start ; write command mov a,@0xa0 call SendByte call I2C_CHACK__ACK mov a,I2C_ADDR call SendByte call I2C_CHACK__ACK ;-------------------------------- mov a,@WRITE_NUM ; 连续写字节数量 3 mov I2C_CNT_NUM,a mov a,@WRITE_BUF ; 缓冲区首地址 0x20 mov r4,a I2C_PAGE_LOOP: mov a,r0 ; 从缓存取一个数据 call SendByte call I2C_CHACK__ACK inc r4 ; 缓存地址加一 djz I2C_CNT_NUM jmp I2C_PAGE_LOOP ;-------------------------------- call I2c_StOP ret endif /*----------------------------------------------------------- 连续读取多个字节 入口: I2C_ADDR E2PROM开始地址 出口: I2C_DATA 数据 说明: 缓存的入口地址和读数据数量在头文件中宏定义 也可以用寄存器传递。 ;-----------------------------------------------------------*/ if I2C_SEQU_OP==1 I2c_SequentialRead: call I2c_Start ; COMMAND 先启动到 Random Read模式 mov a,@0xa0 call SendByte call I2C_CHACK__ACK mov a,I2C_ADDR call SendByte call I2C_CHACK__ACK call I2C_START ; CURRENT READ mov a,@0xa1 call SendByte call I2C_CHACK__ACK ;-------------------------------- ; 连续读取指定个数据存到连续区域 mov a,@READ_NUM ;3 mov I2C_CNT_NUM,a ; 连续读READ_NUM个数据 mov a,@READ_BUF ;2a mov r4,a ; 数据存放的缓存地址 I2c_Sequential_loop: call ReadByte ; 读取一个数据 mov I2C_DATA,a call I2c_Ack mov a,I2C_DATA mov r0,a ; 保存 inc r4 ; 地址加一 djz I2C_CNT_NUM jmp I2c_Sequential_loop ret endif /******************************************************/ I2C_WRITE_BYTE: call I2C_START mov a,@0XA0;写命令 call SENDBYTE call I2C_CHACK__ACK mov a,I2C_ADDR call SENDBYTE mov a,I2C_DATA ;写入数据 call SENDBYTE call I2C_CHACK__ACK: call I2C_STOP RET ;---------------------------------------------- ;---------------------------------------------- I2C_READ_BYTE: call I2C_START mov a,@0XA0; call SENDBYTE call I2C_CHACK__ACK: mov a,I2C_ADDR call SENDBYTE call I2C_CHACK__ACK: ;-------------------------------- call I2C_START mov a,@0XA1 call SENDBYTE call I2C_CHACK__ACK: call READBYTE mov a,I2C_DATA call SENDBYTE call I2C_STOP RET ;-------------------------------------- ;-------------------------------------- I2C_CHACK__ACK: clr temp0 BS SDA ;------------------ mov a,@0xff IOW PORT6 ; call delay BS SCL weit: NOP NOP ; JBC SDA jmp weit ;等待应答信号 INC temp0 ; temp = 1 有响应, temp = 0 没有响应 call delay BC SCL ;------------------ MOV A,@0X00 IOW PORT6 ret ;------------------------------------ ;------------------------------------- I2C_START: BS SDA BS SCL call delay BC SDA NOP call delay BC SCL RET ;------------------------------------ ;------------------------------------ I2C_STOP: BC SDA BS SCL NOP call delay BS SDA NOP call delay BS SCL RET ;---------------------------------------- ;---------------------------------------- I2C_ACK: BC SDA call delay BS SCL call delay BC SCL RET ;---------------------------------------- ;----------------------------------------- I2C_NOACK: BS SDA call delay BS SCL call delay BC SCL RET ;------------------------------------------- ;------------------------------------------- SENDBYTE: MOV A,@0x00 IOW Port6 mov temp0,a mov a,@8 mov I2C_BYTE_CNT,a bc scl SEND_LOOP: RLC temp0 ;MSB JBS 0X03,0 ;状态标志位 JMP $+3 BS SDA JMP $+2 BC SDA call delay BS SCL call delay BC SCL call delay DJZ I2C_BYTE_CNT JMP SEND_LOOP MOV A,@0x00 IOW Port6 RET ;--------------------------------------- ;--------------------------------------- READBYTE: ;---------------------- mov a,@0X01 IOW PORT6 ;clr I2C_DATA mov a,@8 mov I2C_BYTE_CNT,a bc scl call delay bs sda call delay READ_LOOP: bs SCL call delay rlc I2C_DATA BC I2C_DATA,0 JBC SDA BS I2C_DATA,0 call delay Bc SCL call delay DJZ I2C_BYTE_CNT JMP READ_LOOP ;--------------------- mov a,@0x00 IOW PORT6 mov a,I2C_DATA RET ;-------------------------------------------------- ;-------------------------------------------------- I2C_INIT: MOV A,@0X0E ;4E: 上升沿触发,CE: 下降沿触发 BS IOCS ;选择IOC51-IOCF1 R3 (状态寄存器)IO控制寄存器段选择位 1: 选择段1 (IOC51 ~ IOCC1) MOV A,@0X00 IOW P6HCR ;p6口内置上拉0x00 (下拉控制寄存器) ; BC IOCS ;选择IOC50-IOCF0 MOV A,@0x00 IOW IOCC0 ;全部p6口开漏输出0xff (漏极开路控制寄存器) ; MOV A,@0x00 IOW IOCD0 ;p5上拉0x00 (上拉控制寄存器) ; MOV A,@0xff IOW IOCB0 ;关闭P5下拉0xff (下拉控制寄存器) ; MOV A,@0X00 ;0 输入 IOW IOC60 RET ;I2C_INIT: ; mov a,@0x01 ; IOW SDA_PORT ; ; mov a,@0x00 ; IOW SCL_PORT ; ; mov a,@0x0d ; IOW P5 ; IOW P6 ;RET delay: mov a, @0x0b ; 4us延迟 mov temp0,a B: djz temp0 jmp B nop clr temp0 ret ;------------------------------------------------------- |
|
相关推荐
1个回答
|
|
楼主,碉堡了,。
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2084 浏览 1 评论
3629 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2336 浏览 2 评论
2763 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4027 浏览 5 评论
972浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6359浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 08:33 , Processed in 0.678832 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号