[讨论] I2C程序记录开关机次数的程序(使用8255扩展)

shenglinwan   2008-10-17 09:40 楼主
#include
#include
#include
// extern void DelayMs(unsigned int);
//extern void Read24c02(unsigned char *RamAddress,
//                   unsigned char RomAddress,unsigned char bytes);
// extern void Write24c02(unsigned char *RamAddress,
//                     unsigned char RomAddress,unsigned char bytes);

// 原创:www.89s52.cn  单片机学习交流新手群 61804809

/****************************************************************/
#define WriteDeviceAddress 0xa0 //写格式
#define ReadDviceAddress 0xa1 //读格式
#define uchar unsigned char
#define uint unsigned int
#define PA8255 XBYTE[0x3ffc]
#define PB8255 XBYTE[0x3ffd]
#define PC8255 XBYTE[0x3ffe]            
#define COM8255 XBYTE[0x3fff]
/***************************************************************/
void DelayMs(uchar number);
void Start();
void Stop();
void Ack();  //应答格式
void NoAck(); //非应答格式
bit TestAck(); //检查应答的ACK
void Write8Bit(uchar input);//写一个字节
void Write24c02(uchar *Wdata,uchar RomAddress, //写入I2C程序
                          uchar number);
uchar Read8Bit();  //读一个字节
void Read24c02(uchar *RamAddress,uchar RomAddress, //读出I2C程序
                         uchar bytes) ;
void Delay(uchar i) ;
sbit SCL=P1^4;
sbit SDA=P1^5;
sbit DOG=P3^7;
sbit cs138=P1^6;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
/***************************************************************/
uchar T[1]; //I2C数据存储区
uchar  code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
     0x77,0x7c,0x39,0x5e,0x79,0x71};//0~f

void main()
{
uchar tmp;
cs138=0;
P1=0;
COM8255=0X88;
Read24c02(T,0x00,1);//读程序从0X00单元开始,读出一个字节
while(1)
{
  {
   tmp=T[0];if(tmp>9){T[0]=0;tmp=0;}else{T[0]++;}
   Write24c02(T,0x00,1);//写程序从0X00单元开始,写入一个字节
  }
  while(1)
   {PB8255=tab[tmp];led3=1;Delay(2);led3=0;}
  }
}
void DelayMs(uchar number)
{
uchar temp;
for(;number!=0;number--,DOG=!DOG)
  {
  for(temp=112;temp!=0;temp--) {}
  }
}
/*******************启动I2C*/
void Start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
/*********************///停止I2C
void Stop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
/**********************/
void Ack()  //应答格式
{
SDA=0;
SCL=1;
SCL=0;
SDA=1;
}
/***********************/
void NoAck()  //应答格式
{
SDA=1;
SCL=1;
SCL=0;
}
/*************************************/
bit TestAck() //检查应答的ACK
{
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
/*************************************/
void Write8Bit(uchar input) //写一个字节
{
uchar temp;
for(temp=8;temp!=0;temp--)
  {
  if(input&0x80)SDA=1;
  else SDA=0;
  SCL=1;
  SCL=0;
  input=input<<1;
  }
}
/****************************************/
void Write24c02(uchar *Wdata,uchar RomAddress, //写入I2C程序
                          uchar number)
{
Start();      //开始条件
Write8Bit(WriteDeviceAddress); //写8位设备地址
TestAck();      
Write8Bit(RomAddress);
TestAck();
for(;number!=0;number--)
{
  Write8Bit(*Wdata);
  TestAck();
  Wdata++;
}
Stop();
DelayMs(10);
}
/***************************************************/
uchar Read8Bit()  //读一个字节
{
uchar temp,rbyte=0;
for(temp=8;temp!=0;temp--)
  {
  SCL=1;
  rbyte=rbyte<<1;
  if(SDA)rbyte|=0x01;
  else rbyte|=0x00;
  SCL=0;
  }
return(rbyte);
}
void Read24c02(uchar *RamAddress,uchar RomAddress, //读出I2C程序
                         uchar bytes)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(RomAddress);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
while(bytes!=0)
{
*RamAddress=Read8Bit();
Ack();     //应答
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();    //非应答
Stop();     //结束条件
}
//延时程序
void Delay(uchar i)      //延时程序,i是形式参数
{
uchar j;
while(i--)             //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++);
}

[ 本帖最后由 shenglinwan 于 2008-10-17 09:41 编辑 ]

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复