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

📄 12887.c

📁 12887的c51。
💻 C
字号:
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define	uchar unsigned char
#define	uint unsigned int
#define	ulong unsigned long

#define	BYTEPERLINE	16
#define	ABSLINE		16
#define	FLAGADD		0x7f00		//0-8191


#define	ADDRAMHEAD	0x6000	//0x6000-7fff	P2.5		0110--0111
#define	DSHEAD		0x0		//DS12887   	P2.6		0000
#define	HEAD		0xaa

//DS12887
#define	SECONDS		0
#define	SECONDALARM	1
#define	MINUTES		2
#define	MINUTEALARM	3
#define	HOURS		4
#define	HOURALARM		5
#define	DAYOFWEEK		6
#define	DAYOFMONTH	7
#define	MONTH		8
#define	YEAR			9
#define	REGISTERA		10
#define	REGISTERB		11
#define	REGISTERC		12
#define	REGISTERD		13



#define	AORDER1	0x2f//0x20//0b00100000	//禁止SQW;启动DS12887
#define	BORDER1	0x82//0b10000010	//开始修改禁止计时;禁止所有功能;24MODE;BCD OUT。
#define	BORDER0	0x02//0x02//0b00000010	//结束修改。
sbit UnUsed0=P1^0;
sbit UnUsed1=P1^1;
sbit Unused6=P1^6;		
sbit Unused7=P1^7;



uchar	DSDATE[10]={0x00,0x00,0x30,0x30,0x17,0x17,0x03,0x01,0x09,0x04};
uchar	Date[8]={2,0,0,4,0,8,3,1};
uchar	Time[6]={1,5,3,1,0,0};

bit	DisPicture=0;

uchar code	 Num[]={
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*--  文字:  0  --*/								
0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*--  文字:  1  --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,/*--  文字:  2  --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*--  文字:  3  --*/
0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,/*--  文字:  4  --*/
0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*--  文字:  5  --*/
0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*--  文字:  6  --*/
0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,/*--  文字:  7  --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*--  文字:  8  --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00 /*--  文字:  9  --*/
};//
uchar   code  		MAINLIB[]={
//年[16*16]横排
0x8,0x0,0x8,0x8,0x1F,0xFC,0x11,0x0,
0x21,0x0,0x41,0x10,0x1F,0xF8,0x11,0x0,
0x11,0x0,0x11,0x4,0xFF,0xFE,0x1,0x0,
0x1,0x0,0x1,0x0,0x1,0x0,0x1,0x0,		//32

//月[16*16]横排
0x0,0x10,0xF,0xF8,0x8,0x10,0x8,0x10,
0x8,0x10,0xF,0xF0,0x8,0x10,0x8,0x10,
0x8,0x10,0xF,0xF0,0x8,0x10,0x8,0x10,
0x10,0x10,0x10,0x10,0x20,0x50,0x40,0x20,

//日[16*16]横排
0x0,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x1F,0xF0,0x10,0x10,0x0,0x0,
//;时[16*16]横排
0x00,0x08,0x04,0x08,0x7E,0x08,0x44,0x08,
0x47,0xFE,0x44,0x08,0x44,0x08,0x7C,0x88,
0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,
0x7C,0x08,0x44,0x48,0x00,0x28,0x00,0x10,

//;分[16*16]横排
0x00,0x80,0x04,0x80,0x04,0x40,0x08,0x40,
0x08,0x20,0x10,0x10,0x20,0x08,0x4F,0xEE,
0x84,0x24,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x20,0x08,0x20,0x11,0x40,0x20,0x80,

//;秒[16*16]横排
0x04,0x20,0x0E,0x20,0x78,0x20,0x08,0x20,
0x08,0xA8,0xFE,0xA6,0x08,0xA2,0x1D,0x20,
0x1A,0x24,0x28,0x24,0x28,0x28,0x48,0x10,
0x88,0x20,0x08,0x40,0x08,0x80,0x0B,0x00,



};



void	MakeTimeImage(uint,uchar);
void	MakeDateImage(uint,uchar);
void	Delay(uint);

void	WriteMode(uchar,uchar);
void	WriteTime(void);
void	ReadTime(void);
void	DSToDateTime(void);



void	DSToDateTime(void)
{
	//DSDATE[10]={	0x00,0x00,0x00,0x00,0x17,0x17,0x03,0x01,0x09,0x04};
				//sec     min       hour      week  date  month year
	//Date[8]={2,0,0,4,0,8,3,1};
	//Time[6]={1,5,3,1,0,0};
	uchar	i=0;
	
	Date[0]=2;
	Date[1]=0;
	Date[2]=(DSDATE[9])>>4;
	Date[3]=(DSDATE[9]&0x0f);
	Date[4]=(DSDATE[8])>>4;
	Date[5]=(DSDATE[8]&0x0f);
	Date[6]=(DSDATE[7])>>4;;
	Date[7]=(DSDATE[7]&0x0f);
	
	Time[0]=(DSDATE[4])>>4;
	Time[1]=(DSDATE[4]&0x0f);
	Time[2]=(DSDATE[2])>>4;
	Time[3]=(DSDATE[2]&0x0f);
	Time[4]=(DSDATE[0])>>4;
	Time[5]=(DSDATE[0]&0x0f);
	

}


