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

📄 calendarclk.c

📁 基于时钟芯片DSC12C887的实时时钟系统
💻 C
字号:

#include <REG52.H>			    	// 引用标准库的头文件
#include <intrins.h>
#include <absacc.h>
#include<math.h>
#include<stdio.h>


#define uchar unsigned char
#define uint  unsigned int

/* DS12C887 内部专用寄存器宏定义 */
#define  SECOND  XBYTE[0x7F00]
#define  MIN     XBYTE[0x7F02]
#define  HOUR    XBYTE[0x7F04]
#define  WEEK    XBYTE[0x7F06]
#define  DAY     XBYTE[0x7F07]
#define  MONTH   XBYTE[0x7F08]
#define  YEAR    XBYTE[0x7F09]
#define  REG_A   XBYTE[0x7F0A]
#define  REG_B   XBYTE[0x7F0B]
#define  REG_C   XBYTE[0x7F0C]
#define  REG_D   XBYTE[0x7F0D]

/* 芯片DS12C887提供的日历时钟信息变量 */
uchar year,month,day,week,hour,minute,second;

#define Noop   0x00         		// 空操作寄存器
#define Digit0 0x01         		// 数码管1寄存器
#define Digit1 0x02         		// 数码管2寄存器
#define Digit2 0x03         		// 数码管3寄存器
#define Digit3 0x04         		// 数码管4寄存器
#define Digit4 0x05         		// 数码管5寄存器
#define Digit5 0x06         		// 数码管6寄存器
#define Digit6 0x07         		// 数码管7寄存器
#define Digit7 0x08         		// 数码管8寄存器

#define Digit8  0x01         		// 数码管9寄存器
#define Digit9  0x02         		// 数码管10寄存器
#define Digit10 0x03         		// 数码管11寄存器
#define Digit11 0x04         		// 数码管12寄存器
#define Digit12 0x05         		// 数码管13寄存器
#define Digit13 0x06         		// 数码管14寄存器
#define Digit14 0x07         		// 数码管15寄存器
#define Digit15 0x08         		// 数码管16寄存器


#define DecodeMode   0x09     		// 译码模式寄存器
#define Intensity    0x0A     		// 亮度寄存器
#define ScanLimit    0x0B      		// 扫描位数寄存器
#define ShutDown     0x0C       	// 低功耗模式寄存器
#define DisplayTest  0x0D    		// 显示测试寄存器


#define ShutdownMode     0x00      	// 低功耗方式
#define NormalOperation  0x01   	// 正常操作方式

#define ScanDigit        0x07       // 扫描位数设置,显示8位数码管
#define DecodeDigit      0xFF       // 译码设置,8位均为BCD码
#define IntensityGrade   0x0A    	// 亮度级别设置

#define TestMode         0x01       // 显示测试模式
#define TextEnd          0x00       // 显示测试结束,恢复正常工作模式


sbit DIN  = P1^0;					// 串行数据输入
sbit CLK  = P1^1;					// 串行时钟
sbit LOAD = P1^2;					// 显示数据锁存控制

/*按键设置*/
sbit  SET=P1^3;
sbit  ADD=P1^4;
sbit  MOVE=P1^5;
sbit  SUB=P1^6;


/* 延时t毫秒 */
void delay(uint t)
{
	uint i;														                                                                                                                                                                                        
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}



/* 向MAX7219写入字节(8位)*/
void  Write_Max7219_byte(uchar byte)
{
   uchar i,temp;
   for (i=0;i<8;i++)
    {
		temp=byte&0x80;
    	byte=byte<<1;
        if(temp)
        {
        	DIN=1;	 //写1 
           	CLK=0;
        	CLK=1;
        }
        else
        {
        	DIN=0;	   //写0 
        	CLK=0;
        	CLK=1;
        }
    }
}

/* 向两片MAX7219写入字(32位)*/
void Write_Max7219(uchar address1,uchar data1,uchar address2,uchar data2)
{ 
    LOAD=0;
    Write_Max7219_byte(address2);
    Write_Max7219_byte(data2);
	Write_Max7219_byte(address1); 
   	Write_Max7219_byte(data1);
    LOAD=1;                 
}


/* MAX7219初始化 */
void Init_Max7219 (void)
{
   Write_Max7219 (ScanLimit,ScanDigit,ScanLimit,ScanDigit);           // 设置扫描界限
   Write_Max7219(DecodeMode,DecodeDigit,DecodeMode,DecodeDigit);      // 设置译码模式
   Write_Max7219(Intensity,IntensityGrade,Intensity,IntensityGrade);  // 设置亮度
   Write_Max7219(ShutDown,NormalOperation,ShutDown,NormalOperation);  // 设置为正常工作模式

}



void Judge_busy(void)
{ 
while( REG_A & 0x80 );                     //忙则循环等待
}



 /*设置时间函数*/
void Settime(void)
{
   	uchar  i;
    REG_B = 0x86;       // 寄存器B, 时标寄存器用BCD码表示,为24小时工作模式
    YEAR = year; 
	MONTH = month;
	DAY = day;
    HOUR = hour; 
	MIN = minute;
	SECOND = second;     
    REG_A = 0x20;       // 开启RTC
    i=REG_C;
	i=REG_D;
	REG_B = 0x06;      // 芯片处于正常工作状态, BCD模式
}


/* 读取日历时钟函数 */
void Gettime(void)
{
        Judge_busy( );
	    year = YEAR;
		Judge_busy( );
		month = MONTH;
		Judge_busy( );
		day = DAY;
		Judge_busy( );
        hour = HOUR;
	    Judge_busy( );
		minute = MIN;
	    Judge_busy( );
		second=SECOND;

}


/* 数码管显示年、月、日、时、分、秒*/
void Display()
 {
    Write_Max7219 (Digit0,2,Digit8,hour/10);
    Write_Max7219 (Digit1,0,Digit9,hour%10);
    Write_Max7219 (Digit2,year/10,Digit10,minute/10);
    Write_Max7219 (Digit3,year%10,Digit11,minute%10);
    Write_Max7219 (Digit4,month/10,Digit12,second/10);
    Write_Max7219(Digit5,month%10,Digit13,second%10);
    Write_Max7219 (Digit6,day/10,Digit14,0);
    Write_Max7219(Digit7,day%10,Digit15,0);
 }


void main( )
{     
     
      Init_Max7219( );
	   year   = 7;  //写入时间:2007年04月09日15时38分10秒(要设定的时间)
       month  = 4;
       day    = 9;
       hour   = 22;
       minute = 37;
       second = 10;
       Settime( );
	
	while(1)
	 {
	  Gettime();   //读取的时间数据在变量year/month/day/hour/minute/second中
      Display();
    
	if(SET==0)
	  {
	    REG_A=0x70;   
        
	   if(ADD==0&&MOVE==1)
		   {
		     REG_A=0x70;
		     delay(55);
			if(ADD==0&&MOVE==1)
				{
				 minute++;
				if(minute>59)
					{
					minute=0;
				    hour++;
                     }
				}
				 Settime();
				 Gettime();   //读取的时间数据在变量year/month/day/hour/minute/second中
                 Display();

		     }

   	       else if(SUB==0&&MOVE==1)
			       {
				     delay(55);
				  if(SUB==0&&MOVE==1)
				        {
						minute--;
					    if(minute<1)
					    {
						  minute=59;
						  hour--;
                        }
					  }

					Settime();
				    Gettime();   //读取的时间数据在变量year/month/day/hour/minute/second中
                    Display();
			 }


      else if(ADD==0&&MOVE==0)
			       {
				     delay(55);
					
					 if(ADD==0&&MOVE==0)
				        {
						hour++;
					    if(hour>23)
					    {
						  hour=0;
						  day++;
                        }
					  }

					 Settime();
				     Gettime();   //读取的时间数据在变量year/month/day/hour/minute/second中
                     Display();
			 }
	 else if(SUB==0&&MOVE==0)
			       {
				     delay(55);
					
					 if(SUB==0&&MOVE==0)
				        {
						hour--;
					    if(hour<1)
					    {
						  hour=23;
						  day--;
                        }
					  }

					Settime( );
				  Gettime();   //读取的时间数据在变量year/month/day/hour/minute/second中
                 Display();
			 }


	




		} 
 	  else
	   { 
	    REG_A=0x20;
	    }
   }
}

⌨️ 快捷键说明

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