📄 pcf8563.txt
字号:
主函数:PCF8563.c
#include <ytc51.h>
#include <m1602_drivers.c>
#include <PCF8563_drivers.c>
#include <KEY_Drivers.c>
byte getday( void )
{
byte days;
word year;
year = ((TimeDate[6] >> 4) * 10) + (TimeDate[6] & 0x0f);
year += 2000;
switch (TimeDate[5])
{
case 4:
case 6:
case 9:
case 0x11:days=0x30;
break;
case 2:
if( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) )
days=0x29;
else days=0x28;
break;
default:days=0x31;
break;
}
return days;
}
void timeadd( byte i )
{
TimeDate[i] += 1;
if( (TimeDate[i] & 0x0f) == 0x0a )
TimeDate[i] += 6;
}
void timedec( byte i )
{
TimeDate[i] -= 1;
if( (TimeDate[i] & 0x0f) == 0x0f )
TimeDate[i] -= 6;
}
//调时子程序
void set_time( byte t )
{
byte i;
switch (t)
{
case 1: if(TimeDate[2] == 0x23) TimeDate[2] = 0;
else timeadd(2);
i = 4;
break;
case 2: if(TimeDate[1] ==0x59) TimeDate[1] = 0;
else timeadd(1);
i = 3;
break;
case 4: if(TimeDate[4] == 0x06) TimeDate[4] = 0;
else TimeDate[4] += 1;
i = 6;
break;
case 5: if(TimeDate[2] == 0) TimeDate[2] = 0x23;
else timedec(2);
i = 4;
break;
case 6: if(TimeDate[1] == 0) TimeDate[1] = 0x59;
else timedec(1);
i = 3;
break;
case 8: if(TimeDate[4] == 0) TimeDate[4] = 6;
else TimeDate[4] -= 1;
i = 6;
break;
//*--------------------------------------------------------------
case 9: if(TimeDate[6] == 0x99) TimeDate[6] = 0;
else timeadd(6);
i = 8;
break;
case 10:if(TimeDate[5] == 0x12) TimeDate[5] = 1;
else timeadd(5);
i = 7;
break;
case 11:if(TimeDate[3] == getday() ) TimeDate[3] = 1;
else timeadd(3);
i = 5;
break;
// case 12:clk_F = ~clk_F; //正常/闹铃切换
// m1602_WrC( 0x01,1);
// I2C_WrS(10,clk,3);
// break;
case 13:if(TimeDate[6] == 0) TimeDate[6] = 0x99;
else timedec(6);
i = 8;
break;
case 14:if(TimeDate[5] == 1) TimeDate[5] = 0x12;
else timedec(5);
i = 7;
break;
case 15:if(TimeDate[3] == 1) TimeDate[3] = getday();
else timedec(3);
i = 5;
break;
//-------------------------------------------------------------*/
case 16:I2C_WrS( 0x02,0 );
I2C_WrS( 0x03,0 );
I2C_WrS( 0x04,0 );
I2C_WrS( 0x05,1 );
I2C_WrS( 0x06,1 );
I2C_WrS( 0x07,1 );
I2C_WrS( 0x08,7 );
break;
}
if( t != 16 )
I2C_WrS( i,TimeDate[i-2] );
}
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(15ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void INT0_Func() interrupt 0 /*当定时器中断时执行此函数*/
{
Rd_time();
m1602_DisS(0,0,dateR);
m1602_DisS(0,1,timeR);
}
main()
{
m1602_PowerUp();
// IE = 0x81;
PCF8563_Up();
T1_PowerUp();
while(1)
{
;
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
头文件ytc51.h
#include<reg52.h>
#include<intrins.h> //可选,当需用_nop_()时,使用它
/******************************************************
* 数据简洁定义
******************************************************/
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
#define uchar unsigned char
#define uint unsigned int
/******************************************************
* 外部变量定义
******************************************************/
/******************************************************
* 外部函数声明
******************************************************/
void set_time( byte t );
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
m1602驱动:m1602_Drivers.c
/*******************************************************************
1602显示屏驱动
作者:严铜
--------------------
连接线图:
---------------------------------------------------
| LCD-----51 | LCD-----51 | LCD------51 |
|-------------------------------------------------|
| DB0-----P0.0 | DB4-----P0.4 | RW-------P2.0 |
| DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 |
| DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
---------------------------------------------------
[注:AT89S52使用11.0592M晶振]
*******************************************************************/
#define DB P0
sbit m1602_RS = P2^0;
sbit m1602_RW = P2^1;
sbit m1602_E = P2^2;
sbit DB7 = DB^7;
/*****************************************************************
*功能: 延时函数
*形参:
*返回值:
*备注:
*****************************************************************/
// 短延时5MS
void Delay5ms(void)
{
word i=5552;
while(i--);
}
//长延时400MS
void Delay400ms(void)
{
byte i=5;
word j;
while(i--)
{
j=7269;
while(j--);
};
}
/*****************************************************************
*功能: 检测忙信号
*形参:
*返回值:
*备注:
*****************************************************************/
void Busy()
{
do
{
DB = 0xff;
m1602_RS = 0;
m1602_RW = 1;
m1602_E = 1;
_nop_();
}while( DB7 );
}
/*****************************************************************
*功能: 写入指令
*形参: dd_指令码 jc_忙信号检测标志位
*返回值:
*备注: RS=0 RW=0 E下降沿
*****************************************************************/
void m1602_WrC( byte dd , byte jc )
{
if(jc) Busy();
m1602_RS = 0;
m1602_RW = 0;
DB = dd;
m1602_E = 1;
_nop_();
m1602_E = 0;
}
/*****************************************************************
*功能: 写入数据
*形参: dd_数据
*返回值:
*备注: RS=1 RW=0 E下降沿
*****************************************************************/
void m1602_WrD( byte dd)
{
Busy();
m1602_RS = 1;
m1602_RW = 0;
DB = dd;
m1602_E = 1;
_nop_();
m1602_E = 0;
}
/*****************************************************************
*功能: 指定位置显示一个字符
*形参: 位置坐标 字符内容
*返回值:
*备注:
*****************************************************************/
void m1602_DisC(byte x,byte y,byte dd)
{
y &= 0x1;
x &= 0xF; //限制X不能大于15,Y不能大于1
if (y)
{
x |= 0x40; //当要显示第二行时地址码+0x40;
}
x |= 0x80; // 算出指令码 => 80H + 真实地址码
m1602_WrC(x, 0); //这里不检测忙信号,发送地址码
m1602_WrD(dd);
}
/*指定位置显示一个两位数
void m1602_DisD(byte x,byte y,byte dd)
{
byte h,l;
h = dd/10 + 0x30;
l = dd%10 + 0x30;
m1602_DisC(x++,y,h);
m1602_DisC(x,y,l);
}
/*****************************************************************
*功能: 指定位置显示一有符号整数
*形参: x,y_显示起始位置 dd_显示内容
*返回值:
*备注:
*****************************************************************
void m1602_Disint( byte x,byte y,byte dd)
{
byte dds[4];
byte i;
if(dds > 127)
{
dds[0] = '-';
dd -= 1;
dd = ~dd;
}
else
{
dds[0] = ' ';
}
dds[1] = dd/100 + 0x30;
dds[2] = dd/10%10 + 0x30;
dds[3] = dd%10 + 0x30;
for(i=0 ;i<4; i++)
{
if(dds[i] > 0x2f)
m1602_DisC(x++,y,dds[i]);
}
}
/*****************************************************************
*功能: 指定位置显示一串字符
*形参: x,y_显示起始位置 *dd_显示内容
*返回值:
*备注:
*****************************************************************/
void m1602_DisS(byte x,byte y,byte *dd)
{
byte i,l=0;
while (dd[l] >31){l++;}; //判断字符串长度
for (i=0;i<l;i++)
{
m1602_DisC(x++,y,dd[i]);
if (x==16)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -