24c02存储花样灯

来源:互联网 发布:删除表的sql语句 编辑:程序博客网 时间:2024/04/30 03:15
main.c
#include <reg52.h>                #include "i2c.h"unsigned char      dat[]={0x7f,0xbf,0xdf,0xef,  0xf7,0xfb,0xfd,0xfe,  0xff,0xff,0x00,0x00,  0x55,0x55,0xaa,0xaa  };//ram允许情况可以无限添加main(){ //bit flag; unsigned char i; ISendStr(0xae,80,dat,16);            //写入24c02 DelayMs(1);                          //写入后必须延时等待24c02内部                                      //烧录数据处理完毕方可继续其他操作 for(i=0;i<16;i++)                    //清除数据     dat[i]=0; IRcvStr(0xae,80,dat,16);             //从24c02读出数据  while(1)     {   for(i=0;i<16;i++)              //查表     { DelayMs(200);         P1=dat[i]; } }}


i2c.c

#include "i2c.h"#define  _Nop()  _nop_()  //定义空指令                         bit ack;              //应答标志位sbit SDA=P2^1;sbit SCL=P2^0;void DelayUs2x(unsigned char t){    while(--t);}void DelayMs(unsigned char t){      while(t--) {     //大致延时1mS     DelayUs2x(245); DelayUs2x(245); }}void Start_I2c(){  SDA=1;   //发送起始条件的数据信号  _Nop();  SCL=1;  _Nop();    //起始条件建立时间大于4.7us,延时  _Nop();  _Nop();  _Nop();  _Nop();      SDA=0;     //发送起始信号  _Nop();    //起始条件锁定时间大于4μ  _Nop();  _Nop();  _Nop();  _Nop();         SCL=0;    //钳住I2C总线,准备发送或接收数据  _Nop();  _Nop();}void Stop_I2c(){  SDA=0;    //发送结束条件的数据信号  _Nop();   //发送结束条件的时钟信号  SCL=1;    //结束条件建立时间大于4μ  _Nop();  _Nop();  _Nop();  _Nop();  _Nop();  SDA=1;    //发送I2C总线结束信号  _Nop();  _Nop();  _Nop();  _Nop();}void  SendByte(unsigned char c){ unsigned char BitCnt;  for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位    {     if((c<<BitCnt)&0x80)SDA=1;   //判断发送位       else  SDA=0;                     _Nop();     SCL=1;               //置时钟线为高,通知被控器开始接收数据位      _Nop();       _Nop();             //保证时钟高电平周期大于4μ      _Nop();      _Nop();      _Nop();              SCL=0;     }        _Nop();    _Nop();    SDA=1;               //8位发送完后释放数据线,准备接收应答位    _Nop();    _Nop();       SCL=1;    _Nop();    _Nop();    _Nop();    if(SDA==1)ack=0;            else ack=1;        //判断是否接收到应答信号    SCL=0;    _Nop();    _Nop();}unsigned char  RcvByte(){  unsigned char retc;  unsigned char BitCnt;    retc=0;   SDA=1;             //置数据线为输入方式  for(BitCnt=0;BitCnt<8;BitCnt++)      {        _Nop();                   SCL=0;       //置时钟线为低,准备接收数据位        _Nop();        _Nop();      //时钟低电平周期大于4.7us        _Nop();        _Nop();        _Nop();        SCL=1;       //置时钟线为高使数据线上数据有效        _Nop();        _Nop();        retc=retc<<1;        if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中        _Nop();        _Nop();       }  SCL=0;      _Nop();  _Nop();  return(retc);}void Ack_I2c(void){    SDA=0;       _Nop();  _Nop();  _Nop();        SCL=1;  _Nop();  _Nop();              //时钟低电平周期大于4μ  _Nop();  _Nop();  _Nop();    SCL=0;               //清时钟线,钳住I2C总线以便继续接收  _Nop();  _Nop();    }void NoAck_I2c(void){    SDA=1;  _Nop();  _Nop();  _Nop();        SCL=1;  _Nop();  _Nop();              //时钟低电平周期大于4μ  _Nop();  _Nop();  _Nop();    SCL=0;                //清时钟线,钳住I2C总线以便继续接收  _Nop();  _Nop();    }/*bit ISendByte(unsigned char sla,unsigned char c){   Start_I2c();               //启动总线   SendByte(sla);             //发送器件地址     if(ack==0)return(0);   SendByte(c);               //发送数据     if(ack==0)return(0);  Stop_I2c();                 //结束总线  return(1);}*/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){   unsigned char i; for(i=0;i<no;i++)    {    Start_I2c();               //启动总线   SendByte(sla);             //发送器件地址     if(ack==0)return(0);   SendByte(suba);            //发送器件子地址     if(ack==0)return(0);       SendByte(*s);            //发送数据            if(ack==0)return(0);     Stop_I2c();                  //结束总线     DelayMs(2);               //必须延时等待芯片内部自动处理数据完毕 s++; suba++;    }   return(1);}/*bit IRcvByte(unsigned char sla,unsigned char *c){   Start_I2c();                //启动总线   SendByte(sla+1);            //发送器件地址     if(ack==0)return(0);   *c=RcvByte();               //读取数据     NoAck_I2c();              //发送非就答位     Stop_I2c();               //结束总线  return(1);}*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){   unsigned char i;   Start_I2c();               //启动总线   SendByte(sla);             //发送器件地址     if(ack==0)return(0);   SendByte(suba);            //发送器件子地址     if(ack==0)return(0);   Start_I2c();   SendByte(sla+1);      if(ack==0)return(0);  for(i=0;i<no-1;i++)    {      *s=RcvByte();              //发送数据      Ack_I2c();                //发送就答位      s++;    }    *s=RcvByte();    NoAck_I2c();                 //发送非应位    Stop_I2c();                    //结束总线  return(1);}


0 0