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

📄 cc.c

📁 此程序是使用ds12887始终芯片实现度时间的显示
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char code Tab[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};
unsigned char code	Tabc[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit Dat=P1^3;
sbit G=P1^1;
sbit SCK=P1^2;							
sbit rck=P1^4;
sbit readkey=P1^0;
sbit scs= P1^5;
//sbit beer=P2^0;
#define REG_A XBYTE[0x030A]
#define REG_B XBYTE[0x030B]
#define REG_C XBYTE[0x030C]
#define REG_D XBYTE[0x030D]
uchar xdata *DS12887=0x0300;
uchar code PIAN_YI[6]={0,2,4,7,8,9, };/*-- 年、月、日、时、分、秒-- */
uchar idata DS12887_time[6],dao_time[3];
uchar c,v,k,key,k1,k2,k3,k4,dao[8],key_count;
uchar idata Time[10];/*-----提取时间各个位数据-----*/
void key_wait();
void delay()			
{
	uchar i,j,h;									 
	for(i=2;i>0;i--)
	for(j=3;j>0;j--)
	for(h=100;h>0;h--);
}
void delay10(void)
{
    unsigned char i,j,k;
     for(i=30;i>0;i--)
     for(j=40;j>0;j--)
     for(k=240;k>0;k--);
}
///void delayms(unsigned char a)
//{while(--a); }
void out(void)
{
	rck=0;
	_nop_();
	rck=1;
}
void send_num(uchar num)
{
	uchar j;
	for(j=0;j<8;j++)
	{
		SCK=0;
        Dat=num&0x80;
		SCK=1;
		num=num<<1;
	}
	SCK=0;
}
void seat0(uchar j,uchar i,uchar h)
{
	uchar num,a;
	G=1;
	num=Tab[j];
	send_num(Tab[h]);
    send_num(num);
	a=Tabc[i];
	send_num(a);
    G=0;
	out();
}
uchar seat(uchar j,uchar i,uchar h)
{
	uchar num,a,x0,x1,x2,x3;
	G=1;
	num=Tab[j];
	send_num(Tab[h]);
    send_num(num);
	a=Tabc[i];
	send_num(a);
    G=0;
	out();
	delay();
	
	   	if(readkey==0&&a==Tabc[0])	
	    {
			x0++;
		
			if(x0==20)
			{	
				x0=0;
				return 1;
		    }
		 }
		if(readkey==0&&a==Tabc[1])
		{
		     x1++;
		  if(x1==20)
		   {
		   	 x1=0;
		   	 return 2;
		   }
		 } 
		if(readkey==0&&a==Tabc[2])
		{
		   x2++;
		   if(x2==20)
		   {
		   	 x2=0;
		   	 return 3;
		   }
	   }
		if(readkey==0&&a==Tabc[3])
		{
		   x3++;
		   if(x3==20)
		   {
		   	 x3=0;
		   	 return 4;
		   }
		} 
	 
 }
void DS12887_Read(void)		 // 读取实时时间
{
	uchar idata h,i;
	
	do
	
	{ 
	
		h=REG_A;
	
	}while(h&0x80);
	
	for(i=0;i<6;i++)
	
	{
	
		DS12887_time[i]=*(DS12887+PIAN_YI[i]);
	
	}

}	
void set_p(uchar a,uchar j)
{
	if(	*(DS12887+a)+1>=0&&*(DS12887+a)+1<j)
	{
		*(DS12887+a)=*(DS12887+a)+1;
		
	}
}
void set_m(uchar a,uchar j)
{
	if(	*(DS12887+a)-1>=0&&*(DS12887+a)-1<j)
	{
		*(DS12887+a)=*(DS12887+a)-1;
		
	}
}
 void read_timebit(uchar a)
{
  	   	DS12887_Read();
		Time[0]=DS12887_time[0]%10;//秒个位0~9
		Time[1]=DS12887_time[0]/10;//秒十位0~5
	   	Time[3]=DS12887_time[1]%10;//分个位0~9
		Time[4]=DS12887_time[1]/10;//分十位0~5
		Time[6]=DS12887_time[2]%10;//时个位0~9
		Time[7]=DS12887_time[2]/10;//时十位0~2
	//	Time[6]=DS12887_time[3]%10;//日个位0~9
	//	Time[7]=DS12887_time[3]/10;//日十位0~3
	//	Time[8]=DS12887_time[4]%10;//月个位0~9
	//	Time[9]=DS12887_time[4]/10;//月十位0~1
	//	Time[10]=DS12887_time[5]%10;//年个位0~9
	  //  Time[11]=DS12887_time[5]/10;//年十位0~9
		if(a==1)
		{
		dao[0]=dao_time[0]%10;
		dao[1]=dao_time[0]/10;
		dao[3]=dao_time[1]%10;
		dao[4]=dao_time[1]/10;
		dao[6]=dao_time[2]%10;
		dao[7]=dao_time[2]/10;
		}
}
void key_wait()
{
	uchar m,i;
	do
	{
	
		    for(m=0;m<8;m++)
			{
			   key=seat(Time[m],m,dao[m]);
			 }
	}while(key==1);

} 
void change_0()
{
    uchar i,j,m,add=2,key;	 
    REG_A=0;
	for(i=0;i<3;i++)
	{
		dao_time[i]=0;
	}
	for(i=80;i>0;i--)
	{
		for(m=0;m<8;m++)
		{
		   key=seat(Time[m],m,dao[m]);
		 
		   if(key==1)
			{   	
		   		//if(key_count==1)
				k++;
		   		key_wait();			
			       	
			}
		 	
		   if(key==2)
		   {
		   set_p(add,60);
		   }
		   if(key==3)
		   set_m(add,60);
		   if(key==4)
		  {
			REG_A=0x20;
			REG_B=0x06;
			c=0;
		   }
			if(k==0)
			add=0;
			if(k==1)
			add=2;
			if(k==2)
			add=4;
			if(k==3)
			{
				c=0;
				REG_A=0x20;
				REG_B=0x26;
			}
	 
	  }
	}
	for(j=80;j>0;j--)
	{
		for(m=0;m<8;m++)
		{
			switch(k)
			{
			    case 0 :if(m==0||m==1)
					   {
				    	  key=seat(11,m,dao[m]);					     
					   }
					   else
					   key=seat(Time[m],m,dao[m]);break;
				case 1:if(m==3||m==4)
					   {
				    	  key=seat(11,m,dao[m]);					     
					   }
					   else
					   key=seat(Time[m],m,dao[m]);break;	
				case 2:if(m==6||m==7)
					   {
					    	key=seat(11,m,dao[m]);					     
						}
						else
						key=seat(Time[m],m,dao[m]);break;
				default:for(m=0;m<8;m++)
		                {
		   					key=seat(Time[m],m,dao[m]);
						}
					 	c=0;
						REG_A=0x20;
						REG_B=0x26;
						break;
			}
		
		 
			if(key==1)
			{
			//if(key_count==1)
			k++;
			key_wait();
				
			}
		  
			if(key==2)
			{
	    	set_p(add,60);
			} 
	    	if(key==3)
		    set_m(add,60);
			if(key==4)
		   {
		   	 c=0;
			REG_A=0x20;
			REG_B=0x06;
		   }
			if(k==0)
	     	add=0;
			if(k==1)
	     	add=2;	
		    if(k==2)		
		    add=4;
			if(k==3)
			{
				c=0;
				REG_A=0x20;
				REG_B=0x26;
			} 
   	   	}
    }	
   
}	 

void set_dao(uchar a,uchar b)
{
   	if(key==2)
	{
	 
	  dao_time[a]++;
	  if(dao_time[a]>59+b)
    dao_time[a]=59+b;
	} 
	if(key==3)
	{
	 
	  if(dao_time[a]>1)
	   dao_time[a]=dao_time[a]-1;
	  else
      dao_time[a]=0;
	}
}
void get_dao()
{
	uchar i,j,m,a;
	 REG_B=0x06;
		for(i=80;i>0;i--)
		{
		   	read_timebit(0);
			for(j=0;j<8;j++)
			{
				key=seat(Time[j],j,dao[j]);
				if(key==4)
			    k++;
				set_dao(a,0);
			}
			if(k==0)
			a=0;
			if(k==1)
			a=1;
			if(k==2)
			a=2;
			if(k==3)
			{	
				if((!dao_time[0])&&(!dao_time[1])&&(!dao_time[2]))
			    REG_B=0x06;
				else
			    REG_B=0x36;	
				v=0;
			}
			
		}
		for(i=80;i>0;i--)
		{
		   	read_timebit(0);
			for(m=0;m<8;m++)
		   {    
			switch(k)
			{
			    case 0 :if(m==0||m==1)
					   {
				    	  key=seat(Time[m],m,11);					     
					   }
					   else
					   key=seat(Time[m],m,dao[m]);break;
				case 1:if(m==3||m==4)
					   {
				    	  key=seat(Time[m],m,11);					     
					   }
					   else
					   key=seat(Time[m],m,dao[m]);break;	
				case 2:if(m==6||m==7)
					   {
					    	key=seat(Time[m],m,11);					     
						}
						else
						key=seat(Time[m],m,dao[m]);break;
				default:for(m=0;m<8;m++)
		                {
		   					key=seat(Time[m],m,dao[m]);
						}
					 	c=0;
						REG_A=0x20;
						if((!dao_time[0])&&(!dao_time[1])&&(!dao_time[2]))
						REG_B=0x06;
						else 
						REG_B=0x36;
						break;
			}
			if(key==4)
			k++;
			set_dao(a,0);
		  }
			if(k==0)
			a=0;
			if(k==1)
			a=1;
			if(k==2)
			a=2;
			if(k==3)
			{
				
				if((!dao_time[0])&&(!dao_time[1])&&(!dao_time[2]))
				REG_B=0x06;
				else
				REG_B=0x36;
			    v=0;
			}
			
		}

}
void main (void)
 {

	uchar i,add=2;
	   Time[2]= Time[5]=10;
	   dao[2]=dao[5]=10;
	   key_count=0;
	   TMOD=0X01;
	   TH0=0Xd4;
	   TL0=0XCC;
	   EA=1;
	   ET0=1;
	   EX0=1;
	   TR0=0;
		scs=0;//DS12887片选--0有效
       // DS12887_Set0();
		REG_A=0x20;
		REG_B=0x06;
		while(1)
		{
		  read_timebit(1);
		  for(i=0;i<8;i++)
		 {
		    key=seat(Time[i],i,dao[i]);
		 	if(key==1)
			{ 
		//	if(key_count==1)
		//{		
				k=0;
				c=1;
			//	}
		   	key_wait();		    
			}
			if(key==4)
			{
			 	k=0;
			    v=1;
			}
		 }
	     if(c==1)
	     change_0();
		 if(v==1)
		 get_dao();
		}		
 
		
}
void interrupt0(void) interrupt 0
{
	uchar a;
	if(dao_time[0]<=0)
	{  
	   dao_time[0]=60;
	   if(dao_time[1]<=0)
	   {
	   		dao_time[1]=60;
			dao_time[2]--;
			if(dao_time[2]<0)
			dao_time[2]=0;
	   }
	   dao_time[1]--;
	}
	dao_time[0]--;
	if((!dao_time[0])&&(!dao_time[1])&&(!dao_time[2]))
	{
	  dao_time[0]=0;
	  dao_time[1]=0;
	  dao_time[2]=0;
	  REG_B=0x0e;
	  REG_A=0x23;

	}	
	a= REG_C;
}
 void timer0(void) interrupt 1
 {
  uchar i;
 	  TH0=0Xd4;
	  TL0=0XCC;
	   for(i=0;i<8;i++)
		 {
		    key=seat(11,i,11);
	  	  }
	   	  for(i=0;i<8;i++)
		 {
		    key=seat(Time[i],i,dao[i]);
		}
 }

⌨️ 快捷键说明

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