3122|0

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

I2C程序记录开关机次数的程序(使用8255扩展) [复制链接]

#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 编辑 ]
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表