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

📄 pcf8563.txt

📁 51单片机的时间显示
💻 TXT
📖 第 1 页 / 共 2 页
字号:
主函数: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 + -