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

📄 pcf8563.txt

📁 51单片机的时间显示
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  {
   x=0; //列起始
    y ^= 1; //行切换
  }
 }
}

/*****************************************************************
*功能: m1602复位
*形参: 无
*返回值:无
*备注: 无
*****************************************************************/
void m1602_Rst()
{
 Delay5ms(); //延时15ms
 Delay5ms();
 Delay5ms();
 m1602_WrC( 0x38,0 ); //置显示模式
 Delay5ms();   //连续三次
 m1602_WrC( 0x38,0 ); //不检测忙信号
 Delay5ms();
 m1602_WrC( 0x38,0 );
//----------------------//以后每次都要检测忙信号
 m1602_WrC( 0x38,1 ); //写指令(指令号,1-检测忙信号 0-不检测)
 m1602_WrC( 0x08,1 ); //关显示
 m1602_WrC( 0x01,1 ); //显显示屏
 m1602_WrC( 0x06,1 ); //读/写一字符后,地址/光标均加一
 m1602_WrC( 0x0c,1 ); //开显示
}

/*****************************************************************
*功能: m1602上电初始化
*形参: 无
*返回值:无
*备注: 无
*****************************************************************/
void m1602_PowerUp( void )
{
 Delay400ms(); //启动延时,等待LCD进入工作状态
 m1602_Rst();  //LCD复位
 Delay5ms();  //延时5MS,开始显示
}


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

//   I2C总线驱动程序+PCF8563驱动-------PCF8563-Drivers.c

//定义F0为非应答标志位

/*******************************************************
电路连接:
   SDA --> P3.5
   SCL --> P3.4
   ACK --> P3.7
*******************************************************/
//注:当收不到ACK应答时,P3.7为低电平,D4亮

/********************************************************
*函数说明:
* void I2C_Str( void )
* void I2C_Stop( void )
* void MAck( void )
* void CAck( void )
* void I2C_WrC( byte dd )
* byte I2C_RdC( void )
* void I2C_WrS( byte sla,byte *ss,byte n)
* void I2C_RdS( byte sla,byte *ss,byte n)
********************************************************/

#define DELAY5US  _nop_();_nop_();_nop_();_nop_();_nop_();

byte idata timeR[] = "00:00:00";
byte idata dateR[] = "00/00/00 - 0";
byte idata TimeDate[7];

sbit sda = P3^5;
sbit scl = P3^4;
sbit ACKt = P3^7;

/********************************************************
* 名称:起始位函数
* 形参:无
********************************************************/
void I2C_Str( void )
{
 sda = 1;
 scl = 1; //启动I2C总线
 DELAY5US
 sda = 0; //拉下SDA
 DELAY5US  //I2C总线要求起止建立时间>4us
 scl = 0; //拉下SCL
}

/********************************************************
* 名称:停止位函数
* 形参:无
********************************************************/
void I2C_Stop( void )
{
 sda = 0; //停止I2C总线传送
 scl = 1; //释放SCL
 DELAY5US
 sda = 1; //释放SDA
}

/********************************************************
* 名称:ACK信号发送函数
* 形参:无
* 备注:F0的值会影响发出的应答信号
********************************************************/
void MAck( void ) //发出ACK信号
{
 sda = F0; //由F0决定给应答标志或非应答标志
 scl = 1;
 scl = 0;
 sda = 0;
}

/********************************************************
* 名称:ACK信号检测函数
* 形参:无
* 备注:调用此函数后,影响F0
********************************************************/
void CAck( void ) //检测ACK信号
{
 sda = 1; //释放数据总线
 scl = 1;
 F0 = sda; //将ACK信号存入F0标志位中
 scl = 0;
 sda = 0;
 if( F0 ) ACKt = 0;
}

/********************************************************
* 功能:向总线上写一个字节,并检测ACK
* 形参:所写的内容
********************************************************/
void I2C_WrC( byte dd )
{
 byte temp,n=8;
 temp = dd;
 while( n-- )
 {
  if( (temp & 0x80) == 0x80 ) sda = 1;
  else sda = 0;
  scl = 1;
  scl = 0;
  temp = temp << 1;
 }
 CAck();
}

/********************************************************
* 功能:从总线上读取一个字节,同时给出ACK
* 形参:无
* 返回值:读到的字节
********************************************************/
byte I2C_RdC( void )
{
 byte temp,n=8;
 sda=1;
 while( n-- )
 {
  temp = temp << 1;
  scl = 1;
  if( sda ) temp = temp | 0x01;
  scl = 0;
 }
 MAck();
 return(temp);
}

