📄 pcf8563.c.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 + -