您当前的位置:五五电子网电子知识单片机-工控设备PIC单片机PIC16F877A单片机万年历程序 正文
PIC16F877A单片机万年历程序

PIC16F877A单片机万年历程序

点击数:7120 次   录入时间:03-04 11:37:01   整理:http://www.55dianzi.com   PIC单片机
* 标题:DS1302读写                                *
* 作者:Wujieflash                                   *
* 日期:2008年1月14日                           *
* 说明:日历显示范围:2000年--2099年  *
***************************************************/
#define  RST  RC0
#define  SCLK RC1
#define  IO   RC2
uch flag=0;
uch second=1,minute=1,hour=1,year=1,month=1,date=1,day=1;
uch clock[]={0};
uch DisCash[]={0x00,0x30,0x09,0x16,0x01,0x03,0x09};
/////往1302写入1Byte数据////////////////////////
void RTInputByte(uch d)
{
    uch i;
    TRISC=0x00;
    for(i=8; i>0; i--)
    {
      IO = d&0x01;      //取最低位
      SCLK = 1;         //上升沿发送
      SCLK = 0;         //恢复
      d = d >> 1;      
    }
}
///////从1302读取1Byte数据////////////////////////
uch RTOutputByte(void)
{
    uch i,val=0;
    TRISC2=1;            //设置为输入
    for(i=8; i>0; i--)
    {
      val = val >>1;        
      if(IO)val=val|0x80;// 从最低位开始接收
      SCLK = 1;          //下降沿接收
      SCLK = 0;
    }
     return(val);
}
///////先写地址,后写命令/数据//////////////////////////
void W1302(uch ucAddr, uch ucDa)
{
    RST = 0;
    SCLK = 0;
    RST = 1;                  //打开DS1302
    RTInputByte(ucAddr);      // /* 地址,命令 */
    RTInputByte(ucDa);        // /* 写1Byte数据*/
    SCLK = 1;
    RST = 0;                  //关闭DS1302
}
///////先写地址,后读命令/数据////////////////////////
uch R1302(uch ucAddr)
{
    uch ucData;
    RST = 0;
    SCLK = 0;
    RST = 1;
    RTInputByte(ucAddr);            // /* 地址,命令 */
    ucData = RTOutputByte();        // /* 读1Byte数据 */
    SCLK = 1;
    RST = 0;
    return(ucData);
}
/////////向1302写入 秒 分 时 日 月 星期 年 */////////////
void Set1302(uch *pClock)
{
    uch i;
    uch ucAddr = 0x80;          //起使地址
    W1302(0x8e,0x00);           ///* 控制命令,WP=0,允许写操作*/
    for(i =7; i>0; i--)
    {
      W1302(ucAddr,*pClock);    ///* 秒 分 时 日 月 星期 年 */
      pClock++;
      ucAddr +=2;               //写地址加2
    }
     W1302(0x8e,0x80);          // /* 控制命令,WP=1,写保护*/
}
////////从1302读出 秒 分 时 日 月 星期 年 *//////////////////
void v_Get1302(unsigned char  ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for(i=0;i
/////////与LCD的显示接口//////////////////////
void display()
{
 uch i;
 for(i=0;i

4.按键扫描与服务程序
/***************************************************
* 标题:按键扫描和服务                             *
* 作者:Wujieflash                                     *        
* 日期:2008年1月17日                             *
* 说明:当按键按下,选中的单元就会闪烁 *
***************************************************/
uch k=0;
//键盘初始化子程序
void keyinit()
{
 TRISD0=1;
 TRISD0=1;
 TRISD0=1;
}
/*----------------------------------------------------------*/
//键盘扫描子程序
void KeyScan()
{
 int d;
 if(RD0==0)  //设置键按下
 {
  k++;    //选定入口值
  k=k%8;
 }
 while(1)
 {
  if(RD0==1)break;//等待按键松开
 }
 switch(k)//键盘服务入口
 {
  case 1://设置秒
  {
   d=R1302(0x81);//读取秒
   d=d/16*10+d%16;//转换为16进制
   second=flag;   //设置秒的闪烁标志
   minute=1;      //其余变量不闪烁
   hour=1;
   year=1;
   month=1;
   date=1;
   day=1;
   if(second==0)  //闪烁
   {
    Show8X16_2(0,111,noshu);
    Show8X16_2(0,119,noshu);
   }
   if(RD1==0)     //秒数值加1
   {
    d++;
    if(d>0x3b)d=0;//大于59就为0
    d=d/10*16+d%10;
    W1302(0x80,d);//写入DS1302
    while(1)
    {
     if(RD1==1)break;//等待键松开
    }
   }
   if(RD2==0)//数值减1
   {
    d--;
    if(d0x3b)d=0;
    d=d/10*16+d%10;
    W1302(0x82,d);
    while(1)
    {
     if(RD1==1)break;
    }
   }
   if(RD2==0)
   {
    d--;
    if(d0x17)d=0;
    d=d/10*16+d%10;
    W1302(0x84,d);
    while(1)
    {
     if(RD1==1)break;
    }
   }
   if(RD2==0)
   {
    d--;
    if(d0x1f)d=1;

上一页  [1] [2] [3] [4]  下一页


本文关键字:单片机  程序  万年历  PIC单片机单片机-工控设备 - PIC单片机