⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563.c.c

📁 用单片机AVR控制PCF8563时钟芯片的运行
💻 C
字号:
#include <iom16v.h>
#include <stdio.h>
#include <macros.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#define SDA PORTD5
//定义PD5为模拟数据口  
#define SCL PORTD6
//定义PD6为模拟时钟口
uchar chushijian[]={0x00,0x59,0x23,0x08,0x06,0x07}; //写入时间初值:格式:"秒-分-时-日-月-年"
uchar q,p,duzhi,d;
uchar jshu;//接收到的数
uchar duchu;
uchar gao,di,zhi,shuzhi,i;
uchar time[5];
//HAN数名称:delay
//功能:延时
//---------------------------------------------------------------------------
void delay(uint x) //单条延时1.5us左右 
{ 
  while(x) 
  { 
    x--; 
  } 
}
void DelayUs(uint us)//微秒延时
{uint i;
  for (i=0;i<us;i++)
  {NOP();NOP();NOP();NOP();NOP();NOP();
  }
}

void DelayMs(uchar ms)//毫秒延时
{char i;
for (i=0;i<ms;i++)
  {DelayUs(1000);
  }
  return;
}

//-----------------------------------------------------------------------------
void songshu(uchar x)
{uint i,j,q;
q=x;
 PORTC|=(1<<4);
 for(i=0;i<=4;i++)    ///////11111
 {PORTC&=~(1<<5);///pc7=0
  PORTC|=(1<<5);//pc7=1
  
 }
 PORTC&=~(1<<5);////pc7=0
 PORTC&=~(1<<4);///sid=0
 PORTC|=(1<<5);
 PORTC&=~(1<<5);
 PORTC|=(1<<4);
 PORTC|=(1<<5);
 PORTC&=~(1<<5);
 PORTC&=~(1<<4);
 PORTC|=(1<<5);
 PORTC&=~(1<<5);//传数前的准备//010
 for(j=0;j<4;j++)
 {x=q; 
 if((x&0x80)==0)
 {PORTC&=~(1<<4);}
 else
 {PORTC|=(1<<4);}
 PORTC|=(1<<5);
 PORTC&=~(1<<5);
 q=q<<1;
 }
 PORTC&=~(1<<4);
 for(i=0;i<=3;i++)
 {PORTC|=(1<<5);
 PORTC&=~(1<<5);
  
 }
 for(j=0;j<4;j++)
 {x=q; 
 if((x&0x80)==0)
 {PORTC&=~(1<<4);}
 else
 {PORTC|=(1<<4);}
 PORTC|=(1<<5);
 PORTC&=~(1<<5);
 q=q<<1;
 }
 PORTC&=~(1<<4);
 for(i=0;i<=3;i++)
 {PORTC|=(1<<5);
 PORTC&=~(1<<5);
 }
 delay(700);
}
void songkongzhi(uchar y)
{
    uint i,j,q;
    q=y;
    PORTC|=(1<<4);
    for(i=0;i<=4;i++)
    {
	 PORTC&=~(1<<5);
     PORTC|=(1<<5);
    }
     PORTC&=~(1<<5);
     PORTC&=~(1<<4);
     PORTC|=(1<<5);
     PORTC&=~(1<<5);
     PORTC|=(1<<5);
     PORTC&=~(1<<5);
     PORTC|=(1<<5);
     PORTC&=~(1<<5);//传数前的准备
 for(j=0;j<4;j++)
 {
   y=q; 
     if((y&0x80)==0)
      {PORTC&=~(1<<4);}
   else
     {PORTC|=(1<<4);}
    PORTC|=(1<<5);
    PORTC&=~(1<<5);
    q=q<<1;
 }
    PORTC&=~(1<<4);
    for(i=0;i<=3;i++)
    {PORTC|=(1<<5);
     PORTC&=~(1<<5);
    }
    for(j=0;j<4;j++)
  {
	y=q; 
    if((y&0x80)==0)
    {PORTC&=~(1<<4);}
    else
     {PORTC|=(1<<4);}
     PORTC|=(1<<5);
    PORTC&=~(1<<5);
     q=q<<1;
  }
    PORTC&=~(1<<4);
    for(i=0;i<=3;i++)
    {
     PORTC|=(1<<5);
     PORTC&=~(1<<5);
    }
     delay(700);
}