void	WriteMode(uchar	AMode,uchar	BMode)
{
	XBYTE[DSHEAD+REGISTERA]=AMode;
	_nop_();
	
	_nop_();
	XBYTE[DSHEAD+REGISTERB]=BMode;
	_nop_();
	
	_nop_();
}
void	WriteTime(void)
{
	//DSDATE[10]={	0x00,0x00,0x00,0x00,0x17,0x17,0x03,0x01,0x09,0x04};
				//sec     min       hour      week  date  month year
	XBYTE[DSHEAD]=DSDATE[0];
	XBYTE[DSHEAD+1]=DSDATE[1];
	XBYTE[DSHEAD+2]=DSDATE[2];
	XBYTE[DSHEAD+3]=DSDATE[3];
	XBYTE[DSHEAD+4]=DSDATE[4];
	XBYTE[DSHEAD+5]=DSDATE[5];
	XBYTE[DSHEAD+6]=DSDATE[6];
	XBYTE[DSHEAD+7]=DSDATE[7];
	XBYTE[DSHEAD+8]=DSDATE[8];
	XBYTE[DSHEAD+9]=DSDATE[9];

}
void	ReadTime(void)
{	DSDATE[0]=XBYTE[DSHEAD];
	DSDATE[1]=XBYTE[DSHEAD+1];
	DSDATE[2]=XBYTE[DSHEAD+2];
	DSDATE[3]=XBYTE[DSHEAD+3];
	DSDATE[4]=XBYTE[DSHEAD+4];
	DSDATE[5]=XBYTE[DSHEAD+5];
	DSDATE[6]=XBYTE[DSHEAD+6];
	DSDATE[7]=XBYTE[DSHEAD+7];
	DSDATE[8]=XBYTE[DSHEAD+8];
	DSDATE[9]=XBYTE[DSHEAD+9];
}
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
void Delay(uint DelayTime)
{     
	uchar i;
	while (DelayTime!=0)
   	{
    		DelayTime--;//
      	for(i=0;i<111;i++){}          
	}	    	
}
///(111+2)*DelayTime	110次:(0.1mS 11.0592MHz/0.05mS 22.1184MHz)

void	DeliverPerLine(uchar	DelayTime)

{
	uchar	Time;
	for(;Time<DelayTime;Time++){}      
}


void MCReceive() interrupt 4 using 3
{
	uint T_Addr=ADDRAMHEAD+2*ABSLINE*BYTEPERLINE;
	uchar i,j;
	uchar Buffer[10];//
	Res=OUTUNABLE;
	
	ES=0;
	RI=0;  
	if(SBUF!=HEAD)
	return;
	
	WriteMode(AORDER1,BORDER1);
	Delay(10);
	
	
	for(i=0;i<10;i++)
	{
		while(RI==0){}
		RI=0;
		Buffer[i]=SBUF;
	}
//Buffer[0]:表示当前年  00-99
//Buffer[1]:表示当前月  1-12
//Buffer[2]:表示当前日  1-31
//Buffer[3]:表示当前时  0-23
//Buffer[4]:表示当前分  0-59
//Buffer[5]:表示当前秒  0-59
//Buffer[6]:表示星期日  1-7
//Buffer[7]:
//Buffer[8]:
//Buffer[9]:
	if(Buffer[0]==0xf0)
	{
		DSDATE[0]+=5;
		for(j=0;j<ABSLINE;j++)
		for(i=0;i<BYTEPERLINE;i++)
		{
			while(RI==0){}
			RI=0;
			XBYTE[T_Addr++]=SBUF;
		}
		DisPicture=1;
	}
		
	
		
	
	else if((Buffer[0]>99)||(Buffer[1]>12)||(Buffer[2]>31)||(Buffer[3]>23)||(Buffer[4]>59)||(Buffer[5]>59)||(Buffer[6]>7))
	{
		DSDATE[0]+=3;
		
		
	}
	else
	{
		//DSDATE[10]={	0x00,0x00,0x00,0x00,0x17,0x17,0x03,0x01,0x09,0x04};
				//sec     min       hour      week  date  month year
	
		DSDATE[0]=(((Buffer[5])/10)<<4)+((Buffer[5])%10);
		DSDATE[1]=(((Buffer[5])/10)<<4)+((Buffer[5])%10);
		DSDATE[2]=(((Buffer[4])/10)<<4)+((Buffer[4])%10);
		DSDATE[3]=(((Buffer[4])/10)<<4)+((Buffer[4])%10);
		DSDATE[4]=(((Buffer[3])/10)<<4)+((Buffer[3])%10);
		DSDATE[5]=(((Buffer[3])/10)<<4)+((Buffer[3])%10);
		DSDATE[6]=(((Buffer[6])/10)<<4)+((Buffer[6])%10);
		DSDATE[7]=(((Buffer[2])/10)<<4)+((Buffer[2])%10);
		DSDATE[8]=(((Buffer[1])/10)<<4)+((Buffer[1])%10);
		DSDATE[9]=(((Buffer[0])/10)<<4)+((Buffer[0])%10);
		
	}
	WriteTime();
	WriteMode(AORDER1,BORDER0);
	Delay(10);
	return;
}
	
	
	