/********************************************************
* 功能:从总线上读取若干字节
* 形参:字节地址,数据指针,字节个数
* 返回值:读到的数据由指针返回
********************************************************/
void Rd_time( void )
{
 byte *p,n=7;
 p = TimeDate;
 I2C_Str();
 I2C_WrC( 0xa2 );
 I2C_WrC( 0x02 );
 I2C_Str(); //重启动
 I2C_WrC( 0xa3 );
 while( n-- )
 {
  if( n ) F0 = 0; //传送完一个字节,发出一个应答信号
  else F0 = 1; //当全部字节传送结束,给出非应答信号
  *p = I2C_RdC();
  p++;
 }
 I2C_Stop();
 //时间/日期格式转换
 TimeDate[0] &= 0x7f;
 TimeDate[1] &= 0x7f;
 TimeDate[2] &= 0x3f;
 TimeDate[3] &= 0x3f;
 TimeDate[4] &= 0x07;
 TimeDate[5] &= 0x1f;
 timeR[0] = (TimeDate[2] >> 4) + '0';
 timeR[1] = (TimeDate[2] & 0x0f) + '0';
 timeR[3] = (TimeDate[1] >> 4) + '0';
 timeR[4] = (TimeDate[1] & 0x0f) + '0';
 timeR[6] = (TimeDate[0] >> 4) + '0';
 timeR[7] = (TimeDate[0] & 0x0f) + '0';
 timeR[8] = 0;

 dateR[0] = (TimeDate[6] >> 4) + '0';
 dateR[1] = (TimeDate[6] & 0x0f) + '0';
 dateR[3] = (TimeDate[5] >> 4) + '0';
 dateR[4] = (TimeDate[5] & 0x0f) + '0';
 dateR[6] = (TimeDate[3] >> 4) + '0';
 dateR[7] = (TimeDate[3] & 0x0f) + '0';
 dateR[11]= (TimeDate[4] & 0x07) + '0';
 dateR[12]= 0;
}

void I2C_WrS(byte dz,byte dd)
{
 I2C_Str();
 I2C_WrC( 0xa2 );
 I2C_WrC( dz );
 I2C_WrC( dd );
 I2C_Stop();
}

void PCF8563_Up(void)
{
// byte m;
 I2C_WrS( 0x0e, 0x81);
 I2C_WrS(0x0f,64);

 I2C_WrS(0x01,0x11);
 I2C_WrS(0x00,0x00);

/* I2C_Str();
 I2C_WrC( 0xa2 );
 I2C_WrC( 0x02 );
 for(m = 0;m<7;m++)
  I2C_WrC(0x03);
 I2C_Stop();

/* I2C_WrC(0x01,0x00); //清控制寄存器1,使其工作于普通模式
 I2C_WrC(0x09,0x80); //清分报警
 I2C_WrC(0x0A,0x80); //清时报警
 I2C_WrC(0x0B,0x80); //清日报警
 I2C_WrC(0x0C,0x80); //清星期报警
 // I2C_WrC(0x0D,0x00);//CLKOUT端高阻
 // I2C_WrC(0x0E,0x03);//定时器倒计时关*/
}


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

// 4*4矩阵键盘驱动程序——KEY-Drivers.c
/********************************************************
                    适用于YT51DP-01单片机实验板
     作者:严铜
连接:
 ------------------------------------
   P1.0 P1.1 P1.2 P1.3
 p1.4 S1  S5  S9  S13
 P1.5 S2  S6  S10  S14
 P1.6 S3  S7  S11  S15
 P1.7 S4  S8  S12  S16
 ------------------------------------
********************************************************/
//uchar jps; //键盘缓存
bit Key_F1,Key_F2; //键扫描标志位

/*键盘扫描程序1,检查是否有按键*/
uchar keyfun()
{
 uchar key_c;
 P1 = 0xf0;
 key_c = P1;
 if(key_c == 0xf0)
 {
  Key_F2 = 1;
  return (0);
 }
 else return(1);
}

/*键盘扫描程序2,确定按键数值*/
uchar keyscan()
{
 uchar idata i,k,key_s;
 for(i=0 ; i<4 ;i++)
 {
  P1 = ~(0x10 << i);
  k = P1;
  if((k & 0x0f) == 0x0f) continue;
  else
  {
   key_s = ((~k) & 0x0f) >> 1;
   if(key_s == 0x04) key_s = 0x03;
   key_s *= 4;
   key_s += i+1;
  }
  return key_s;
 }
}

/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(15ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 3 /*当定时器中断时执行此函数*/
{
 byte jps;
 TH1=(0xffff-15000)/256;  /*T1初始化*/
 TL1=(0xffff-15000)%256;
// WR = 1;
 if( Key_F1 && keyfun() && Key_F2 )
 {
  Key_F2 = 0;
//  WR = 0;
  jps = keyscan();
  set_time( jps );
 }
 Key_F1 = keyfun();
}

/**********************************************************************
函数功能: 定时器上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void T1_PowerUp(void)
{
 TMOD = 0x10;   /*Time1/1为16计数器*/
 TH1=(0xffff-15000)/256; /*10ms*/
 TL1=(0xffff-15000)%256; /*10ms*/
 TR1=1;
 IE=0x89;    /*EA=1 ET1=1*/
}

⌨️ 快捷键说明

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