1、PIC单片机的EEPROM读写程序PIC单片机的EEPROM读写程序PIC16C74B单片机与AT24C64通讯;该程序实现的功能是:;将I2C_A,I2C_B.I2C_K内容写入EEPROM中;同时在EEPROM中读出数据从新写入各个寄存器;=LISTP=16C74B#includeERRORLEVEL-302I2C_AEQU0X20I2C_BEQU0X21I2C_CEQU0X22I2C_DEQU0X23I2C_EEQU0X24I2C_FEQU0X25I2C_GEQU0X26REG1EQU0X2BREG2EQU0X2CCOUNTEQU0X71;I2CBCOUNTEQU0X72;I2CTXBU
2、FEQU0X73;I2CRXBUFEQU0X74;I2CBUSCONEQU0X75;I2CBUSSTAEQU0X76;I2CI2CBUFEQU0X77;I2CSLAVEADDREQU0XA0;I2CDATAADDRHEQU0X01;I2CDATAADDRLEQU0X00;I2C;-;BUSCON;-SLAVE_RWEQU7LAST_BYTE_RXEQU6SLAVE_ACTIVEEQU5TIME_OUTEQU4;-;BUSSTA;-BUS_BUSYEQU7TX_PROGRESSEQU6RX_PROGRESSEQU5TX_SUCCESSEQU4RX_SUCCESSEQU3FATAL_ERROREQ
3、U2;SLAVEEEPROMABORTEQU1ACK_ERROREQU0;-R_NOT_WEQU0TRUEEQU1FALSEEQU0SDAEQU0X04;I2CSCLEQU0X03;I2C;=ORG0X00GOTOSTARTORG0X20STARTBCFSTATUS,RP1BCFSTATUS,RP0CLRFRACLRFRBCLRFRCCLRFRDCLRFREBSFSTATUS,RP0CLRFTRISACLRFTRISBCLRFTRISCCLRFTRISDCLRFTRISEMOVLW0X02MOVWFI2C_AMOVLW0X04MOVWFI2C_BMOVLW0X03MOVWFI2C_CMOVLW
4、0X03MOVWFI2C_DMOVLW0X05MOVWFI2C_EMOVLW0X06MOVWFI2C_FMOVLW0X04MOVWFI2C_G;=START1CALLI2CBUS_INITCALLREGTOI2CBUFCALLI2CWRITECALLCLRI2CBUFCALLD10CALLI2CREADCALLI2CBUFTOREGGOTOSTART1;=;CLRI2CBUF;-CLRI2CBUFBCFSTATUS,RP0MOVLWI2CBUFMOVWFFSRMOVLW0X08MOVWFCOUNTCLRLOOPCLRFINDFINCFFSR,FDECFSZCOUNT,FGOTOCLRLOOPR
5、ETURN;-;将各个REGSTER数据写入I2CBUF缓冲区;-REGTOI2CBUFBCFSTATUS,RP0MOVLWI2CBUFMOVWFFSRMOVFI2C_A,WMOVWFINDFINCFFSR,FMOVFI2C_B,WMOVWFINDFINCFFSR,FMOVFI2C_C,WMOVWFINDFINCFFSR,FMOVFI2C_D,WMOVWFINDFINCFFSR,FMOVFI2C_E,WMOVWFINDFINCFFSR,FMOVFI2C_F,WMOVWFINDFINCFFSR,FMOVFI2C_G,WMOVWFINDFRETURN;-;将I2CBUF缓冲区数据写入各个REGST
6、ER;-I2CBUFTOREGBCFSTATUS,RP0MOVLWI2CBUFMOVWFFSRMOVFINDF,WMOVWFI2C_AINCFFSR,FMOVFINDF,WMOVWFI2C_BINCFFSR,FMOVFINDF,WMOVWFI2C_CINCFFSR,FMOVFINDF,WMOVWFI2C_DINCFFSR,FMOVFINDF,WMOVWFI2C_EINCFFSR,FMOVFINDF,WMOVWFI2C_FINCFFSR,FMOVFINDF,WMOVWFI2C_GRETURN;=;将I2CBUF缓冲区内的数据写入EEPROM;=I2CWRITECALLI2CSTARTBTFSSB
7、USSTA,BUS_BUSYGOTOTX_FAILBCFBUSCON,SLAVE_RWCALLTX_SLAVE_ADDRBTFSSBUSSTA,TX_SUCCESS;SUCESSFULL?GOTOTX_FAILCALLTX_DATA_ADDRBTFSSBUSSTA,TX_SUCCESSGOTOTX_FAILMOVLWI2CBUFMOVWFFSRMOVLW07MOVWFCOUNTT_BYTE_LOOPMOVFINDF,WMOVWFTXBUFCALLI2CTXBBTFSSBUSSTA,TX_SUCCESSGOTOTX_FAILINCFFSR,FDECFSZCOUNT,FGOTOT_BYTE_LOO
8、PGOTOTX_PASSTX_FAILCALLI2CSTOPBCFBUSSTA,TX_PROGRESSBCFBUSSTA,TX_SUCCESSRETLWFALSETX_PASSCALLI2CSTOPBCFBUSSTA,TX_PROGRESSRETLWTRUE;-;从EEPROM中读出数据到I2CBUF寄存器;-I2CREADBCFSTATUS,RP0BCFBUSSTA,RX_SUCCESSCALLI2CSTARTBTFSSBUSSTA,BUS_BUSYGOTORX_FAILBCFBUSCON,SLAVE_RWCALLTX_SLAVE_ADDRBTFSSBUSSTA,TX_SUCCESSGOTO
9、RX_FAILCALLTX_DATA_ADDRBTFSSBUSSTA,TX_SUCCESSGOTORX_FAILCALLI2CSTARTBSFBUSCON,SLAVE_RWCALLTX_SLAVE_ADDRBTFSSBUSSTA,TX_SUCCESSGOTORX_FAILBCFBUSSTA,LAST_BYTE_RXMOVLWI2CBUFMOVWFFSRMOVLW07MOVWFCOUNTR_BYTE_LOOPMOVLW0X01XORWFCOUNT,WBTFSCSTATUS,ZBSFBUSSTA,LAST_BYTE_RXCALLI2CRXBBTFSSBUSSTA,RX_SUCCESSGOTORX_
10、FAILMOVFRXBUF,WMOVWFINDFINCFFSR,FDECFSZCOUNT,FGOTOR_BYTE_LOOPGOTORX_PASSRX_FAILCALLI2CSTOPBCFBUSSTA,RX_PROGRESSBCFBUSSTA,RX_SUCCESSRETLWFALSERX_PASSCALLI2CSTOPBCFSTATUS,RP0BCFBUSSTA,TX_PROGRESSBCFBUSSTA,RX_PROGRESSBSFBUSSTA,RX_SUCCESSRETLWTRUE;=;I2C初始化;=I2CBUS_INITBCFSTATUS,RP0MOVFRC,WANDLW0X18MOVWF
11、RCCLRFBUSSTACLRFBUSCONRETURN;=;传送设备地址;入口:BUSCON;出口:BUSSTA;=TX_SLAVE_ADDRBCFSTATUS,RP0BCFBUSSTA,ACK_ERRORMOVLWSLAVEADDRMOVWFTXBUFBTFSCBUSCON,SLAVE_RWBSFTXBUF,R_NOT_WCALLI2CTXBBTFSCBUSSTA,TX_SUCCESSGOTOTXADDR_SUCCESSCLRWDTBTFSSBUSSTA,ACK_ERRORCALLI2CSTOPGOTOTXADDR_ENDTXADDR_SUCCESSCLRWDTTXADDR_ENDRETU
12、RN;=;TX_DATA_ADDR发送写/读的地址;=TX_DATA_ADDRBCFSTATUS,RP0MOVLWDATAADDRHMOVWFTXBUFCALLI2CTXBBCFSTATUS,RP0BTFSSBUSSTA,TX_SUCCESSGOTOTX_DATA_ADDR_ERRORMOVLWDATAADDRLMOVWFTXBUFCALLI2CTXBBCFSTATUS,RP0BTFSSBUSSTA,TX_SUCCESSGOTOTX_DATA_ADDR_ERRORGOTOTX_DATA_ENDTX_DATA_ADDR_ERRORBCFBUSSTA,TX_PROGRESSBCFBUSSTA,TX
13、_SUCCESSBSFBUSSTA,ACK_ERRORTX_DATA_ENDRETURN;=;向EEPROM输出一个8位数据,并检测EEPROM的ACK信号;入口:TXBUF寄存器;BUSSTA寄存器;出口:EEPROM存储器;BUSSTA寄存器;=I2CTXBBCFSTATUS,RP0BSFBUSSTA,TX_PROGRESSBCFBUSSTA,TX_SUCCESSMOVLW0X08MOVWFBCOUNTTXLOOPCLRWDTBSFSTATUS,RP0BCFTRISC,SCLNOPBCFTRISC,SDABCFSTATUS,RP0RLFTXBUF,FBSFSTATUS,RP0BTFSCSTATUS,CBSFTRISC,SDANOPBSFTRISC,SCLNOPNOPBCFSTATUS,RP0DECFSZBCOUNT,FGOTOTXLOOP;-;检测是EEPROM否有ACK信号产生,产生为正常;检测方法:;1.将RC口的SCL.SDA分别设置为输出和输入状态;2.延时2个指令周期,将SCL设置为高电平;3.延时2个指令周期,检测RC口SDA的状态;4.如果为高电平,设置错误状态,返回;5.如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行;-BSFSTATUS,RP0BCF
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1