void	MakeDateImage(uint	TargetAddr,uchar	LineNum)
{
	uint	TargetAdd=TargetAddr+LineNum*BYTEPERLINE;
	uchar	i=LineNum,j;
		
	for(j=0;j<BYTEPERLINE;j++)	
	{
		switch(j)
		{
			case	0:
					XBYTE[TargetAdd++]=0;
					break;
			case	1:
			case	2:
			case	3:
			case	4:
					XBYTE[TargetAdd++]=Num[16*Date[j-1]+i];//0123
					break;
					
			case	5:	XBYTE[TargetAdd++]=MAINLIB[(i*2)];//年
					break;
			case	6:	XBYTE[TargetAdd++]=MAINLIB[(i*2)+1];//年
					break;
			case	7:
			case	8:
					XBYTE[TargetAdd++]=Num[16*Date[j-3]+i];//45
					break;
			case	9:	XBYTE[TargetAdd++]=MAINLIB[32+(i*2)];//月
					break;
			case	10:	XBYTE[TargetAdd++]=MAINLIB[32+(i*2)+1];//月
					break;	
				
			case	11:
			case	12:
					XBYTE[TargetAdd++]=Num[16*Date[j-5]+i];//67
					break;
			case	13:	XBYTE[TargetAdd++]=MAINLIB[64+(i*2)];//日
					break;
			case	14:	XBYTE[TargetAdd++]=MAINLIB[64+(i*2)+1];//日
					break;	
						
			case	15:
					XBYTE[TargetAdd++]=0;
					break;		
			default	:	break;
				
		}
		
		
	}
}




void	MakeTimeImage(uint	TargetAddr,uchar	LineNum)
{
	uchar	i=LineNum,j;
	uint	TargetAdd=TargetAddr+LineNum*BYTEPERLINE;
	
		for(j=0;j<BYTEPERLINE;j++)	
		{
			switch(j)
			{
				case	0:
				case	1:
						XBYTE[TargetAdd++]=0;
						break;
				
				case	2:
				case	3:					
						XBYTE[TargetAdd++]=Num[16*Time[j-2]+i];	//01
						break;
				case	4:	XBYTE[TargetAdd++]=MAINLIB[96+(i*2)];//时
						break;	
				case	5:	XBYTE[TargetAdd++]=MAINLIB[96+(i*2)+1];//时
						break;
				case	6:	
				case	7:	XBYTE[TargetAdd++]=Num[16*Time[j-4]+i];//23
						break;
				case	8:	XBYTE[TargetAdd++]=MAINLIB[128+(i*2)];//分
						break;
						
				case	9:	XBYTE[TargetAdd++]=MAINLIB[128+(i*2)+1];//分
						break;
				case	10:		
					
				case	11:	XBYTE[TargetAdd++]=Num[16*Time[j-6]+i];//45
						break;
				case	12:	XBYTE[TargetAdd++]=MAINLIB[160+(i*2)];//秒
						break;
						
				case	13:	XBYTE[TargetAdd++]=MAINLIB[160+(i*2)+1];//秒
						break;
				case	14:		
							
				case	15:
						XBYTE[TargetAdd++]=0;
						break;		
				default:	break;
					
			}
			
			
		}


}


void main(void)
{
	uchar	i;
	uchar	TotalPage,CurPage,CurLine;
	uint	TargetAddr,DelayPerPage,TimePerLine,TargetAddrOff=0,TimeCounter=0;

	uint	DisTimes=0;
	WriteMode(AORDER1,BORDER0);

	TH1=0xfe;
	TL1=0xfe;
	PCON=0x80;
	TMOD=0x21;
	TR1=1;       /////Enable Counter
	SCON=0x70;   /////Enable Receive    8 Bit UART variable Bode Rate
	PS=1;        /////Serial IP High
	ES=1;
	EA=1;    
	
	
		
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//
	Delay(400);//



	

	//根据串口来的图像数编排:新图像总数,读取时间到图像RAM,帧间延时
	TotalPage=1;
	TargetAddr=ADDRAMHEAD;
	//WriteMode(AORDER1,BORDER0);
	ReadTime();
	DSToDateTime();
	for(CurLine=0;CurLine<ABSLINE;CurLine++)
	MakeTimeImage(ADDRAMHEAD,CurLine);
	for(CurLine=0;CurLine<ABSLINE;CurLine++)
	MakeDateImage(ADDRAMHEAD+ABSLINE*BYTEPERLINE,CurLine);
	
}

⌨️ 快捷键说明

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