- #include <STC8h.H>
- #include "main.h"
- #include "OLED.h"
- #include <intrins.h>
- void I2C_Init()
- {
- P_SW2 |= 0x80;
-
- I2CCFG = 0xe0; //使能I2C主机模式
- I2CMSST = 0x00;
- P1M0 = 0x30; P1M1 = 0x10; //P15设为推挽输出,P14设为开漏输出
- P1PU = 0x10; //P14接上拉电阻
-
-
- }
-
- void Wait()
- {
- while (!(I2CMSST & 0x40));
- I2CMSST &= ~0x40;
- }
-
- void Start()
- {
- I2CMSCR = 0x01; //发送START命令
- Wait();
- }
-
- void SendData(char dat)
- {
- I2CTXD = dat; //写数据到数据缓冲区
- I2CMSCR = 0x02; //发送SEND命令
- Wait();
- }
-
- void RecvACK()
- {
- I2CMSCR = 0x03; //发送读ACK命令
- Wait();
- }
-
- unsigned char RecvData()
- {
- I2CMSCR = 0x04; //发送RECV命令
- Wait();
- return I2CRXD;
- }
-
- void SendACK()
- {
- I2CMSST = 0x00; //设置ACK信号
- I2CMSCR = 0x05; //发送ACK命令
- Wait();
- }
-
- void SendNAK()
- {
- I2CMSST = 0x01; //设置NAK信号
- I2CMSCR = 0x05; //发送ACK命令
- Wait();
- }
-
- void Stop()
- {
- I2CMSCR = 0x06; //发送STOP命令
- Wait();
- }
- void WriteAT24C02(unsigned char device_addr,unsigned char register_addr,unsigned char dat)
- {
- Start();
- SendData(device_addr);
- RecvACK();
- SendData(register_addr);
- RecvACK();
- SendData(dat);
- RecvACK();
- Stop();
- }
- unsigned char ReadAT24C02(unsigned char device_addr,unsigned char register_addr)
- {
- unsigned char temp;
- Start();
- SendData(device_addr);
- RecvACK();
- SendData(register_addr);
- RecvACK();
- Start();
- SendData(device_addr|0x01);
- temp = RecvData();
- SendNAK();
- Stop();
- return temp;
- }
- void Delay100ms(void) //@24.000MHz
- {
- unsigned char data i, j, k;
-
- _nop_();
- _nop_();
- i = 13;
- j = 45;
- k = 214;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
- /*
- void WriteNbyte(u8 addr, u8 *p, u8 number)
- {
- Start(); //发送起始命令
- SendData(SLAW); //发送设备地址+写命令
- RecvACK();
- SendData(addr); //发送存储地址
- RecvACK();
- do
- {
- SendData(*p++);
- RecvACK();
- }
- while(--number);
- Stop(); //发送停止命令
- }
- */
- /*
- void ReadNbyte(u8 addr, u8 *p, u8 number)
- {
- Start(); //发送起始命令
- SendData(SLAW); //发送设备地址+写命令
- RecvACK();
- SendData(addr); //发送存储地址
- RecvACK();
- Start(); //发送起始命令
- SendData(SLAR); //发送设备地址+读命令
- RecvACK();
- do
- {
- *p = RecvData();
- p++;
- if(number != 1) SendACK(); //send ACK
- }
- while(--number);
- SendNAK(); //send no ACK
- Stop(); //发送停止命令
- }
- */
- void main(void)
- {
- unsigned char test_num = 90;
- unsigned char dat[4];
- OLED_Init();
- WriteAT24C02(0xa0,0x00,0x0A);
- Delay100ms();
- dat[0] = ReadAT24C02(0xa0,0x00);
- dat[1] = ReadAT24C02(0xa2,0x00);
- dat[2] = ReadAT24C02(0xa4,0x00);
- dat[3] = ReadAT24C02(0xa6,0x00);
- Delay100ms();
- OLED_ShowNum(1,1,dat[0],2);
- OLED_ShowNum(2,1,dat[1],2);
- OLED_ShowNum(3,1,dat[2],2);
- OLED_ShowNum(4,1,dat[3],2);
- OLED_ShowNum(1,4,test_num,2);
- while(1)
- {
-
- }
-
- }
-
-
复制代码
我挂载了四个AT24c02,但是读写不正常,往里面写入的数据,读出来不一样,请教一下各位大佬是什么原因
|