打印
[复制链接]
839|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
idqiye|  楼主 | 2015-4-15 11:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求一个pic系列c语言板的模拟I2C程序,网上貌似都是汇编的,自己根据一个普通51的改过来,时序什么的完全一样,结果还是不对,求指点
沙发
chenyu988| | 2015-4-17 08:58 | 只看该作者
51和pic的时钟一样吗

使用特权

评论回复
板凳
idqiye|  楼主 | 2015-4-17 13:28 | 只看该作者
chenyu988 发表于 2015-4-17 08:58
51和pic的时钟一样吗

用示波器匹配的延时应该一样,但时钟不一样即执行指令的时间

使用特权

评论回复
地板
idqiye|  楼主 | 2015-4-17 18:40 | 只看该作者
个人觉得51上移植过来的,只需要调节一下delay就得了,貌似还不行

使用特权

评论回复
5
MOn51| | 2015-4-18 19:57 | 只看该作者
本帖最后由 MOn51 于 2015-4-18 20:03 编辑

给你一个:
#include  "Use.h"
#include "Ver.H"
//**********************************************************
#define Wr_IIC  0xa2
#define Rd_IIC  (Wr_IIC+1)
#define HIGH  1
#define LOW   0
#define NOP_1uS()   NOP()//;NOP();NOP()//;NOP();NOP();NOP()
//定义管脚********************************
#define  SDA   TRISIO1
#define  SCL  TRISIO0
#define  SDA_IN  GPIO1
#define  SDA_OUT TRISIO1=0
/***********************************************
开始位
************************************************/
void Start_IIC(void){
SDA=HIGH;
SCL=HIGH;
NOP_1uS();
SDA=LOW;
SCL=LOW;
}
/********************************
停止位
**********************************/
void Stop_IIC(void){
SDA=LOW;
SCL=HIGH;
NOP_1uS();
SDA=HIGH;
SCL=LOW;
}
/*********************************
应答位,返回SDA信号
**********************************/
unsigned char Ack(void){
unsigned char cy;
SCL=HIGH;
cy=SDA_IN;
SCL=LOW;
return cy;
}
/***********************************
主应答 返回SDA
************************************/
void McuAck(void){
SDA=LOW;
SCL=HIGH;
NOP_1uS();
SCL=LOW;
}
/************************************
不应答
*************************************/
void Mcu_NO_Ack(void){
SDA=HIGH;
SCL=HIGH;
NOP_1uS();
SCL=LOW;
}
/************************************
写入一个字节 ,返回成功标志
*************************************/
void Wr_Byte(unsigned char Dat){
unsigned char i;
for (i=0;i<8;i++){
  SDA= ((Dat & 0x80)>0)? 1:0;
  Ack();
  Dat<<=1;
}
SDA=HIGH;
Ack();
}
/**********************************
读取一个字节
***********************************/
unsigned char Rd_Byte(void){
unsigned char i,j;

SDA=HIGH;
for (i=0;i<8;i++){
  j<<=1;
  j +=Ack();
}
return j;
}

/****************************************************
连续写入字节,返回UINT8标志
*****************************************************/
void Wr_PCF8563(unsigned char EeAdr,unsigned char *RamAdr,unsigned char Number){
Start_IIC();
Wr_Byte(0xa2);   /*写命令*/
Wr_Byte(EeAdr);  /*写地址*/
while (Number--){
  Wr_Byte(*RamAdr++); //2004-12-19
}
Stop_IIC();
}
/****************************************************
连续读取,返回UINT8标志
*****************************************************/
void Read_PCF8563(unsigned char EeAdr,unsigned char *RamAdr,unsigned char Number){
Start_IIC();
Wr_Byte(0xa2); /*写命令*/
Wr_Byte(EeAdr); /*写地址*/
Start_IIC();
Wr_Byte(0xa3);
while (--Number){
  *RamAdr++=Rd_Byte();
  McuAck();
}
*RamAdr=Rd_Byte();
Mcu_NO_Ack();
Stop_IIC();
}
/***************************************
BCD转换BIN
***************************************/
unsigned char BCDToBIN(unsigned char i){
unsigned char j;
j = i & 0x0f;   //保护
return ((i>>4)*10+j);
}
/**************************************
BIN转化BCD
**************************************/
unsigned char BINToBCD(unsigned char i){
unsigned char j;
j=i%10;    //得余数
i=i/10;
i=i<<4;
return (i|j);
}
/*************************************************************
初始化PCF8563  YEAR D6=1 代表已经初始化
*************************************************************/
void PCF8563_config(void){
unsigned char Buf[2],i=10;
TIMER t;

// Buf[0]=0; Buf[1]=0;
// Wr_PCF8563(0,Buf,1);
tDelay(18000);
Read_Timer(&t);
t.Sec=7;
t.Min=51;
t.Hour=8;
t.Day=8;
t.Mon=5;
t.Week=6;
t.Year=5;
Write_Timer(&t);
Buf[0]=0; Buf[1]=0;
Wr_PCF8563(0,Buf,1);
}
//*******************************************************************
//读取时间
//*******************************************************************
void Read_Timer(TIMER *timer){
TIMER t;
unsigned char i,*p,*pT;//,buf[8];
// buf[0]=0; buf[1]=0;
// Wr_PCF8563(0,buf,2);
Read_PCF8563(2,(unsigned char *)&t,7);
// i=t.Year & 0x40;
/*
t.Sec=buf[0];
t.Min=buf[1];
t.Hour=buf[2];
t.Day=buf[3];
t.Week=buf[4];
t.Mon=buf[5];
t.Year=buf[6];
*/
// if(i==0){
// PCF8563_config();
// }else{
  t.Year &=B1011_1111;
  t.Sec  &=B0111_1111;
  t.Mon  &=B0001_1111;
  t.Week &=B0000_0111;
  t.Day  &=B0011_1111;
  t.Hour &=B0011_1111;
  t.Min  &=B0111_1111;
  p=(unsigned char *)timer;
  pT=(unsigned char *)&t;
  for(i=0;i<sizeof(t);i++) *p++=BCDToBIN(*pT++);
// }
}
/********************************************************************
写入时间,年必须添加标志位!
*********************************************************************/
void Write_Timer(TIMER *timer){
TIMER t;
// unsigned char buf[8];
unsigned char i,*p,*pT;
p=(unsigned char *)&t;
pT=(unsigned char *)timer;
for(i=0;i<sizeof(t);i++) *p++=BINToBCD(*pT++);
t.Year |=0x40;
Wr_PCF8563(2,(unsigned char *)&t,7);
}


使用特权

评论回复
6
MOn51| | 2015-4-18 19:59 | 只看该作者
这是一个2005年的程序。有一点技巧!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

346

帖子

3

粉丝