void setadress(uchar dizhi)
{
  songkongzhi(dizhi);
  delay(700);
}

void dis_tab(uchar data)
{
 switch(data)
 {
   case 0:{p=0xa3;q=0xb0;break;}
   case 1:{p=0xa3;q=0xb1;break;}
   case 2:{p=0xa3;q=0xb2;break;}
   case 3:{p=0xa3;q=0xb3;break;}
   case 4:{p=0xa3;q=0xb4;break;}
   case 5:{p=0xa3;q=0xb5;break;}
   case 6:{p=0xa3;q=0xb6;break;}
   case 7:{p=0xa3;q=0xb7;break;}
   case 8:{p=0xa3;q=0xb8;break;}
   case 9:{p=0xa3;q=0xb9;break;}
 }
 
}
void chushihua()
{
uchar y;
DDRC=0xFF;
PORTC=0xFF;
y=0x30;
songkongzhi(y);
delay(700);
y=0x0C;
songkongzhi(y);
delay(700);
y=0x01;
songkongzhi(y);
delay(700);
y=0x14;
songkongzhi(y);
delay(700);
}
//----------------------------------------------------------------------------
//delayus
//功能:us 延时
void delayus(unsigned char i)
{
 while(i)
 i--;
}
//-----------------------------------------------------------------------------
//名称:I2C_Start
//功能:启动I2C
void I2C_Start (void)         //I2C发送开始位
{
 DDRD|=(1<<5);
 DDRD|=(1<<6);  //将PD5数据端口(SDA),PD6时钟端口(SCL)设为输出
 PORTD|=(1<<5);  //将数据端口(SDA)设为高
  PORTD|=(1<<6);  //将时钟端口(SCL)设为高
 delayus(4); 
 PORTD&=~(1<<5);  //将数据端口(SDA)设为低
 delayus(4);
 PORTD&=~(1<<6);
 }
//-------------------------------------------------------------------------------
//名称:I2C_Stop
//功能:停止I2C
void I2C_Stop (void)          //I2C发送停止位
{
 DDRD|=(1<<5);
 DDRD|=(1<<6);                  //将PD5数据端口(SDA),PD6时钟端口(SCL)设为输出
 PORTD&=~(1<<5);            //将数据端口(SDA)设为低
 PORTD|=(1<<6);                //将时钟端口(SCL)设为高
 delayus(4);
 PORTD|=(1<<5);            //将数据端口(SDA)设为高
 delayus(4);
 PORTD&=~(1<<6);
}
//---------------------------------------------------------------------------
//名称:I2C_Ackn
//功能:发送完,检查
unsigned char I2C_Ackn(void)
{
 unsigned char errtime=255;
 DDRD|=(1<<6);//时钟设置为输出
 DDRD&=~(1<<5);// 设置数据口(SDA)为输入 
 delayus(4);  
 while((PIND&0x20)==0x20) 
 {
    errtime--;
    if (!errtime)//errtime=0,没接收到
    {
   I2C_Stop();
    return 0x00;
    }
  }  
 PORTD|=(1<<6);//时钟置位
 delayus(4); 
 PORTD&=~(1<<6); // 将时钟端口(SCL)设为低
 delayus(4);
 return 0x01;//true 
}

//-----------------------------------------------------------------------------
//名称:Write_I2C_Byte
//功能:写一个字节到I2C设备
void Write_I2C_Byte(unsigned char byte)     
{
 unsigned int i;
 i=8;
 DDRD|=(1<<5);
 DDRD|=(1<<6);  //将PD5数据端口(SDA)设为输出,PD6时钟设置成输出
 while(i--)
 {
 if((byte&0x80)==0x80)
 {
 PORTD|=(1<<5);//这位为1
 PORTD|=(1<<6);
 delayus(4);
 PORTD&=~(1<<6);
 }
 else
 {
 PORTD&=~(1<<5);
 PORTD|=(1<<6);
 delayus(4);
 PORTD&=~(1<<6);
 }
 byte=byte<<1;
 }
 if (I2C_Ackn()==0)// Check for acknowledge from I2C device
 return;
}
//----------------------------------------------------------------------------
//名称

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -