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

📄 c51ds12887.c

📁 C51 ds12887时钟程序,运行环境为伟福仿真环境
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************DS12887 时钟日历芯片调试******************/
/****************作者:韩宝俊 *******************************/

/*********************************************************

管脚配置:
MOT: 接地
CS:  接地  地址:0x00
AS:  接单片机 ALE
R/W: 接 RW  P3.6
DS:  接 RD  P3.7
RESET: 接高
IRQ: 空
SQW: 空
AD0-AD7 接 P1.0-P1.7

/************************************************************/

/************************************************************/
#include <absacc.h>
#include <reg52.h>
#define uchar unsigned char
uchar xdata *chRegA ;
uchar xdata *chRegB ;
uchar xdata *chRegC ;
uchar xdata *chRegD ;
uchar xdata *newaddr ;

uchar k1, k2, orignalNumber, nowNumber ;

uchar key, cnt = 40, tag1 = 0, flag = -1 ;

uchar key1 = 0 , key2 = 0 , key3 = 0 , key4 = 0 ;

uchar idata dt[7] = {05, 11, 29, 2, 10, 21, 25} ;

uchar at[7] = {9, 8, 7, 6, 4, 2, 0} ;  /* 年、月、日,星期、时、分、秒 */

uchar xdata *addr = 0x00 ;            /* 片选地址 */

unsigned char DispCode[]={0x05,0xAF,0x16,0x0E,0xAC,
                          0x4C,0x44,0x2F,0x04,0x0C
                         };  /* 字形码库 0,1,2,3,4,5,6,7,8,9 */


void DelayT(unsigned int time) ;
void Start_calendar() ;
void stop_calendar() ;
void blinkfun() ;
void initatat() ;
void set_calendar() ;
uchar read_calendar(uchar display[7]) ;
void write_calendar(uchar xdata *newaddr) ;
void LEDdisplay(uchar display[]) ;

/**************************************************************/
             /*该函数解决光标在特定位置上闪烁 */
/**************************************************************/
  void blinkfun()
        {
                  uchar i, temp ;

                  k1 = k2= 1 ;
                  i = 0 ;
                  SCON = 0 ;
                  TI = 0 ;
                  SBUF = 0x16 ;
                  while(!TI)
                      {
                      }
	          TI = 0 ;
                  SBUF = 0x05 ;
                  while(!TI)
                      {
                      }
	          TI = 0 ;
                  while(addr+at[i]>newaddr)
                      {
                          if((addr+at[i])!= 0x06)
                            {
                               SBUF = DispCode[*(addr+at[i])/10] ;
                               while(!TI)
                                  {
                                  }
                               TI = 0 ;

                             }
                          SBUF = DispCode[*(addr+at[i])%10] ;
                          i++ ;
                      }

                  if(flag%2 == 0)
                   {
                      temp = DispCode[*newaddr/10] ;
                      if(newaddr!= 0x06)
                       {
                         if(k1)
                          {
                            SBUF = 0xff ;
                            while(!TI)
                             {
                             }
                            TI = 0;
                            k1 = 0;
                          }
                         else
                          {
                            SBUF = temp ;
                            while(!TI)
                               {
                               }
                            TI = 0 ;
                            k1 = 1 ;
                          }
                       }
                      SBUF=DispCode[*newaddr%10] ;
                      while(!TI)
                         {
                         }
                      TI = 0 ;
                   }

                else
                   {

                      if(newaddr!= 0x06)
                       {
                         SBUF=DispCode[*newaddr/10] ;
                         while(!TI)
                            {
                            }
                         TI = 0 ;
                        }
                      temp = DispCode[*newaddr%10] ;
                      if(k2)
                      {
                        SBUF = 0xff ;
                        while(!TI)
                           {
                           }
                        TI = 0 ;
                        k2 = 0 ;
                       }
                       else
                        {
                          SBUF = temp ;
                          while(!TI)
                            {
                            }
                          TI = 0 ;
                          k2 = 1 ;
                        }
                     }
                ++i ;
                while(i<7)
                        {
                            if(addr+at[i]!= 0x06)
                             {
                                  SBUF = DispCode[*(addr+at[i])/10];
                                  while(!TI)
                                    {
                                    }
                                   TI = 0 ;

                              }
                             SBUF = DispCode[*(addr+at[i])%10] ;
                             while(!TI)
                                {
                                }
                             TI = 0 ;
                             i++ ;
                        }

              DelayT(10000) ;

       }


/****************************************************************/
                         /* 延时函数 */
/**************************************************************/


void DelayT(unsigned int time)
{
   unsigned int i;
   for(i = 0;i< time;i++)
   ;
}


/**************************************************************/
                      /* 启动时钟芯片*/
/**************************************************************/

void Start_calendar()
{
        *chRegA = 0x20 ;
        *chRegB = 0x06 ;
}


/********************************************************/
                       /* 芯片停止运行 */
/**********************************************************/

void stop_calendar()

     {
         *chRegA=0x70 ;
     }



 /********************************************************/
                    /*  初始化时钟芯片 */
 /***********************************************************/
void initatat()
 {
   Start_calendar() ;
   ACC = *chRegC ;     /*读寄存器C,清零中断请求标志*/
   ACC = *chRegD ;   /*读寄存器D,使VTR=1,数据有效*/
 }


/*******************************************************/
                  /*设置系统时间 */
/*******************************************************/

 void set_calendar()
 {
    uchar i ;
    *chRegB = 0x80;
    for(i = 0;i<= 6;i++)
    *(addr+at[i]) = dt[i] ;
  }

/***********************************************************/
                       /*读时钟芯片 */
/************************************************************/

uchar read_calendar(uchar display[7])
{
    uchar i ;
    *chRegB = 0x06;
    for(i = 0;i<= 6;i++)
    display[i] = *(addr+at[i]) ;

 }


/*****************************************************************/
                        /*修改时钟函数*/
/*****************************************************************/


void write_calendar(uchar xdata *newaddr)
{
 uchar temp1, temp2;
 if(key2|key4)
  {
     if(key2)         /*实现“+”功能*/

       {
             if(flag%2== 0)        /* flag 为偶数时,修改对应的时间高位*/
                {
                     temp2 = *newaddr%10 ;
                     temp1 = *newaddr/10 ;
                     if(newaddr!= 0x06)
                        {
                           if(newaddr!= 0x00)
                               {
                                   temp1++ ;
                               }
                           else
                               {
                                   stop_calendar() ;
                                   temp1++ ;

⌨️ 快捷键说明

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